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

29
demandé sur J Richard Snape 2015-07-26 00:33:04

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)

51
répondu J Richard Snape 2017-05-23 12:26:32

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.

12
répondu Wazzie 2016-04-21 11:52:28

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.

0
répondu valacmur98 2018-06-16 12:17:07

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)

0
répondu kcmn 2018-09-06 20:59:11