TypeError: argument requis "outImg" (pos 6) non trouvé
quand j'exécute mon code 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()
de cette ligne
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2)
, j'obtiens cette erreur
TypeError: Required argument 'outImg' (pos 6) not found
j'utilise python3 et opencv3
4 réponses
vous semblez être suite à ce tutoriel page (basé sur le code que vous avez montré dans ce et vos deux questions liées 1 , 2 ).
la documentation de la fonction est ici (bien que je note qu'elle est encore étiquetée "beta") et implique que outImg
est facultatif. Cependant, le message d'erreur python est explicite - un argument est requis en position 6, il est nommé outImg
dans la fonction signature. Je soupçonne que la documentation ne correspond pas exactement aux exigences du code. apparaît que la signature de la code C++ que le binding python de l'appelant n'a pas de valeur par défaut pour outImg
, donc le besoin de cet argument pour être livré.
notez que vous pouvez inspecter la chaîne doc pour la liaison réelle dans l'interpréteur python3 (si elle existe) en regardant <function_name>.__doc__
. Dans ce cas, vous pouvez voir que outImg
est pas " optionnel. Voici la sortie de mon installation:
>>> cv2.drawMatchesKnn.__doc__
'drawMatchesKnn(img1, keypoints1, img2, keypoints2, matches1to2, outImg[, matchC
olor[, singlePointColor[, matchesMask[, flags]]]]) -> outImg'
Solution (note vérifié sur une installation de windows, pas de Linux)
vous pouvez noter le dernier exemple sur ce tutoriel , qui utilise le code suivant - passant dans None
à la place de outImg
. Je pense que ça marchera aussi pour votre affaire.
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)
vous n'avez pas besoin de passer tous les draw_params
dict, vous pourriez essayer de passer juste flags
i.e.
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,flags=2)
j'ai vérifié cela sur une nouvelle installation D'OpenCV 3 (bien que sur Windows, en utilisant un binaire prébuilt)
OK les gars , je suis trop un internaute novice et apprendre beaucoup après des heures de recherche en ligne il semble être un BUG sur une erreur savoir comme erreur (-255) NumpyAllocator, beaucoup de site vous suggérera d'ouvrir cv2.fichier cpp et commentez la ligne 163 code , ma suggestion est que si vous êtes en utilisant OpenCV 3.1 télécharger grade d'OpenCV 3.0.0
le bug semble être dans OpenCV 3.1 en plus de cela le code pour l'utilisation de L'algorithme ORB qui est documenté sur OpenCV.org est un peu obsolète
où il est dit
enter code here
# Initier ORBE détecteur de
enter code here
orb = cv2.Orb () # notez que vous obtiendrez une erreur car celle-ci a maintenant enter code here
changé en :
enter code here
orb = cv2.ORB_create ()
Voici mon exemple du code utilisant OpenCV 3.0.0 sur 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()
je espère que cette aide , j'aime la pile de ses flux de la meilleure ressource sur internet.
C'est probablement un bug. Ce que vous pouvez faire est que vous pouvez passer le 6ème argument comme None
.
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2,None)
j'ai eu un problème de nature similaire lorsque à expérimenter avec des EIPD . J'ai pu le résoudre en utilisant None
comme argument.
mon code: img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, flags=2)
travaillées au-delà de ce code, les mots clés et les paramètres="None": img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches ,None, flags=2)