图像显示:
结果:(形状1,形状2,score越小越好)
(13, 24, 0.1109103067998316)
(9, 47, 0.1769241224944469)
(18, 24, 0.27188137655098166)
(13, 18, 0.35624943053070696)
(9, 18, 0.6607230565949986)
(18, 47, 0.8184928721110161)
(9, 24, 0.9169825577167753)
(9, 13, 1.0169724871257055)
(24, 47, 1.0579543760314698)
(13, 47, 1.1195724771408537)
(9, 27, 1.4154498584444144)
(27, 47, 1.8036395323986536)
(24, 27, 2.33243241616119)
(13, 27, 2.43242234557012)
(18, 27, 2.534542706378273)
import cv2 as cv import numpy as np def measure_object(image): #转二值图像 gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY) # ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU) #转二值图像 binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY_INV|cv.THRESH_BINARY, 25, 4) out_image,contours,hierarchy=cv.findContours(binary,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE) single_channel_color=cv.cvtColor(binary,cv.COLOR_GRAY2BGR) #彩色灰度图 # cv.imshow('single_channel_color', single_channel_color) #找到面积最大的前6个contour的id area_sort=[] for i ,contour in enumerate(contours): area=cv.contourArea(contour) area_sort.append((i,area)) area_sort.sort(key=lambda x: x[1]) area_sort.reverse() area_sort=area_sort[:6] area_sort.sort(key=lambda x: x[0]) id=[] for i in range(len(area_sort)): # print(area_sort[i]) id.append(area_sort[i][0]) for i ,contour in enumerate(contours): if i in id: x,y,w,h=cv.boundingRect(contour) #计算moments momemts=cv.moments(contour) cx=momemts['m10']/momemts['m00'] cy=momemts['m01']/momemts['m00'] cv.putText(single_channel_color,str(i),(np.int(cx),np.int(cy)),cv.FONT_HERSHEY_SIMPLEX,fontScale=0.5,color=(0,0,255),thickness=2) # cv.circle(single_channel_color,(np.int(cx),np.int(cy)),2,(255,0,255),2) cv.rectangle(single_channel_color,(x,y),(x+w,y+h),(0,0,255)) approximate_curve=cv.approxPolyDP(contour,epsilon=4,closed=True) cv.drawContours(single_channel_color,contours,i,(255,255,0),2) cv.imshow('2_find_contour', single_channel_color) #计算Hu矩 res=[] for i ,contour_i in enumerate(contours): if i in id: for j, contour_j in enumerate(contours): if j in id and j!=i: result=cv.matchShapes(contour_i,contour_j,1,0.0) res.append((i,j,result)) #显示结果 res.sort(key=lambda x:x[2]) for n,r in enumerate(res): if n%2==0: print(r) src = cv.imread(r"C:\Users\xunbao\Desktop\captcha\5.jpg") cv.imshow("1_ori_img", src) measure_object(src) cv.waitKey(0) cv.destroyAllWindows()