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)