OpenCV Python: нет функции drawMatchesknn

Когда я пытался использовать функцию drawMatchesKnn, как указано в этом руководстве для сопоставления функций FLANN я получаю следующую ошибку

AttributeError: объект «модуль» не имеет атрибута «drawMatchesKnn»

Я проверил с другими ресурсами, что метод drawMatchesKnn присутствует в opencv.

Почему я получаю эту ошибку?

заранее спасибо


person rohangulati    schedule 24.11.2013    source источник
comment
Версия OpenCV: 2.4.7   -  person rohangulati    schedule 24.11.2013
comment
Используйте opencv версии 3.x. Сборка из исходников в основной ветке   -  person Abid Rahman K    schedule 24.11.2013
comment
IMP - This tutorial is meant for OpenCV 3x version. Not OpenCV 2x, ясно написано на странице README. Вы этого не читали?   -  person bad_keypoints    schedule 14.04.2015
comment
@bad_keypoints на самом деле учебники не работают в 2x или 3x. Учебники заполнены такими вызовами, как этот cv2.SIFT(), которых нет в 3x (нужно скомпилировать с помощью contrilbs и вызвать как cv2.xfeatures2d.SIFT_create(), поэтому туториалы представляют собой просто беспорядок из старого и нового, и немногие действительно работают без изменений.   -  person tiagosilva    schedule 11.02.2016


Ответы (3)


Функции cv2.drawMatches и cv2.drawMatchesKnn недоступны в более новых версиях OpenCV 2.4. @rayryeng предоставил облегченную альтернативу, которая работает как есть для вывода DescriptorMatcher.match. Отличие от DescriptorMatcher.knnMatch в том, что совпадения возвращаются в виде списка списков. Чтобы использовать альтернативу @rayryeng, совпадения должны быть извлечены в одномерный список.

Например, Грубое сопоставление с дескрипторами SIFT и тестом отношения может быть изменено следующим образом:

# BFMatcher with default params
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)

# Apply ratio test
good = []
for m,n in matches:
    if m.distance < 0.75*n.distance:
       # Removed the brackets around m 
       good.append(m)

# Invoke @rayryeng's drawMatches alternative, note it requires grayscale images
gray1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
drawMatches(gray1,kp1,gray2,kp2,good)
person ryanmeasel    schedule 24.02.2016
comment
Просто хотел сказать спасибо за это. Я добавил это в свой исходный пост, чтобы сделать его полным, и я связал вас в своем ответе. - person rayryeng; 04.12.2016

Вам необходимо использовать OpenCV версии 3. drawMatchesKnn() присутствует в 3.0.0-альфа, но не в 2.4.11

Эта ошибка есть, потому что вы используете старую версию OpenCV.

person mirosval    schedule 19.04.2015

Вместо good.append(m) попробуйте good.append([m])

person user15510226    schedule 30.03.2021