2015-11-03 87 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論文中使用的比率測試的替代方法。