Frage knnMatch funktioniert nicht mit K! = 1


Ich habe etwas Python-Code, um zwei Bilder zu vergleichen:

 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)

Aber detector_DescriptorMatcher.knnMatch() funktioniert nur wenn k=1. Ob k hat einen anderen Wert als 1Der folgende Fehler wird zurückgegeben:

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

5
2017-11-03 10:55


Ursprung


Antworten:


Der Fehler wird durch Konfigurieren verursacht BFMatcher mit crossCheck = True. Zum k > 1, einstellen crossCheck = False (Konstruktor Standard).

Von dem Dokumente:

Ob crossCheck==true, dann ist die knnMatch() Methode mit k=1 gibt nur Paare zurück (i,j) so dass für i-th Abfragedeskriptor der j-th Der Deskriptor in der Matcher-Sammlung ist der nächste und umgekehrt, d.h. BFMatcher gibt nur konsistente Paare zurück. Eine solche Technik erzeugt normalerweise die besten Ergebnisse mit einer minimalen Anzahl von Ausreißern, wenn genügend Übereinstimmungen vorhanden sind. Dies ist eine Alternative zu dem von D. Lowe in SIFT-Papier verwendeten Verhältnistest.


7
2018-02-24 19:53