在PythonOpenCV使用URF进行特征点检测,然后使用下面代码进行特征点匹配出现错误。
bf = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True)
matches = bf.match(ds1, ds2)
error: OpenCV(3.4.2) C:\projects\opencv-python\opencv\modules\core\src\batch_distance.cpp:245: error: (-215:Assertion failed) (type == 0 && dtype == 4) || dtype == 5 in function 'cv::batchDistance'
问题原因:
特征点描述子数据格式出现问题,请看下面函数对不同特征点检测算法使用的数据格式
首先是cv2.BFMatcher(normType, corssCheck)函数。它有两个参数。
第一个参数是用来指定要使用的距离测试类型。默认值为 cv2.Norm_L2。这很适合 SIFT 和 SURF 等(cv2.NORM_L1 也可以)。对于使用二进制描述符的 ORB,BRIEF,BRISK算法等,要使用cv2.NORM_HAMMING,这样就会返回两个测试对象之间的汉明距离。
第二个参数是布尔变量 crossCheck,默认值为 False。如果设置为True,匹配条件就会更加严格,只有到 A 中的第 i 个特征点与 B 中的第 j 个特征点距离最近,并且 B 中的第 j 个特征点到 A 中的第 i 个特征点也是最近(A 中没有其他点到 j 的距离更近)时才会返回最佳匹配(i,j)。也就是这两个特征点要互相匹配才行。
下面为正确代码:
bf = cv.BFMatcher(cv.NORM_L1, crossCheck=True)
matches = bf.match(ds1, ds2)
matches = sorted(matches, key=lambda x:x.distance)
img2 = cv.drawMatches(leftgray, kp1, rightgray, kp2, matches[:50],None,flags = 2)