2015-11-03 8 views
5

मैं दो चित्रों की तुलना करने के लिए कुछ अजगर कोड है:knnMatch कश्मीर के साथ काम नहीं करता है = 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=1k1 तुलना में एक अलग महत्व है, तो निम्न त्रुटि दी है:

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, तो k=1 साथ knnMatch() विधि केवल जोड़े वापस आ जाएगी (i,j) ऐसे i-th क्वेरी वर्णनकर्ता के लिए मेल खाने के संग्रह में j-th वर्णनकर्ता, निकटतम और इसके विपरीत है कि यानी BFMatcher केवल लगातार जोड़े लौटाएगा। पर्याप्त तकनीक होने पर ऐसी तकनीक आमतौर पर कम से कम आउटलाइजर्स के साथ सर्वोत्तम परिणाम उत्पन्न करती है। यह अनुपात परीक्षण का विकल्प है, जिसका उपयोग एसआईएफटी पेपर में डी लोवे द्वारा किया जाता है।

संबंधित मुद्दे