特征匹配的方法Python Opencv

时间:2018-11-10 14:11:20

标签: python opencv

我想确定一张较大图片上的纸牌价值,例如,具有模板图片。 documentation of the Java compiler enter image description here

下面我的代码采用ORB_create方式。

img1 = cv2.imread('templates/j.png',0)
img2 = cv2.imread('templates/large j.png',0)
orb = cv2.ORB_create(edgeThreshold=8, patchSize=31, nlevels=8, 
fastThreshold=20, scaleFactor=1.4, 
WTA_K=2,scoreType=cv2.ORB_HARRIS_SCORE,
firstLevel=0, nfeatures=5000)

kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)

bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

matches = bf.match(des1,des2)
matches= sorted(matches, key=lambda x:x.distance)
print(len(matches))


img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:10],None, flags=2)
cv2.imshow('s',img3)
cv2.waitKey(0)

这里输出。

enter image description here enter image description here

在第一种情况下edgeThreshold = 8,在第二种edgeThreshold = 12。如您所见,标志不正确!他们比较图片上的白色区域,而不是“ J”。如果我尝试将“ 9”或“ 7”与“ J”进行比较-结果也是错误的。 (不应该有匹配项,而是匹配项)。也许问题在于参数?我更改了“ edgeThreshold”,“ scaleFactor”和“ nfeatures”-毫无意义。

那甚至是照片的一个很好的例子,它们可能有角度或前景不佳。

此外,我尝试了AKAZE_create-根本没有匹配项,为零。

    detector = cv2.AKAZE_create()
    (kps1, descs1) = detector.detectAndCompute(im1, None)
    (kps2, descs2) = detector.detectAndCompute(im2, None)

    #print("keypoints: {}, descriptors: {}".format(len(kps1), descs1.shape))
    #print("keypoints: {}, descriptors: {}".format(len(kps2), descs2.shape))

    bf = cv2.BFMatcher(cv2.NORM_MINMAX)
    matches = bf.knnMatch(descs1,descs2, k=2)    # typo fixed
    print(len(matches))

0 个答案:

没有答案