scn ipp_cvtcolor img gray failed error cvtcolor cpp color_bgr2gray color python opencv photo

python - ipp_cvtcolor - opencv error assertion failed scn== 3 || scn== 4 in cvtcolor



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

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.

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

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


Creo que porque cv2.imread no puede leer la imagen .jpg , debe cambiar .jpg a .png .


Dé la ruta completa de la imagen con barra diagonal. Resolvió el error para mí.

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 proporciona 0 en el segundo parámetro al cargar la imagen usando cv2.imread que no es necesario convertir la imagen usando cvtColor , ya se carga 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)


En OS XI me di cuenta de que, si bien cv2.imread puede tratar con "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 silencioso de lectura.

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


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, es muy probable 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


Este código para quienes experimentan el mismo problema al intentar acceder a la cámara podría escribirse con un control 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 / suspender 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


Esto es lo que observé cuando utilicé mis propios conjuntos de imágenes en formato .jpg . En la secuencia de comandos de muestra disponible en Opencv doc , tenga en cuenta que no está 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 nueva imagen calibresult.jpg debido a que 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 png o tiff . Eso resolvió el problema. Verifique si está ingresando y escribiendo un resultado del mismo tipo. Si es así, simplemente cambie el tipo.


He aparecido este mensaje de error, por razones completamente ajenas a los marcadores 0 o 1 mencionados en las otras respuestas. Es posible que también lo vea porque cv2.imread no generará un error si la cadena de ruta que le 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 falla de cvtColor cuando en realidad es un error de imread silenciosa. Tenlo en cuenta la próxima vez que pierdas una hora de tu 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á con gracia.


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)


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

cap.release() cv2.closeAllWindows()

Eso funcionó para mí y también a veces fue necesario reiniciar el núcleo debido a los viejos procesos que se ejecutan 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 otro código que proporciona la ruta completa al archivo o carpeta de imagen.

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 libere una vez que finalice el programa.


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.


Por favor, configure de la siguiente manera

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


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

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


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


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.


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 agregado al final. Y si nuevamente intenta convertir una imagen ya gris a imagen gris, mostrará ese error.

Por lo tanto, use el estilo anterior o pruebe el código mencionado a continuación:

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