python +opencv 利用Hu 矩对抖音验证码进行相似度计算


 

图像显示: 

 

结果:(形状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()

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM