我想确定一张较大图片上的纸牌价值,例如,具有模板图片。 documentation of the Java compiler
下面我的代码采用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)
这里输出。
在第一种情况下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))