TypeError: Требуемый аргумент 'outImg' (поз. 6) не найден
Когда я запускаю свой код python
import numpy as np
import cv2
import matplotlib.pyplot as plt
img1 = cv2.imread('/home/shar/home.jpg',0) # queryImage
img2 = cv2.imread('/home/shar/home2.jpg',0) # trainImage
# Initiate SIFT detector
sift = cv2.xfeatures2d.SIFT_create()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
# 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:
good.append([m])
# cv2.drawMatchesKnn expects list of lists as matches.
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2)
plt.imshow(img3),plt.show()
Из этой строки
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2)
Я получаю эту ошибку
TypeError: Required argument 'outImg' (pos 6) not found
Я использую python3 и opencv3
Ответы
Ответ 1
Вы, кажется, следуете этой странице руководства (на основе кода, который вы указали в этом и двух связанных с ним вопросах 1, 2).
Документация по функциям (хотя я отмечаю, что она по-прежнему помечена как "бета" ) и подразумевает, что outImg
является необязательным. Однако сообщение об ошибке python является явным - в позиции 6 требуется аргумент, он называется outImg
в сигнатуре функции. Я подозреваю, что документация может не соответствовать требованиям кода. Он показывает, что подпись кода С++, которую вызывает вызов python, не имеет значения по умолчанию для outImg
, поэтому необходимо предоставить этот аргумент.
Обратите внимание, что вы можете проверить строку doc для фактической привязки в интерпретаторе python3 (если она существует), посмотрев на <function_name>.__doc__
. В этом случае вы можете видеть, что outImg
не отображается как необязательный. Вот результат моей установки:
>>> cv2.drawMatchesKnn.__doc__
'drawMatchesKnn(img1, keypoints1, img2, keypoints2, matches1to2, outImg[, matchC
olor[, singlePointColor[, matchesMask[, flags]]]]) -> outImg'
Решение (примечание - проверено на установке Windows, а не на Linux)
Вы можете отметить последний пример в этом учебнике, в котором используется следующий код - переход в None
вместо outImg
, Я думаю, что это будет работать и на ваш случай.
draw_params = dict(matchColor = (0,255,0),
singlePointColor = (255,0,0),
matchesMask = matchesMask,
flags = 0)
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params)
Вам не нужно передавать все draw_params
dict, вы можете попробовать просто передать flags
i.e.
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,flags=2)
Я проверил это при новой установке OpenCV 3 (хотя и в Windows, используя предварительно построенный двоичный файл)
Ответ 2
Хорошо, ребята, я слишком новичок и многому научился после нескольких часов исследований онлайн. Кажется, это ошибка BUG на ошибке, известная как Ошибка (-255) NumpyAllocator. Многие сайты предложит вам открыть файл cv2.cpp и комментарий вне кода линии 163, мое предложение заключается в том, что вы используете OpenCV 3.1 для загрузки в OpenCV 3.0.0
ошибка, кажется, в OpenCV 3.1, в дополнение к этому, код для использования алгоритма ORB, который документирован на OpenCV.org, немного устарел
где говорится
enter code here
# Инициировать детектор ORB
enter code here
orb = cv2.ORB() # note, вы получите сообщение об ошибке, так как теперь enter code here
изменить на:
enter code here
orb = cv2.ORB_create()
Вот мой пример кода с использованием OpenCV 3.0.0 в Windows 10:
# Example of Brute Force matching base on ORB Algorithm
#Modify Author : Waheed Rafiq R&D student Birmingham City University UK
#Original author : OpenCV.org
#Date Updated : 21/04/2016 : 13:45
import numpy as np
import cv2
from matplotlib import pyplot as plt
img1 = cv2.imread('wr-pb.jpg',0) # queryImage
img2 = cv2.imread('Waheed.jpg',0) # trainImage
# Initiate ORB detector
orb = cv2.ORB_create()
# find the keypoints and descriptors with ORB
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)
# create BFMatcher object
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# Match descriptors.
matches = bf.match(des1,des2)
# Sort them in the order of their distance.
matches = sorted(matches, key = lambda x:x.distance)
# Draw first 10 matches.
img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches ,None, flags=2)
plt.imshow(img3),plt.show()
Я надеюсь, что это поможет, я люблю стек. Поток его лучший ресурс в Интернете.