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)