61 lines
2.1 KiB
Python
61 lines
2.1 KiB
Python
import cv2
|
|
import numpy as np
|
|
'''
|
|
两个区域间最短距离
|
|
https://www.lmlphp.com/user/154997/article/item/3778387/
|
|
'''
|
|
|
|
def contours(layer):
|
|
gray = cv2.cvtColor(layer, cv2.COLOR_BGR2GRAY)
|
|
ret,binary = cv2.threshold(gray, 1,255,cv2.THRESH_BINARY)
|
|
contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
|
|
#drawn = cv2.drawContours(image,contours,-1,(150,150,150),3)
|
|
return contours #, drawn
|
|
|
|
def minDistance(contour, contourOther):
|
|
distanceMin = 99999999
|
|
for xA, yA in contour[0]:
|
|
for xB, yB in contourOther[0]:
|
|
distance = ((xB-xA)**2+(yB-yA)**2)**(1/2) # distance formula
|
|
if (distance < distanceMin):
|
|
distanceMin = distance
|
|
return distanceMin
|
|
|
|
def cntDistanceCompare(contoursA, contoursB):
|
|
cumMinDistList = []
|
|
for contourA in contoursA:
|
|
indMinDistList = []
|
|
for contourB in contoursB:
|
|
minDist = minDistance(contourA,contourB)
|
|
indMinDistList.append(minDist)
|
|
cumMinDistList.append(indMinDistList)
|
|
l = cumMinDistList
|
|
return sum(l)/len(l) #returns mean distance
|
|
|
|
def maskBuilder(bgr,hl,hh,sl,sh,vl,vh):
|
|
hsv = cv2.cvtColor(bgr, cv2.COLOR_BGR2HSV)
|
|
lower_bound = np.array([hl,sl,vl],dtype=np.uint8)
|
|
upper_bound = np.array([hh,sh,vh],dtype=np.uint8)
|
|
return cv2.inRange(hsv, lower_bound,upper_bound)
|
|
|
|
def getContourCenters(contourData):
|
|
contourCoordinates = []
|
|
for contour in contourData:
|
|
moments = cv2.moments(contour)
|
|
contourX = int(moments['m10'] / float(moments['m00']))
|
|
contourY = int(moments['m01'] / float(moments['m00']))
|
|
contourCoordinates += [[contourX, contourY]]
|
|
return contourCoordinates
|
|
|
|
img = cv2.imread('demo/73.png')
|
|
maskA=maskBuilder(img, 150,185, 40,220, 65,240)
|
|
maskB=maskBuilder(img, 3,20, 50,180, 20,250)
|
|
layerA = cv2.bitwise_and(img, img, mask = maskA)
|
|
layerB = cv2.bitwise_and(img, img, mask = maskB)
|
|
contoursA = contours(layerA)
|
|
contoursB = contours(layerB)
|
|
|
|
print(getContourCenters(contoursA))
|
|
print(getContourCenters(contoursB))
|
|
|
|
#print cntDistanceCompare(contoursA, contoursB) |