Fehler beim Öffnen des Lebenslaufs: (-215) scn == 3 || scn == 4 in der Funktion cvtColor

89

Ich bin derzeit in Ubuntu 14.04 und verwende Python 2.7 und CV2.

Wenn ich diesen Code ausführe:

import numpy as np
import cv2

img = cv2.imread('2015-05-27-191152.jpg',0)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

es gibt zurück:

 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

Ich habe hier bereits gesucht und eine Antwort besagte, dass ich mein Foto möglicherweise falsch laden könnte, da es drei Dimensionen haben sollte: Zeilen, Spalten und Tiefe.

Wenn ich die img.shape drucke, werden nur zwei Zahlen zurückgegeben, also muss ich es falsch machen. Aber ich weiß nicht, wie ich mein Foto richtig laden soll.

arthurckl
quelle
11
img = cv2.imread('2015-05-27-191152.jpg',0)Der Parameter 0 lädt Ihr Bild bereits als 1-Kanal-Graustufenbild. Versuchen Sie es also img = cv2.imread('2015-05-27-191152.jpg')oder gray = cv2.imread('2015-05-27-191152.jpg',0)sehen Sie sich verschiedene Flags an: docs.opencv.org/modules/highgui/doc/…
Micka
Ich hatte auch dieses Problem, aber es stellte sich heraus, dass ich ein Leerzeichen ( .../eclipse\ footage/...) auf meinem Weg hatte. Das Hinzufügen eines ...,0)hat das Problem also nicht behoben.
Cody

Antworten:

101

Geben Sie den vollständigen Bildpfad mit Schrägstrich an. Es hat den Fehler für mich gelöst.

Z.B

import numpy as np
import cv2

img = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Wenn Sie 0beim Laden eines Bildes mit den Namen einen zweiten Parameter eingeben, cv2.imreadohne dass ein Bild mit konvertiert werden muss cvtColor, wird es bereits als Graustufenbild geladen, z.

import numpy as np
import cv2

gray = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg',0)
AdityaIntwala
quelle
5
Wenn Sie ein Bild von einer Kamera aufnehmen: Diese Fehlermeldung wird angezeigt, wenn auf die Kamera nicht zugegriffen werden kann.
ger.s.brett
... oder wenn Sie einen falschen Pfad zu Ihrer Videodatei angeben; P Ich bin auf dieses Problem gestoßen, als ich den Pfad für verdammte Fenster durcheinander gebracht habe (Schreiben von c: / anstelle von C: //)
fanny
17

Bitte wie unten einstellen

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
quelle
5
img = cv2.imread('2015-05-27-191152.jpg',0)

In der obigen Codezeile wird Ihr Bild im Graustufen-Farbmodell gelesen, da am Ende die 0 angehängt ist. Wenn Sie erneut versuchen, ein bereits graues Bild in ein graues Bild umzuwandeln, wird dieser Fehler angezeigt.

Verwenden Sie entweder den obigen Stil oder versuchen Sie es mit dem unten genannten Code:

img = cv2.imread('2015-05-27-191152.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Gurkamal
quelle
4

Geben Sie nur den Namen des Bildes ein, ohne dass Folgendes erforderlich ist 0:

img=cv2.imread('sample.jpg')
Supriya Junghare
quelle
4

Als erstes sollten Sie überprüfen, ob das Image im Stammverzeichnis vorhanden ist oder nicht. Dies ist hauptsächlich auf ein Bild mit einer Höhe von 0 zurückzuführen. Dies bedeutet, dass cv2.imread(imageName)das Bild nicht gelesen wird.

Farooq Khan
quelle
Diese Antwort löst mein Problem: Ich lese ein Video und es stoppt nicht automatisch, wenn das Video endet. Daher wird beim Versuch, ein cv2.cvtColorleeres Bild zu erstellen, der gleiche Fehler angezeigt .
Mikhail_Sam
2

Diese Fehlermeldung wurde aus völlig unabhängigen Gründen mit den in den anderen Antworten genannten Flags 0 oder 1 angezeigt. Man könnte es auch sein zu sehen , da cv2.imreadwird nicht Fehler aus , wenn der Pfad Zeichenfolge Sie es passieren kein Bild ist:

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

Sie sehen also einen cvtColorFehler, wenn es sich tatsächlich um einen stillen imreadFehler handelt. Denken Sie daran, wenn Sie das nächste Mal eine Stunde Ihres Lebens mit dieser kryptischen Metapher verschwenden .

Lösung

Möglicherweise müssen Sie überprüfen, ob Ihre Pfadzeichenfolge eine gültige Datei darstellt, bevor Sie sie an cv2.imreadfolgende Adresse übergeben :

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)

Auf diese Weise geschrieben, schlägt Ihr Code ordnungsgemäß fehl.

François Leblanc
quelle
1

Diese Antwort gilt für Personen, bei denen das gleiche Problem beim Zugriff auf die Kamera auftritt.

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()

Verwenden von Linux:

Wenn Sie versuchen, von Ihrem Computer aus auf die Kamera zuzugreifen, liegt höchstwahrscheinlich ein Berechtigungsproblem vor. Versuchen Sie, das Python-Skript mit sudo auszuführen, damit es behoben wird.

sudo python python_script.py

Führen Sie den folgenden Befehl aus, um zu testen, ob auf die Kamera zugegriffen werden kann.

ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video0 output.mkv 
ehivan24
quelle
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

Der obige Fehler ist das Ergebnis eines ungültigen Bildnamens oder wenn die Datei nicht im lokalen Verzeichnis vorhanden ist.

img = cv2.imread('2015-05-27-191152.jpg',0)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Auch wenn Sie das 2. Argument von cv2.imread () als '0' verwenden, wird es bereits in ein Graustufenbild konvertiert.

Der Unterschied zwischen der Konvertierung des Bildes durch Übergabe von 0 als Parameter und der Anwendung des Folgenden:

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

ist, dass in dem Fall img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY)die Bilder Bilder vom Typ 8uC1 und 32sC1 sind.

Shikhar Johri
quelle
1

Dieser Code für diejenigen, die das gleiche Problem beim Zugriff auf die Kamera haben, könnte mit einer Sicherheitsüberprüfung geschrieben werden.

if ret is True:
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
   continue

ODER falls Sie die Kamera schließen / abbrechen möchten, wenn ein Problem mit dem Rahmen selbst auftritt

if ret is True:
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
   break

Als Referenz https://github.com/HackerShackOfficial/AI-Smart-Mirror/issues/36

Vivek Patwari
quelle
0

Folgendes habe ich beobachtet, als ich meine eigenen Bildsätze im .jpgFormat verwendet habe. Im Beispielskript in OpenCV doc , beachten Sie, dass es die hat undistortund crop the imageZeilen wie folgt:

# 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)

Wenn wir den Code zum ersten Mal ausführen, wird die Zeile ausgeführt cv2.imwrite('calibresult.jpg',dst), calibresult.jpgin der ein Bild im aktuellen Verzeichnis gespeichert wird. Als ich den Code zum nächsten Mal zusammen mit meinen Beispielbildsätzen ausführte, die ich zum Kalibrieren der Kamera im JPG-Format verwendet habe, versuchte der Code auch, dieses neu hinzugefügte Bild zu berücksichtigen, calibresult.jpgaufgrund dessen der Fehler auftrat

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

Was ich getan habe war: Ich habe einfach das neu generierte Bild nach jedem Lauf gelöscht oder alternativ den Typ des Bildes geändert, um es zu sagen pngoder zu tifftippen. Das hat das Problem gelöst. Überprüfen Sie, ob Sie calibresultdenselben Typ eingeben und schreiben . Wenn ja, ändern Sie einfach den Typ.

Bhanu Chander
quelle
0

Unter OS XI wurde erkannt, dass cv2.imread zwar mit "filename.jpg" umgehen kann, "file.name.jpg" jedoch nicht verarbeiten kann. Als Anfänger in Python kann ich noch keine Lösung vorschlagen, aber wie François Leblanc schrieb, handelt es sich eher um einen stillen Fehler.

Es gibt also ein Problem mit einem zusätzlichen Punkt im Dateinamen und wahrscheinlich auch mit anderen Zeichen, wie mit "" (Leerzeichen) oder "%" und so weiter.

Francis
quelle
0

Ich habe auch festgestellt, dass CV2 denselben Fehler ausgibt, wenn Ihre Webcam nicht richtig geschlossen wurde oder etwas verwendet wird. Ich musste meinen PC neu starten, damit er wieder funktioniert.

MNM
quelle
0

Die einfachste Lösung zum Entfernen dieses Fehlers war das Ausführen des Befehls

cap.release()
cv2.closeAllWindows()

Das hat bei mir funktioniert und manchmal war auch ein Neustart des Kernels erforderlich, da alte Prozesse im Hintergrund ausgeführt wurden.

Wenn sich das Bild nicht im Arbeitsverzeichnis befindet, funktioniert es auch nicht. Versuchen Sie, die Bilddatei in pwd in demselben Ordner abzulegen, in dem sich Code befindet. Andernfalls geben Sie den vollständigen Pfad zur Bilddatei oder zum Ordner an.

Um dieses Problem in Zukunft zu vermeiden, versuchen Sie, mit außergewöhnlicher Handhabung zu codieren, damit das Erfassungsgerät nach dem Ende des Programms freigegeben wird, wenn aus irgendeinem zufälligen Grund eine falsche Beendigung auftritt.

Vinay Verma
quelle
0

2015-05-27-191152.jpg << Wenn ich auf Ihr Bildformat zurückblicke, habe ich gelegentlich zwischen .png und .jpg verwechselt und bin auf denselben Fehler gestoßen.

Hong Son Nguyen
quelle
0

Ich denke , es denn cv2.imreadnicht gelesen .jpgBild, das Sie ändern müssen .jpgzu .png.

Shenmeme
quelle