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


89

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

Cuando ejecuto 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 <module>
    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 decía que podría estar cargando mi foto de manera incorrecta, porque debería tener 3 dimensiones: filas, columnas y profundidad.

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


11
img = cv2.imread('2015-05-27-191152.jpg',0)el parámetro 0 ya carga su imagen como una imagen en escala de grises de 1 canal. Así que pruebe img = cv2.imread('2015-05-27-191152.jpg')o gray = cv2.imread('2015-05-27-191152.jpg',0)eche un vistazo a diferentes banderas en: docs.opencv.org/modules/highgui/doc/…
Micka

También tuve este problema, pero resultó tener un espacio ( .../eclipse\ footage/...) en mi camino. Entonces, agregar un ...,0)no lo solucionó.
Cody

Respuestas:


102

Proporcione la ruta completa de la imagen con una barra inclinada. 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 el 0segundo parámetro mientras carga la imagen usando cv2.imreadque no es necesario convertir la imagen usando 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)

6
En caso de que esté tomando una imagen de una cámara: obtendrá este error si la cámara no es accesible.
ger.s.brett

... o si proporciona una ruta incorrecta a su archivo de video; P Me encontré con este problema cuando arruiné la maldita ruta de Windows (escribiendo c: / en lugar de C: //)
fanny

17

Establecer como se muestra a continuación

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

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

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

Entonces, use el estilo anterior o pruebe 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)


4

Lo primero que debe verificar 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.


Esta respuesta resuelve mi problema: leo un video, no se detiene automáticamente cuando termina el video, por lo que obtengo el mismo error al intentar cv2.cvtColorun marco vacío.
Mikhail_Sam

2

Me apareció este mensaje de error, por razones completamente ajenas a las banderas 0 o 1 mencionadas en las otras respuestas. Es posible que también lo esté viendo porque no secv2.imread producirá un error si la cadena de ruta que pasa 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)
<ipython-input-4-19408d38116b> in <module>()
      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

Entonces, está viendo una cvtColorfalla cuando en realidad es un imreaderror silencioso . Tenga esto en cuenta la próxima vez que vaya a perder una hora de su vida con esa metáfora críptica .

Solución

Es posible que deba verificar que su cadena de 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á correctamente.


1

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()

Usando Linux:

Si está intentando acceder a la cámara desde su computadora, lo más probable es que haya un problema de permisos, intente ejecutar el script de Python con sudo, debería 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 

1
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 está 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.


1

Este código para aquellos que están experimentando 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 caso de que desee cerrar la cámara / descontinuar si habrá algún problema con el marco en sí

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

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


0

Esto es lo que observé cuando usé mis propios conjuntos de imágenes en .jpgformato. En el script de muestra disponible en el documento Opencv , tenga en cuenta que tiene las líneas undistorty crop the imagecomo se muestra a continuación:

# 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.jpgen el directorio actual. Entonces, cuando ejecuté el código 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.jpgdebido a la cual apareció el error

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é esa imagen recién generada después de cada ejecución o, alternativamente, cambié el tipo de imagen para decir pngo tiffescribir. Eso resolvió el problema. Compruebe si está ingresando y escribiendo calibresultdel mismo tipo. Si es así, simplemente cambie el tipo.


0

En OS XI me di cuenta de que, si bien cv2.imread puede manejar "filename.jpg", no puede procesar "file.name.jpg". Siendo un novato en Python, todavía no puedo proponer una solución, pero como escribió François Leblanc, es más un error de lectura silencioso.

Por lo tanto, tiene un problema con un punto adicional en el nombre del archivo y probablemente también con otros signos, como con "" (Espacio) o "%", etc.


0

También encontré que si su cámara web no se cerró bien o si algo la está usando, entonces CV2 dará este mismo error. Tuve que reiniciar mi PC para que volviera a funcionar.


0

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

cap.release()
cv2.closeAllWindows()

Eso funcionó para mí y, a veces, también fue necesario reiniciar el kernel debido a que los procesos antiguos se ejecutaban en segundo plano.

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

Para evitar este problema en el futuro, intente codificar con un manejo excepcional, de modo que si ocurre una terminación incorrecta por alguna razón aleatoria, el dispositivo de captura se libere después de que el programa termine.


0

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.


0

lo creo porque cv2.imreadno puedo leer la .jpgimagen, necesitas cambiar .jpga .png.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.