TypeError: No se encontró el argumento requerido ‘outImg’ (pos 6)

Cuando corro mi código 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 esta linea

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

Me sale este error

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

Estoy usando python3 y opencv3

Parece que estás siguiendo esta página de tutoriales (según el código que has mostrado en esta y tus dos preguntas relacionadas 1 , 2 ).

La documentación de la función está aquí (aunque tengo en cuenta que todavía está etiquetada como “beta”) e implica que outImg es opcional. Sin embargo, el mensaje de error de python es explícito: se requiere un argumento en la posición 6, se llama outImg en la firma de la función. Sospecho que la documentación puede no coincidir exactamente con los requisitos del código. Parece que la firma del código C ++ a la que está llamando el enlace de Python no tiene un valor predeterminado para outImg , por lo que necesita que se proporcione ese argumento.

Tenga en cuenta que puede inspeccionar la cadena de documentación para el enlace real en el intérprete de python3 (si existe) mirando .__doc__ . En este caso, puede ver que outImg no se muestra como opcional. Aquí está la salida de mi instalación:

 >>> cv2.drawMatchesKnn.__doc__ 'drawMatchesKnn(img1, keypoints1, img2, keypoints2, matches1to2, outImg[, matchC olor[, singlePointColor[, matchesMask[, flags]]]]) -> outImg' 

Solución (nota: verificada en una instalación de Windows, no en Linux)

Puede observar el último ejemplo en ese tutorial , que utiliza el siguiente código: pasar None en lugar de outImg . Creo que eso funcionará para tu caso también.

 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) 

No es necesario que pase todos los draw_params , podría intentar simplemente pasando las flags es decir

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

He verificado esto en una instalación nueva de OpenCV 3 (aunque en Windows, usando un binario precomstackdo)

Bueno chicos, yo también soy un novato y estoy aprendiendo mucho después de horas de investigación en línea, parece ser un ERROR en un error conocido como Error (-255) NumpyAllocator, muchos sitios sugerirán que abra el archivo cv2.cpp y comente la línea 163 código, mi sugerencia es si está utilizando OpenCV 3.1 grado de descarga a OpenCV 3.0.0

el error parece estar dentro de OpenCV 3.1 además de esto, el código para usar el algoritmo ORB que se documenta en OpenCV.org está un poco desactualizado donde dice enter code here # Iniciar el detector de ORB enter code here orb = cv2.ORB () # tenga en cuenta que obtendrá un error ya que ahora tiene que enter code here cambiar a: enter code here orb = cv2.ORB_create ()

Aquí está mi ejemplo del código que usa OpenCV 3.0.0 en 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() 

Espero que esto ayude, me encanta stack Over flow es el mejor recurso disponible en Internet.

Mi código: img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, flags=2)

trabajado después de este código, palabra clave y parámetro = “Ninguno”: img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches ,None, flags=2)

Este es probablemente un error. Lo que puedes hacer es pasar el sexto argumento como None .

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

Estaba experimentando un problema similar al experimentar con SIFT . Pude resolverlo cuando utilicé None como argumento.