2015-11-03 92 views
5

我有一些Python代码来比较两个图像:knnMatch不具有K =工作1

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) 

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

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 

回答

7

的错误是由crossCheck = True配置BFMatcher引起的。对于k > 1,请设置crossCheck = False(构造函数默认值)。

docs

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