2011-04-06 33 views
9

He instalado OpenCV 2.2 y cuando intento utilizar drawContours me sale el siguiente error:Usando la función drawContours OpenCV en Python

cv.drawContours(frame, contours, 0, cv.RGB(255, 0, 0)) 
TypeError: <unknown> is not a numpy array 

El código relacionado con este error es el siguiente:

storage = cv.CreateMemStorage(0) 
contours = cv.FindContours (color_mask, storage, method = cv.CV_CHAIN_APPROX_SIMPLE) 
cv.drawContours(frame, contours, 0, cv.RGB(255, 0, 0)) 

La documentación de Python no se corresponde con el orden correcto de los parámetros (sé el orden correcto gracias a IDLE) y la documentación de C++ para esta función no me ayuda mucho

Aquí está el código completo (código correspondiente):

cv.NamedWindow("MyWindow", 1) 
    capture = cv.CaptureFromCAM(0) 

    while 1: 
     frame = cv.QueryFrame(capture) 

     color_mask = cv.CreateImage(cv.GetSize(frame), 8, 1) 

     cv.InRangeS(frame, cv.Scalar(*min_color), cv.Scalar(*max_color), color_mask) 

     cv.CvtColor(frame, frame, cv.CV_BGR2HSV) 

     storage = cv.CreateMemStorage(0) 
     contours = cv.FindContours (color_mask, storage, method = cv.CV_CHAIN_APPROX_SIMPLE) 
     cv.drawContours(image = frame, contours = contours, contourIdx = 0, color = cv.RGB(255, 0, 0)) 

     cv.ShowImage("MyWindow", frame) 

Gracias de antemano

Respuesta

6

Debe tener en cuenta ese drawContours y DrawContours son dos funciones diferentes. En realidad hacen lo mismo, pero aceptan diferentes parámetros. Creo que el primero solo acepta matrices numpy en lugar de CvMat u otras matrices de openCV.

2

usted debe comprobar los parámetros de la función en la referencia pitón de DrawContours, y tratar de no confiar en el orden de los parámetros cuando llamando a una función que toma múltiples argumentos, debe usar etiquetas.

En otras palabras:

cv.DrawContours(img=frame, contour=contours, ...) 

Si comprueba la documentación de DrawContours:

DrawContours(img, contour, external_color, hole_color, max_level, thickness=1, lineType=8, offset=(0, 0)) 

Usted se dará cuenta de que la función acepta 8 argumentos:

  • 5 necesario (img, contour, external_c olor, hole_color, max_level)
  • 3 opcional (espesor, tipo de línea, compensado)

y no hay argumentos llamados contourIdx o color

por ejemplo:

cv.DrawContours(img=frame, contour=contours, external_color=cv.RGB(255, 0, 0), hole_color=cv.RGB(0, 255, 0), max_level=1) 
+0

Los parámetros de función derecha no se corresponde con la referencia oficial (ya sé que suena estúpido). Si hago lo que dice, aparece el siguiente error: 'TypeError: argumento requerido 'contourIdx' (pos 3) no encontrado' – Manuel

+0

¿podría mostrar el código? – P2bM

+0

Después de un pequeño descanso, creo que el error podría estar en la generación de contornos – Manuel

0

he encontrado algunas errores en el contenedor de Python de OpenCV 2.2. Ejemplos como "camshift.py" se ejecutan con OpenCV 2.1 pero no con OpenCV 2.2. Supongo que mis problemas se derive del este error (ahora voy a utilizar la versión 2.1)

he informado de este error, así como el error de documentación

@ P2bM gracias por su ayuda

+0

sin necesidad de agradecerme, bienvenido a stackoverflow :) – P2bM

1

Utilice la función cv2array y array2cv proporcionada en OpenCV Cheatsheet para convertir la imagen al formato específico.

Algo como esto:

imgray = array2cv(cv2.cvtColor(cv2array(image), cv.CV_RGB2GRAY)) 
storage = cv.CreateMemStorage(0) 
contours = cv.FindContours(imgray, storage,cv.CV_RETR_LIST, cv.CV_CHAIN_APPROX_SIMPLE,(0,0))