ouvrir cv erreur: (-215) scn = = 3 / / scn = = 4 en fonction cvtColor
Je suis actuellement dans Ubuntu 14.04, en utilisant python 2.7 et cv2.
Quand j'exécute 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 renvoie:
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 pouvais charger ma photo dans le mauvais sens, car elle devrait avoir 3 dimensions: lignes, colonnes et profondeur.
Quand j'imprime l'img.forme il ne renvoie que deux nombres, donc je dois le faire mal. Mais je ne connais pas la bonne façon de charger ma photo.
16 réponses
Donne le chemin complet de l'image avec une barre oblique. Il 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)
En outre, si vous donnez 0
dans le deuxième paramètre lors du chargement de l'image en utilisant cv2.imread
que pas besoin de convertir l'image en utilisant cvtColor
, il est déjà chargé 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 couleur en niveaux de gris, à cause du 0 ajouté à la fin. Et si vous essayez à nouveau de convertir une image déjà grise en image grise, cela montrera cette erreur.
Donc, utilisez le style ci-dessus ou essayez le code mentionné ci-dessous:
img = cv2.imread('2015-05-27-191152.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Transmettre Uniquement le nom de l'image, pas besoin de 0
:
img=cv2.imread('sample.jpg')
La première chose que vous devriez vérifier est que l'image existe dans le répertoire racine ou non. Cela est principalement dû à l'image avec hauteur = 0. Ce qui signifie que cv2.imread(imageName)
ne lit pas l'image.
Ce message d'erreur s'est affiché, pour des raisons complètement indépendantes des drapeaux 0 ou 1 mentionnés dans les autres réponses. Vous pouvez le voir aussi parce que cv2.imread
ne sera pas 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
Donc, vous voyez un échec cvtColor
quand il s'agit en fait d'une erreur imread
silencieuse. Gardez cela à l'esprit la prochaine fois que vous allez perdre une heure de votre vie avec cette métaphore cryptique.
Solution
Vous pourriez avoir besoin de vérifiez que votre chaîne de chemin représente un fichier valide avant de le passer à 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.
Cette réponse si pour les personnes rencontrant le même problème en essayant 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()
Utilisation De Linux:
Si vous essayez d'accéder à la caméra depuis votre ordinateur, il y a probablement un problème d'autorisation, essayez d'exécuter le script python avec sudo.
sudo python python_script.py
Pour tester si la caméra est accessible exécutez la commande suivante.
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
L'erreur ci-dessus est le résultat d'un nom d'image invalide 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)
Aussi, si vous utilisez le 2ème argument de cv2.imread () comme '0' , alors il est déjà converti en une image en niveaux de gris.
La différence entre convertir l'image en passant 0 comme paramètre et appliquer ce qui suit:
img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY)
Est-ce que, dans le cas img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY)
, les images sont des images de type 8uC1 et 32sC1.
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 dans le cas où vous souhaitez fermer la caméra / arrêter s'il y aura 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
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 OpenCV doc , notez qu'il a 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)
sauvegarde d'une image calibresult.jpg
dans le répertoire courant. Donc, quand j'ai couru le code pour la prochaine fois, avec mes ensembles d'images d'échantillon que j'ai utilisés pour calibrer la caméra au format jpg, le code a également essayé de considérer ceci image nouvellement ajoutée calibresult.jpg
en raison de laquelle l'erreur est apparue
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 était: j'ai simplement supprimé cette image nouvellement générée après chaque exécution ou alternativement changé le type de l'image pour dire png
ou tiff
type. Qui 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 tout cv2.imread peut traiter avec "nom de fichier.jpg " il ne peut pas traiter "file.name.jpg". étant un novice de python, Je ne peux pas encore proposer une solution, mais comme L'a écrit François Leblanc, c'est plus une erreur de lecture silencieuse.
Il a donc un problème avec un point supplémentaire dans le nom de fichier et propablement d'autres signes, comme avec ""(espace) ou " % " et ainsi de suite.
J'ai également trouvé si votre webcam ne s'est pas fermée correctement ou si quelque chose l'utilise, alors CV2 donnera la même erreur. J'ai dû redémarrer mon pc pour le faire fonctionner à nouveau.
La solution la plus simple pour supprimer cette erreur était d'exécuter la commande
cap.release()
cv2.closeAllWindows()
Cela a fonctionné pour moi et parfois le redémarrage du noyau était nécessaire en raison des anciens processus s'exécutant en arrière-plan.
Si l'image n'est pas dans le répertoire de travail, elle ne fonctionnera pas non plus pour essayer de placer le fichier image dans pwd dans le même dossier car il y a du code.
Pour éviter ce problème à l'avenir, essayez de coder avec une maniabilité exceptionnelle de sorte que si une résiliation incorrecte se produit pour une raison aléatoire, le périphérique de capture serait libéré après que le programme se soit terminé.
Je le pense parce que cv2.imread
ne peut pas lire .jpg
image, vous devez changer .jpg
à .png
.
Essayez ceci à la ligne 11, travaillé pour moi.Je pense que vous manquez les paramètres de la fonction detectMultiScale ()
faces = face_cascade.detectMultiScale(gray, 1.3, 5)