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.

73
demandé sur gvlasov 2015-05-28 15:06:00

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)
84
répondu AdityaIntwala 2017-12-20 06:04:30

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
15
répondu Kalarav Parmar 2015-07-26 12:25:46
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)
5
répondu Gurkamal 2017-07-20 08:16:53

Transmettre Uniquement le nom de l'image, pas besoin de 0:

img=cv2.imread('sample.jpg')
3
répondu supriya junghare 2017-03-24 16:17:39

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.

3
répondu Farooq Khan 2017-06-16 03:44:15

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.

1
répondu François Leblanc 2018-02-07 14:15:51

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 
1
répondu ehivan24 2018-02-25 04:40:54
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.

1
répondu Shikhar Johri 2018-05-19 15:59:46

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

1
répondu Vivek Patwari 2018-10-08 12:55:34

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.

0
répondu Bhanu Chander 2017-03-12 12:45:31

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.

0
répondu Francis 2018-06-29 22:59:07

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.

0
répondu MNM 2018-08-03 06:23:04

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

0
répondu Vinay Verma 2018-08-15 07:58:27

2015-05-27-191152.jpg

0
répondu Hong Son Nguyen 2018-09-08 17:21:43

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

0
répondu shenmeme 2018-10-08 12:56:20

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)
-3
répondu Keerthana Gopalakrishnan 2016-03-03 08:23:43