python opencv opencv3.0

python - TypeError: argumento requerido ''outImg''(pos 6) no encontrado



opencv opencv3.0 (3)

Bien chicos, soy demasiado 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 sugieren que abras el archivo cv2.cpp y comentes la línea Código 163, mi sugerencia es si está utilizando la calificación de descarga OpenCV 3.1 para OpenCV 3.0.0

el error parece estar dentro de OpenCV 3.1; además, el código para usar el algoritmo ORB, que está documentado en OpenCV.org, está un poco desactualizado, y enter code here . # Iniciar el detector ORB enter code here orb = cv2.ORB () # tenga en cuenta que obtendrá un error ya que ahora enter code here Cambie 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 en internet.

Cuando ejecuto 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


Esto 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 teniendo un problema similar al experimentar con SIFT . Pude resolverlo cuando usé None como argumento.


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

La documentación de la función está aquí (aunque observo 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 ++ al que llama el enlace de python no tiene ningún valor predeterminado para outImg , por lo que es necesario que se proporcione ese argumento.

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

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

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

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

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 dict, podría intentar simplemente pasar flags es decir,

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

Lo he verificado en una nueva instalación de OpenCV 3 (aunque en Windows, usando un binario precompilado)