Je suis actuellement dans Ubuntu 14.04, en utilisant python 2.7 et cv2.
Quand je lance ce code:
import numpy as np
import cv2
img = cv2.imread('2015-05-27-191152.jpg',0)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
il retourne:
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
J'ai déjà cherché ici et une réponse a dit que je pourrais charger ma photo dans le mauvais sens, car elle devrait avoir 3 dimensions: lignes, colonnes et profondeur.
Lorsque j'imprime img.shape, il ne retourne que deux nombres. Je dois donc ne pas le faire correctement. Mais je ne sais pas comment charger ma photo.
Donne le chemin complet de l'image avec une barre oblique. Cela a résolu l'erreur pour moi.
Par exemple.
import numpy as np
import cv2
img = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
De plus, si vous donnez 0
en deuxième paramètre lors du chargement d’image avec cv2.imread
, inutile de convertir une image avec cvtColor
, elle est déjà chargée en tant qu’image en niveaux de gris, par exemple.
import numpy as np
import cv2
gray = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg',0)
Veuillez définir comme ci-dessous
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 ligne de code ci-dessus lit votre image dans le modèle de couleurs en niveaux de gris, en raison du 0 ajouté à la fin. Et si vous essayez à nouveau de convertir une image déjà grise en image grise, cette erreur s'affichera.
Donc, utilisez le style ci-dessus ou essayez le code ci-dessous:
img = cv2.imread('2015-05-27-191152.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
La première chose à vérifier est de savoir si l’image existe ou non dans le répertoire racine. Cela est principalement dû à une image de hauteur = 0. Ce qui signifie que cv2.imread(imageName)
ne lit pas l'image.
Nommer que le nom de l’image, pas besoin de 0
:
img=cv2.imread('sample.jpg')
Ce message d'erreur s'est affiché, pour des raisons totalement indépendantes des indicateurs 0 ou 1 mentionnés dans les autres réponses. Vous le voyez peut-être aussi parce que cv2.imread
ne provoquera () pas une erreur si la chaîne de chemin que vous passez n'est pas une image:
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
Vous voyez donc un échec cvtColor
alors qu’il s’agit en fait d’une erreur silencieuse imread
. N'oubliez pas cela la prochaine fois que vous perdez une heure de votre vie avec cette métaphore cryptique .
Vous devrez peut-être vérifier que votre chaîne de chemin d'accès représente un fichier valide avant de le transmettre à 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)
Écrit de cette façon, votre code échouera gracieusement.
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
L'erreur ci-dessus est le résultat d'un nom d'image non valide ou si le fichier n'existe pas dans le répertoire local.
img = cv2.imread('2015-05-27-191152.jpg',0)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
De même, si vous utilisez le deuxième argument de cv2.imread () comme "0", il est déjà converti en une image en niveaux de gris.
Différence entre la conversion de l'image en passant 0 en paramètre et l'application de ce qui suit:
img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY)
est que, dans le cas img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY)
, les images sont des images de type 8uC1 et 32sC1.
Cette réponse s’applique aux personnes rencontrant le même problème qui tentent d’accéder à la caméra.
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()
Utiliser Linux:
si vous essayez d'accéder à la caméra depuis votre ordinateur, il est fort probable qu'il y ait un problème de permission, essayez de lancer le script python avec Sudo, cela devrait résoudre le problème.
Sudo python python_script.py
Pour vérifier si la caméra est accessible, exécutez la commande suivante.
ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video0 output.mkv
Ce code pour ceux qui rencontrent le même problème en essayant d'accéder à la caméra pourrait être écrit avec un contrôle de sécurité.
if ret is True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
continue
OU au cas où vous voudriez fermer la caméra/interrompre s'il y a un problème avec le cadre lui-même
if ret is True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
break
Pour référence https://github.com/HackerShackOfficial/AI-Smart-Mirror/issues/36
J'ai également constaté que si votre webcam ne se fermait pas correctement ou si quelque chose l'utilise, alors CV2 donnera la même erreur. Je devais redémarrer mon ordinateur pour qu'il fonctionne à nouveau.
La solution la plus simple pour supprimer cette erreur consistait à exécuter la commande
cap.release()
cv2.closeAllWindows()
Cela fonctionnait pour moi et parfois aussi, le redémarrage du noyau était nécessaire à cause d'anciens processus s'exécutant en arrière-plan.
Si l'image ne se trouve pas dans le répertoire de travail, cela ne fonctionnera pas non plus. Essayez de placer le fichier image dans pwd dans le même dossier que le code. Sinon, indiquez le chemin d'accès complet au fichier ou au dossier image.
Pour éviter ce problème à l'avenir, essayez de coder avec une gestion exceptionnelle afin que, si une terminaison incorrecte se produise pour une raison quelconque, le périphérique de capture sera libéré une fois le programme terminé.
2015-05-27-191152.jpg << En regardant votre format d'image, j'ai parfois confondu entre .png et .jpg et j'ai rencontré la même erreur.
Voici ce que j'ai observé lorsque j'ai utilisé mes propres ensembles d'images au format .jpg
. Dans l'exemple de script disponible dans document Opencv , notez qu'il comporte les lignes undistort
et crop the image
comme ci-dessous:
# 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)
Ainsi, lorsque nous exécutons le code pour la première fois, il exécute la ligne cv2.imwrite('calibresult.jpg',dst)
en enregistrant une image calibresult.jpg
dans le répertoire en cours. Ainsi, lorsque j'ai exécuté le code pour la prochaine fois, ainsi que mes exemples de jeux d'images que j'ai utilisés pour calibrer l'appareil photo au format jpg, le code a également tenté de prendre en compte cette image récemment ajoutée calibresult.jpg
en raison de laquelle l'erreur s'est produite. en dehors
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
Ce que j'ai fait est: j'ai simplement supprimé cette image nouvellement générée après chaque analyse ou modifié le type de l'image pour indiquer png
ou tiff
type. Cela a résolu le problème. Vérifiez si vous entrez et écrivez calibresult
du même type. Si oui, changez simplement le type.
Sur OS X, j’ai réalisé que cv2.imread peut traiter "filename.jpg" mais ne peut pas traiter "file.name.jpg". Étant novice en python, je ne peux pas encore proposer de solution, mais comme l’a écrit François Leblanc, il s’agit plutôt d’une erreur de lecture silencieuse.
Il y a donc un problème avec un point supplémentaire dans le nom du fichier et probablement d'autres signes, comme avec "" (Espace) ou "%", etc.
je le pense parce que cv2.imread
ne peut pas lire .jpg
image, vous devez changer .jpg
en .png
.