web-dev-qa-db-fra.com

TypeError: Argument obligatoire 'outImg' (pos 6) introuvable

Quand j'exécute mon 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)

Je reçois cette erreur

TypeError: Required argument 'outImg' (pos 6) not found

J'utilise python3 et opencv3

35
shar

Vous semblez être à la suite de cette page de tutoriel (basé sur le code que vous avez montré dans cela et vos deux questions connexes 1 , 2 ).

Le la documentation de la fonction est ici (bien que je note qu'il est toujours étiqueté "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 signature de la fonction. Je soupçonne que la documentation peut ne pas correspondre exactement au code Il apparaît que la signature du code C++ que le python appelle n’a pas de valeur par défaut pour outImg, il faut donc fournir cet argument.

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 affiché comme facultatif. 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 Windows, pas Linux)

Vous remarquerez peut-être le dernier exemple de ce tutoriel , qui utilise le code suivant - en passant None à la place de outImg. Je pense que cela fonctionnera également pour votre cas.

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 pouvez essayer de simplement passer 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 sous Windows, en utilisant un binaire précompilé)

65
J Richard Snape

Ok les gars, je suis trop novice et j'apprends beaucoup après des heures de recherche en ligne, il semble que ce soit un BUG sur une erreur connue sous le nom d'erreur (-255) NumpyAllocator, de nombreux sites vous suggéreront d'ouvrir le fichier cv2.cpp et de commenter la ligne 163 code, ma suggestion est si vous utilisez OpenCV 3.1 download grade vers OpenCV 3.0.0

le bogue semble être dans OpenCV 3.1 en plus de cela, le code d'utilisation de l'algorithme ORB qui est documenté sur OpenCV.org est un peu dépassé où il indique enter code here # Lancer le détecteur ORB enter code hereorb = cv2.ORB () # notez que vous obtiendrez une erreur car cela a maintenant enter code herechanger vers: enter code hereorb = 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()

J'espère que cela aide, j'adore le stack Overflow c'est la meilleure ressource sur Internet.

15
Wazzie

Mon code: img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, flags=2)

travaillé après ce code, mot-clé et paramètre = "Aucun": img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches ,None, flags=2)

2
kcmn

C'est probablement un bug. Ce que vous pouvez faire, c'est que vous pouvez passer le 6ème argument en tant que None.

img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2,None)

J'avais un problème similaire quand expérimenter avec SIFT . J'ai pu le résoudre en utilisant None comme argument.

0
ymdatta