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)