web-dev-qa-db-fra.com

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

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.

82
arthurckl

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)
90
AdityaIntwala

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
17
Kalarav Parmar
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)
5
Gurkamal

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.

4
Farooq Khan

Nommer que le nom de l’image, pas besoin de 0:

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

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 .

Solution

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.

2
François Leblanc
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.

1
Shikhar Johri

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 
1
ehivan24

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

1
Vivek Patwari

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.

0
MNM

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é.

0
Vinay Verma

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.

0
Hong Son Nguyen

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.

0
Bhanu Chander

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.

0
Francis

je le pense parce que cv2.imread ne peut pas lire .jpg image, vous devez changer .jpg en .png.

0
shenmeme