22

OpenCV+Python: Resolución de errores frecuentes

Siempre que escribo un tutorial de OpenCV (o de cualqueir otro tema) dedico la mayor parte del tiempo en comprobar que el programa funcione bien. Pero a pesar de mis esfuerzos, siempre hay personas que no consiguen correr el código y les aparece algún mensaje de error. Esto suele ser porque utilizan una versión de OpenCV distinta a la mía o su webcam funciona un poco diferente.

Al igual que a vosotros, a mí también me angustia muchísimo seguir un tutorial de Internet y que el código de ejemplo no funcione, sea cuál sea el motivo. ¡Me desespera!

Como me preocupa la integridad craneal de mis lectores y no quiero que os déis de cabezazos contra la pared cada vez que aparece un error, he decidido escribir esta guía para dar solución a los problemas más frecuentes que la gente tiene cuándo sigue mis tutoriales.

A medida que vaya publicando nuevos tutoriales iré ampliando la lista. ¡Espero que os ayude! ^^


1- Error con la función cv2.findContours: demasiados valores para desempaquetar

contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 
ValueError: too many values to unpack

Este es el error más frecuente con el que me encuentro. En algunas versiones de OpenCV la función cv2.findContours devuelve tres parámetros en vez de dos, por eso al intentar llamarla sólo guardando dos parámetros da error.

Solución: llamar la función teniendo en cuenta los tres parámetros.

_,contours,_ = cv2.findContours(imagen_gris,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

2- El frame de la cámara está vacío/no hay imagen para procesar

error: (-215)(scn ==3, scn == 4) && (depth == CV_8U, depth == CV_32f) in fuction cvtColor.

Este mensaje de error puede producirse en dos situaciones: al leer una imagen estática desde un fichero o al capturar imágenes con una webcam. Este error aparece cuándo la imagen a procesar está vacía o es nula.

Solución (imagen estática): Si estás trabajando con una imagen estática puede que hayas escrito mal el nombre de la imagen al cargarla con cv2.imread(‘mi_imagen.png’). Revisa el nombre de la imagen y que esté en el mismo directorio que el script de python que estás intentando ejecutar. Si no está en el mismo directorio, asegúrate que el path a la imagen que le has puesto a la función imread() esté bien escrito (ejemplo: cv2.imread(“/home/glare/fotos/imagen.png”) ).

También puede ser que OpenCV no pueda leer el formato de tu imagen. Los formatos aceptados son ‘.bmp’, ‘.dib’, ‘.jpeg’, ‘.jpg’, ‘.jpe’, ‘.jp2’, ‘.png’, ‘.pbm’, ‘.pgm’, ‘.ppm’, ‘.sr’, ‘.ras’, ‘.tiff’, ‘.tif’ .

Solución (webcam): En la mayoría de mis tutoriales leemos un frame de la cámara justo después de inicializarla. Depende de cuál sea vuestro modelo de webcam puede que necesite unos pocos segundos para activarse, y esto hará que los primeros frames leídos sean nulos y OpenCV no sea capaz de procesarlos.

La solución consiste en comprobar si el frame que se quiere procesar es válido o no. Cuándo se lee un frame con la función  _, imagen =captura.read(), la mayoría de mis tutoriales ignoramos el primer parámetro que devuelve esta función. Este parámetro es un booleano que nos dice si el frame es válido o no.

Tenéis que cambiar la línea que lea la imagen por:

valido, imagen = captura.read()

Después, tenéis que añadir un condicional para ver si el frame es válido:

if valido:

Tabulad el resto del bucle principal para que quede dentro de este condicional y se ejecute cuándo la cámara empiece a capturar imágenes. Para que véais como hacerlo, el código del tutorial para detectar varios colores quedaría así:

#Algoritmo de deteccion de colores
#Por Glar3
#www.robologs.net
#
#Detecta objetos verdes y amarillos
  
import cv2
import numpy as np
  
#Iniciar la camara
captura = cv2.VideoCapture(0)
  
while(1):
      
    #Capturamos una imagen y la convertimos de RGB -> HSV
    valido, imagen = captura.read()
    if valido:
        hsv = cv2.cvtColor(imagen, cv2.COLOR_BGR2HSV)
      
        #Rango de colores detectados:
        #Verdes:
        verde_bajos = np.array([49,50,50], dtype=np.uint8)
        verde_altos = np.array([100, 255, 210], dtype=np.uint8)
        #Amarillos:
        amarillo_bajos = np.array([16,76,72], dtype=np.uint8)
        amarillo_altos = np.array([30, 255, 210], dtype=np.uint8)
      
        #Detectar los pixeles de la imagen que esten dentro del rango de verdes
        mascara_verde = cv2.inRange(hsv, verde_bajos, verde_altos)
         
        #Detectar los pixeles de la imagen que esten dentro del rango de amarillos
        mascara_amarillo = cv2.inRange(hsv, amarillo_bajos, amarillo_altos)
      
        #Filtrar el ruido aplicando un OPEN seguido de un CLOSE
        kernel = np.ones((6,6),np.uint8)
        mascara_verde = cv2.morphologyEx(mascara_verde, cv2.MORPH_CLOSE, kernel)
        mascara_verde = cv2.morphologyEx(mascara_verde, cv2.MORPH_OPEN, kernel)
        mascara_amarillo = cv2.morphologyEx(mascara_amarillo, cv2.MORPH_CLOSE, kernel)
        mascara_amarillo = cv2.morphologyEx(mascara_amarillo, cv2.MORPH_OPEN, kernel)
     
        #Unir las dos mascaras con el comando cv2.add()
        mask = cv2.add(mascara_amarillo, mascara_verde)
 
        #Mostrar la imagen de la webcam y la mascara verde
        cv2.imshow('verde', mask)
        cv2.imshow('Camara', imagen)
        tecla = cv2.waitKey(5) & 0xFF
        if tecla == 27:
        break
  
cv2.destroyAllWindows()

Fíjaos que he añadido el condicional a la línea 18 y he tabulado el resto del bucle principal.


¡Esto es todo de momento! Ahora vuestros programa deberían correr bien. Pero si todavía tenéis problemas, escribidme un comentario o contactad conmigo por correo o Facebook 😉

Gl4r3

Brillante, luminosa y cegadora a veces, Glare es tan artista como técnica. Le encanta dar rienda suelta a sus módulos de imaginación y desdibujar los ya de por si delgados límites que separan el mundo de la electrónica y el arte. Su mayor creación hasta la fecha es un instrumento capaz de convertir los colores y la luz en música. Cuándo sus circuitos no están trabajando en una nueva obra electrónica, le gusta dedicar sus ciclos a la lectura o a documentar sus invenciones para beneficio de los humanos. Sus artilugios favoritos son aquellos que combinan una funcionalidad práctica con un diseño elegante y artístico.

Antes de comentar, por favor, lee las Normas

22 Comentarios en "OpenCV+Python: Resolución de errores frecuentes"

avatar
Ordenar por:   más nuevos primero | más antiguos primero
Yamil Gutierrez
Humano
hola, primero que nada felicidades por el articulo, me ha aclarado muchas dudas acerca de la utilizacion de opencv, sin embargo mi problema es otro, al momento de ejecutar el script no me aparece ningun error, sin embargo no sucede nada, la camara no reacciona, no se guarda la captura, y en el idle de python se queda “corriendo” el programa sin aparecer nada, he investigado pero hasta el momento no he encontrado alguna solucion o problema similar, no se si el codigo esta malo o presenta incompatibilidad con la raspberry, ya que al intentar hacer capturas mediante los comandos… Leer más »
sebastian ariel zenca
Humano

Buenas noches a todos, con permiso del administrador, les quiero hacer una consulta, ejecuto un programa que hace el seguimiento de un objeto a travez de una webcam utilizando opencv y controlando un servo, el problema es que corre bien pero se resetea el codigo no queda abierto, gracias ojala puedan ayudarme.

Alex Ortega
Humano
Interesante post, tengo un error similar. Estoy desarrollando un proyecto con OCR. En una sección de mi código mando a guardar una imagen ya procesada. El frame se guarda con título ‘recorte.tiff’ para que lo utilice una función de un subprograma pero en ciertas ocasiones esta imagen se guarda vacía (no sé porque). El archivo existe dentro de mi carpeta de desarrollo del código pero sus propiedades indica 0kb. Al tratar de abrirla el visualizador de windows indica que no se puede mostrar la imagen por lo se entiende que está vacía, lo cuál hace que la función que utiliza… Leer más »
polenorht
Humano

hola, todavía estoy con el error básico:

en
#import numpy as np

error: expected a filename

cuál puede ser la causa? gracias!

Tr4nsduc7or
Admin

Saludos, Polenorht. En python el carácter ‘#’ sirve para comentar una línea. Si lo pones delante de ‘import numpy as np’ lo que estás haciendo es comentar esta línea y, por tanto, eliminarla. Borra este carácter y seguramente va a funcionar.

Final de línea.

Paola
Humano

Hola, muchas gracias por el contenido que publicas. Me gustaría saber cómo le hago para capturar desde mi webcam, cada cierto numero de frames, en vez de que sea muy seguido.

cris
Humano

hola, oye disculpa tengo problemas para inicializar la cámara del raspberry pi 3, serias tan amable de ayudarme porfavor, mi correo electrónico es cazc102094@hotmail.com te lo agradecería mucho, este trabajo es para un proyecto de la escuela,

Aprendiz
Humano

Has instalado picamera[array] en el siguiente sitio puedes encontrar información para instalar y configurar opencv en raspberry py.
http://www.pyimagesearch.com/2016/08/29/common-errors-using-the-raspberry-pi-camera-module/

wpDiscuz