2012-09-20 23 views
10

Chcę dopasować dwa obrazy za pomocą Python + OpenCV. Użyłem SURF, aby wyodrębnić punkty kluczowe i deskryptory z obu. Teraz muszę dopasować te deskryptory iz tego powodu zdecydowałem się użyć Flann Matcher.Błąd przy użyciu knnMatch z OpenCV + Python

flann_params = dict(algorithm = FLANN_INDEX_KDTREE,trees = 4)  
matcher = cv2.FlannBasedMatcher(flann_params, {}) 

Ale gdy próbuję użyć knnMatch z deskryptorów (desc1, desc2) OpenCV zgłasza wyjątek.

raw_matches=matcher.knnMatch(np.asarray(desc1),np.asarray(desc2), 2) 

Wyjątkiem jest następujący:

raw_matches=matcher.knnMatch(np.asarray(desc1),np.asarray(desc2), 2) #2 
cv2.error: /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/OpenCV-2.4.2/modules/flann/src/miniflann.cpp:299: error: (-210) type=6 
in function buildIndex_ 

Jak mogłem używać knnMatch prawidłowo? Czy to jest błąd?

Odpowiedz

10

, że rozwiązać ten problem za pomocą właściwego typu z np.asarray funkcyjnych()

raw_matches=matcher.knnMatch(np.asarray(desc1,np.float32),np.asarray(desc2,np.float32), 2) #2 
+0

Błąd zniknął, ale nie można znaleźć niczego. –

0

Zobacz odpowiedź na this question.

Oto odpowiedni kod z Esteban Angee „s odpowiedź:

r_threshold = 0.6 
FLANN_INDEX_KDTREE = 1 # bug: flann enums are missing 

Construct słownika parametry:

flann_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 4) 
flann = cv2.flann_Index(desc2, flann_params) 

Rozpocznij wyszukiwanie najbliżsi sąsiedzi:

idx2, dist = flann.knnSearch(desc1, 2, params = {}) # bug: need to provide empty dict 
mask = dist[:,0]/dist[:,1] < r_threshold 
idx1 = np.arange(len(desc1)) 
pairs = np.int32(zip(idx1, idx2[:,0])) 

Zwraca deskryptory pasujące:

return pairs[mask] 

Nie jestem teraz na mojej stacji roboczej, więc obawiam się, że nie mogę sprawdzić, co jest nie tak z twoim kodem, ale powyższe pytanie rozwiązało wszystkie moje problemy, gdy miałem ten sam problem. Nie musisz używać FlannBasedMatcher, pamiętam, że też miałem z tym problemy.

Jeśli to nie pomoże, zobaczę, czy uda mi się znaleźć rozwiązanie jutro.

+0

, że mają ten sam błąd, ale w tym przypadku za pomocą idx2 = cv2.flann_Index() idx2.build (np. asarray (desc2), flann_params) cv2.error: /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/OpenCV-2.4.2/modules/flann/src/miniflann.cpp:299 : error: (-210) type = 6 w funkcji buildIndex_ – Sergio

+0

Czy próbowałeś kodu, który napisałem w mojej odpowiedzi? To zadziałało dla mnie. Obawiam się, że nie rozumiem twojego komentarza? – casper

+0

Tak, używam OpenCV-2.4.2. Kiedy wypróbowałem twój kod cv2.flann_Index (desc2, flann_params) wyrzuciłem wyjątek o żadnym module. Przeczytałem, że musisz zakodować następujące funkcje: idx2 = cv2.flann_Index() idx2.build (np.asarray (desc2), flann_params) – Sergio

Powiązane problemy