abrir error cv: (-215) scn == 3 || scn == 4 en la función cvtColor

Actualmente estoy en Ubuntu 14.04, usando python 2.7 y cv2.

Cuando corro este código:

import numpy as np import cv2 img = cv2.imread('2015-05-27-191152.jpg',0) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

vuelve:

  File "face_detection.py", line 11, in  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/imgproc/src/color.cpp:7564: error: (-215) scn == 3 || scn == 4 in function cvtColor 

Ya busqué aquí y una respuesta dijo que podría estar cargando mi foto de manera incorrecta, ya que debería tener 3 dimensiones: filas, columnas y profundidad.

Cuando imprimo la img.shape, solo devuelve dos números, por lo que debo estar haciendo mal. Pero no sé la forma correcta de cargar mi foto.

Dar la ruta completa de la imagen con barra diagonal. Me solucionó el error.

P.ej

 import numpy as np import cv2 img = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

Además, si da 0 en el segundo parámetro mientras carga la imagen con cv2.imread no necesita convertir la imagen con cvtColor , ya está cargada como imagen en escala de grises, por ejemplo.

 import numpy as np import cv2 gray = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg',0) 

Por favor, establezca lo siguiente

 img = cv2.imread('2015-05-27-191152.jpg',1) // Change Flag As 1 For Color Image //or O for Gray Image So It image is //already gray 
 img = cv2.imread('2015-05-27-191152.jpg',0) 

La línea de código anterior lee su imagen en un modelo de color en escala de grises, debido al 0 que se adjunta al final. Y si nuevamente intentas convertir una imagen ya gris a imagen gris, mostrará ese error.

Entonces, o bien usa el estilo anterior o prueba el código que se menciona a continuación:

 img = cv2.imread('2015-05-27-191152.jpg') gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

Solo pase el nombre de la imagen, sin necesidad de 0 :

 img=cv2.imread('sample.jpg') 

Lo primero que debe comprobar es si la imagen existe en el directorio raíz o no. Esto se debe principalmente a la imagen con altura = 0. Lo que significa que cv2.imread(imageName) no está leyendo la imagen.

He aparecido este mensaje de error, por razones completamente no relacionadas con los indicadores 0 o 1 mencionados en las otras respuestas. Puede que lo cv2.imread viendo también porque cv2.imread no producirá un error si la cadena de la ruta de acceso que pasas no es una imagen:

 In [1]: import cv2 ...: img = cv2.imread('asdfasdf') # This is clearly not an image file ...: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ...: OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor, file C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp, line 10638 --------------------------------------------------------------------------- error Traceback (most recent call last)  in () 1 import cv2 2 img = cv2.imread('asdfasdf') # This is clearly not an image file ----> 3 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) error: C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:10638: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor 

Así que estás viendo un fallo en cvtColor cuando en realidad se trata de un error de imread silenciosa. Tenlo en cuenta la próxima vez que desperdicies una hora de tu vida con esa metáfora críptica .

Solución

Es posible que deba verificar que la cadena de su ruta represente un archivo válido antes de pasarlo a cv2.imread :

 import os def read_img(path): """Given a path to an image file, returns a cv2 array str -> np.ndarray""" if os.path.isfile(path): return cv2.imread(path) else: raise ValueError('Path provided is not a valid file: {}'.format(path)) path = '2015-05-27-191152.jpg' img = read_img(path) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

Escrito de esta manera, su código fallará con gracia.

Esta respuesta es para las personas que experimentan el mismo problema al intentar acceder a la cámara.

 import numpy as np import cv2 cap = cv2.VideoCapture(0) while(True): # Capture frame-by-frame ret, frame = cap.read() # Our operations on the frame come here gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Display the resulting frame cv2.imshow('frame',gray) if cv2.waitKey(1) & 0xFF == ord('q'): break # When everything done, release the capture cap.release() cv2.destroyAllWindows() 

Utilizando Linux:

Si está intentando acceder a la cámara desde su computadora, lo más probable es que haya un problema con los permisos, intente ejecutar el script de Python con sudo para solucionarlo.

 sudo python python_script.py 

Para probar si se puede acceder a la cámara, ejecute el siguiente comando.

 ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video0 output.mkv 
 cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/imgproc/src/color.cpp:7564: error: (-215) scn == 3 || scn == 4 in function cvtColor 

El error anterior es el resultado de un nombre de imagen no válido o si el archivo no existe en el directorio local.

 img = cv2.imread('2015-05-27-191152.jpg',0) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

Además, si está utilizando el segundo argumento de cv2.imread () como ‘0’, entonces ya se ha convertido en una imagen en escala de grises.

La diferencia entre convertir la imagen pasando 0 como parámetro y aplicando lo siguiente:

 img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY) 

es que, en el caso img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY) , las imágenes son imágenes de tipo 8uC1 y 32sC1.

Este código para aquellos que experimentan el mismo problema al intentar acceder a la cámara podría escribirse con una verificación de seguridad.

 if ret is True: gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) else: continue 

O en el caso de que desee cerrar la cámara / interrumpirla si habrá algún problema con el marco.

 if ret is True: gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) else: break 

Para referencia https://github.com/HackerShackOfficial/AI-Smart-Mirror/issues/36

Esto es lo que observé cuando usé mis propios conjuntos de imágenes en formato .jpg . En la secuencia de comandos de muestra disponible en Opencv doc , tenga en cuenta que tiene el elemento undistort y crop the image líneas de crop the image siguiente manera:

 # undistort dst = cv2.undistort(img, mtx, dist, None, newcameramtx) # crop the image x,y,w,h = roi dst = dst[y:y+h, x:x+w] cv2.imwrite('calibresult.jpg',dst) 

Entonces, cuando ejecutamos el código por primera vez, ejecuta la línea cv2.imwrite('calibresult.jpg',dst) guardando una imagen calibresult.jpg en el directorio actual. Entonces, cuando ejecuté el código para la próxima vez, junto con mis conjuntos de imágenes de muestra que usé para calibrar la cámara en formato jpg, el código también trató de considerar esta imagen recién agregada calibresult.jpg debido a que el error apareció.

 error: C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\imgproc\src\color.cpp:7456: error: (-215) scn == 3 || scn == 4 in function cv::ipp_cvtColor 

Lo que hice fue: simplemente eliminé la imagen recién generada después de cada ejecución o alternativamente cambié el tipo de imagen para decir png o tiff . Eso solucionó el problema. Compruebe si está ingresando y escribiendo calibresult del mismo tipo. Si es así, simplemente cambia el tipo.

En OS XI me di cuenta de que mientras cv2.imread puede tratar con “filename.jpg” no puede procesar “file.name.jpg”. Como soy un principiante de python, aún no puedo proponer una solución, pero, como escribió François Leblanc, es más un error silencioso.

Por lo tanto, tiene un problema con un punto adicional en el nombre de archivo y también con otros signos, como con “” (Espacio) o “%” y así sucesivamente.

También encontré que si su cámara web no se cerraba bien o si algo la está utilizando, entonces CV2 dará este mismo error. Tuve que reiniciar mi PC para que funcione de nuevo.

La solución más sencilla para eliminar ese error fue ejecutar el comando

 cap.release() cv2.closeAllWindows() 

Eso me funcionó y, a veces, también era necesario reiniciar el kernel debido a procesos antiguos que se ejecutaban en segundo plano.

Si la imagen no está en el directorio de trabajo, entonces tampoco funcionará para eso, intente colocar el archivo de imagen en pwd en la misma carpeta, ya que hay un código que proporciona la ruta completa al archivo de imagen o carpeta.

Para evitar este problema en el futuro, intente codificar con un manejo excepcional para que si se produce una terminación incorrecta por algún motivo aleatorio, el dispositivo de captura se liberaría una vez que el progtwig haya terminado.

2015-05-27-191152.jpg << Mirando hacia atrás en su formato de imagen, ocasionalmente confundí entre .png y .jpg y encontré el mismo error.

lo creo porque cv2.imread no puede leer la imagen .jpg , necesitas cambiar .jpg a .png .

Intente esto en la línea 11, funcionó para mí. Creo que le faltan los parámetros de la función detectMultiScale ()

 faces = face_cascade.detectMultiScale(gray, 1.3, 5)