erreur de cv ouvert: (-215) scn == 3 || scn == 4 dans la fonction cvtColor

89

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 disait que je pourrais charger ma photo dans le mauvais sens, car elle devrait avoir 3 dimensions: lignes, colonnes et profondeur.

Lorsque j'imprime le fichier img.shape, il ne renvoie que deux nombres, donc je dois me tromper. Mais je ne sais pas comment charger ma photo.

Arthurckl
la source
11
img = cv2.imread('2015-05-27-191152.jpg',0)le paramètre 0 charge déjà votre image en tant qu'image en niveaux de gris à 1 couche. Alors essayez img = cv2.imread('2015-05-27-191152.jpg')ou gray = cv2.imread('2015-05-27-191152.jpg',0)jetez un œil à différents drapeaux sur: docs.opencv.org/modules/highgui/doc/…
Micka
J'ai également eu ce problème, mais il s'est avéré qu'il y avait un espace ( .../eclipse\ footage/...) sur mon chemin. Donc, l'ajout d'un ...,0)n'a pas résolu le problème.
Cody

Réponses:

102

Donnez 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 0en deuxième paramètre lors du chargement de l'image en utilisant cv2.imreadque 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)
AdityaIntwala
la source
6
Dans le cas où vous saisissez une image d'une caméra: vous obtenez cette erreur si la caméra n'est pas accessible.
ger.s.brett
... ou si vous fournissez un chemin erroné vers votre fichier vidéo; P J'ai rencontré ce problème lorsque j'ai gâché le chemin damn-windows (en écrivant c: / au lieu de C: //)
fanny
17

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
Kalarav Parmar
la source
6
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, cette erreur s'affichera.

Utilisez donc 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)
Gurkamal
la source
4

Seul passe le nom de l'image, pas besoin de 0:

img=cv2.imread('sample.jpg')
supriya junghare
la source
4

La première chose que vous devez vérifier est que l'image existe dans le répertoire racine ou non. Ceci est principalement dû à l'image avec une hauteur = 0. Ce qui signifie que cv2.imread(imageName)ne lit pas l'image.

Farooq Khan
la source
Cette réponse résout mon problème - je lis la vidéo, elle ne s'arrête pas automatiquement à la fin de la vidéo, donc j'obtiens la même erreur en essayant de faire cv2.cvtColorune image vide.
Mikhail_Sam
2

J'ai vu ce message d'erreur apparaître, pour des raisons totalement indépendantes des indicateurs 0 ou 1 mentionnés dans les autres réponses. Vous le voyez peut-être aussi car cv2.imreadil n'y aura pas d' erreur si la chaîne de chemin que vous lui transmettez 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 cvtColoréchec alors qu'il s'agit en fait d'une imreaderreur silencieuse . Gardez cela à l'esprit la prochaine fois que vous perdrez une heure de votre vie avec cette métaphore cryptique .

Solution

Vous devrez peut-être vérifier que votre chaîne de chemin 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 normalement.

François Leblanc
la source
1

Cette réponse est destinée 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()

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, cela devrait le résoudre.

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 
ehivan24
la source
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

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 plus, si vous utilisez le 2ème argument de cv2.imread () comme «0», il est déjà converti en une image en niveaux de gris.

La différence entre la conversion de l'image en passant 0 comme paramètre et l'application de ce qui suit:

img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY) 

c'est que, dans le cas img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY), les images sont des images de type 8uC1 et 32sC1.

Shikhar Johri
la source
1

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 l'appareil photo / arrêter 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

Vivek Patwari
la source
0

Voici ce que j'ai observé lorsque j'ai utilisé mes propres ensembles d'images au .jpgformat. Dans l'exemple de script disponible dans Opencv doc , notez qu'il a les lignes undistortet crop the imagecomme 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 d' cv2.imwrite('calibresult.jpg',dst)enregistrement d'une image calibresult.jpgdans le répertoire courant. Ainsi, lorsque j'ai exécuté le code pour la prochaine fois, avec mes exemples de jeux d'images que j'ai utilisés pour calibrer la caméra au format jpg, le code a également essayé de prendre en compte cette image nouvellement ajoutée en calibresult.jpgraison 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, c'est: j'ai simplement supprimé cette image nouvellement générée après chaque exécution ou j'ai changé le type d'image à dire pngou à tifftaper. Cela a résolu le problème. Vérifiez si vous entrez et écrivez calibresultdu même type. Si tel est le cas, changez simplement le type.

Bhanu Chander
la source
0

Sur OS XI réalisé, que si cv2.imread peut traiter "filename.jpg", il ne peut pas traiter "file.name.jpg". Étant novice en python, je ne peux pas encore proposer de solution, mais comme l'écrit François Leblanc, il s'agit plutôt d'une erreur de lecture silencieuse.

Il a donc un problème avec un point supplémentaire dans le nom de fichier et probablement d'autres signes également, comme avec "" (Espace) ou "%" et ainsi de suite.

Francis
la source
0

J'ai également constaté que si votre webcam ne se fermait pas correctement ou si quelque chose l'utilisait, CV2 donnera la même erreur. J'ai dû redémarrer mon ordinateur pour qu'il fonctionne à nouveau.

MNM
la source
0

La solution la plus simple pour supprimer cette erreur consistait à 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 d'anciens processus s'exécutant en arrière-plan.

Si l'image ne se trouve pas dans le répertoire de travail, elle ne fonctionnera pas non plus pour cela, essayez de placer le fichier image dans pwd dans le même dossier car il y a du code, sinon fournissez le chemin complet du fichier image ou du dossier.

Pour éviter ce problème à l'avenir, essayez de coder avec une gestion exceptionnelle de sorte que si une résiliation incorrecte se produit pour une raison aléatoire, le périphérique de capture soit libéré une fois le programme terminé.

Vinay Verma
la source
0

2015-05-27-191152.jpg << En regardant le format de votre image, j'ai parfois confondu .png et .jpg et j'ai rencontré la même erreur.

Hong Son Nguyen
la source
0

Je pense que parce que je ne cv2.imreadpeux pas lire l' .jpgimage, vous devez changer .jpgpour .png.

shenmeme
la source