knnMatch不适用于K!= 1

Rui*_*ins 5 python opencv

我有一些python代码来比较两个图像:

 detector_FeatureDetector_1 = cv2.FastFeatureDetector_create()
 detector_FeatureDetector_2 = cv2.FastFeatureDetector_create()   
 detector_DescriptorExtractor_1 = cv2.BRISK_create()
 detector_DescriptorExtractor_2 = cv2.BRISK_create()
 detector_DescriptorMatcher_1 = cv2.BFMatcher(cv2.NORM_HAMMING2, crossCheck = True)
 detector_DescriptorMatcher_2 = cv2.BFMatcher(cv2.NORM_HAMMING2, crossCheck = True)
 image_1 = cv2.imread('/Users/rui/image1.png')
 image_2 = cv2.imread('/Users/rui/image2.png')
 obj_descriptor_keypoints_1 = detector_FeatureDetector.detect(image_1)
 obj_descriptor_keypoints_2 = detector_FeatureDetector.detect(image_2)
 keypoints1, obj_descriptor_descriptors_1 = detector_DescriptorExtractor.compute(image_1, obj_descriptor_keypoints_1)
 keypoints2, obj_descriptor_descriptors_2 = detector_DescriptorExtractor.compute(image_2, obj_descriptor_keypoints_2)
 matches = detector_DescriptorMatcher.knnMatch(obj_descriptor_descriptors_1, obj_descriptor_descriptors_2, k=6)
Run Code Online (Sandbox Code Playgroud)

detector_DescriptorMatcher.knnMatch()只能当k=1.如果k值不同1,则返回以下错误:

OpenCV Error: Assertion failed (K == 1 && update == 0 && mask.empty()) in batchDistance, file /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/opencv-3.0.0/modules/core/src/stat.cpp, line 3682

Traceback (most recent call last):
  File "/Users/rui/main.py", line 191, in <module>

matches = detector_DescriptorMatcher.knnMatch(obj_descriptor_descriptors, obj_descriptor_descriptors_movie_frame, k=6)

cv2.error: /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/opencv-3.0.0/modules/core/src/stat.cpp:3682: error: (-215) K == 1 && update == 0 && mask.empty() in function batchDistance
Run Code Online (Sandbox Code Playgroud)

小智 7

该错误是由配置引起的BFMatchercrossCheck = True.对于k > 1,set crossCheck = False(构造函数默认值).

来自文档:

如果crossCheck==true,那么knnMatch()带有的方法k=1只返回对(i,j),对于i-th查询描述j-th符,匹配器集合中的描述符是最接近的,反之亦然,即BFMatcher只返回一致对.当有足够的匹配时,这种技术通常产生最佳结果,并且具有最少数量的异常值.这是D. Lowe在SIFT论文中使用的比率测试的替代方案.