2015-11-03 15 views
5

私は2つの画像を比較するために、いくつかのPythonコードを持って:ときk=1knnMatchは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()にのみ機能します。 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 = TrueBFMatcherを構成することによって引き起こされます。 k > 1の場合は、crossCheck = False(コンストラクターの既定値)を設定します。 docsから

crossCheck==true場合、k=1knnMatch()方法はペアのみにi-thクエリ記述子のために正規表現エンジンのコレクションでj-th記述子はすなわち、最も近いとその逆であることを(i,j)などを返します。 BFMatcherは一貫性のあるペアのみを返します。このような技法は、通常、十分なマッチがある場合にアウトライア数を最小限にして最良の結果をもたらす。これは、SIFT論文のD. Loweによって使用される比率テストの代替方法です。

関連する問題