OpenCV Assertion Fehlgeschlagener Fehler: (-215) scn == 3 || scn == 4 in der Funktion cv :: cvtColor funktioniert ALTERNATE mal

8

Ich bin ein Anfänger in Python und OpenCV. Ich probiere einen Code aus, der ein Bild von der Webcam aufnimmt. Das Folgende ist das Stück Code.

%Vor%

Ich benutze sowohl Python 2.7 und Python 3.4, um dies auszuführen. In beiden habe ich ein seltsames Problem. Der Code gibt eine Assertion Fehler wie folgt

  

OpenCV Fehler: Assertion fehlgeschlagen (scn == 3 || scn == 4) in cv :: cvtColor, Datei ........ \ opencv \ modules \ imgproc \ src \ color.cpp, Zeile 3737       grau = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY)   cv2.error: ........ \ opencv \ modules \ imgproc \ src \ color.cpp: 3737: Fehler: (-215) scn == 3 || scn == 4 in der Funktion cv :: cvtColor

aber es passiert nur bei jeder ALTERNATE-Laufzeit. Was könnte das Problem sein? Ich habe von anderen Posts gelesen, dass dieser Fehler auftritt, wenn cv2.cvtColor versucht, ein leeres Bild zu konvertieren, das nicht 3 oder 4 Kanäle hat. Dies geschieht normalerweise, wenn ein falscher Pfad angegeben wird. Für meinen Fall, da es JEDE ALTERNATIVE Zeit gut funktioniert, kann die Quelle nicht falsch sein. Bitte helfen Sie!

    
naiveDeveloper 19.06.2014, 07:02
quelle

2 Antworten

6

Zumindest finde ich kein größeres Problem in Ihrem Code, d. h. "sollte funktionieren". Das Problem scheint im Kameratreiber zu liegen. Kameras sind anders und Kameratreiber sind anders (a.k.a. Buggy).

Leider ist das Debuggen des Kameratreibers keine leichte Aufgabe. Das seltsame Verhalten ist höchstwahrscheinlich an die spezifische Version von Kamera, Betriebssystem, OpenCV und Kameratreiber gebunden. Es ist nicht sehr wahrscheinlich, dass der Treiber repariert werden kann. Versuche einfach alles auf dem neusten Stand zu halten.

Da Ihre Kamera jedoch jedes zweite Bild erfassen kann, müssen Sie etwas tun.

Stellen Sie zunächst sicher, dass das Problem tatsächlich im Kameratreiber liegt, indem Sie ersetzen:

%Vor%

von

%Vor%

Wie aus dem Code ersichtlich ist, zwingt dies die Kamera dazu, simuliert zu werden. Die Funktion create_capture ist nur ein Wrapper um VideoCapture , um diese Funktionalität bereitzustellen. Wenn Ihr Code damit einwandfrei funktioniert, liegt das Problem im Grafiktreiber.

Nachdem Sie das überprüft haben, können Sie versuchen, den folgenden Code auszuführen:

%Vor%

Dies sollte eine Liste von 100 Wahrzeichen erstellen, und der Vorgang sollte ein paar Sekunden dauern, da die Kamera 100 aufeinanderfolgende Bilder erfassen soll.

In deinem Code scheinst du nicht den ersten Wert im Rückkehrtupel von cam.read ( ret in deinem Code) zu verwenden. Es ist True , wenn das Bild wirklich aufgenommen wurde. Außerdem sollte cam.read so lange blockieren, bis ein Bild verfügbar ist und keine Verzögerungen hinzugefügt werden müssen.

Wahrscheinlich wirst du eine Liste [True, False, True, False, ...] bekommen, weil der Videotreiber etwas Seltsames macht. Es gibt keinen schönen Weg, das zu beheben, aber es gibt einen hässlichen. Ersetzen Sie Ihre Erfassungslinie durch:

%Vor%

Natürlich ist der Treiber möglicherweise so kaputt, dass Sie ihn gelegentlich freigeben und wieder öffnen müssen. Sogar hässlicher, aber machbar.

Zusammenfassung: "Höchstwahrscheinlich kann es nicht geheilt werden, es bringt dich nicht um, und es gibt Medikamente, um die Symptome zu lindern."

    
DrV 21.06.2014, 06:58
quelle
1

Verwenden Sie time.sleep(2) , bevor Sie die while-Schleife oder cap.read() eingeben. Diese Zeit hilft Ihrer Kamera, hochzufahren.

    
Maddoxx 30.04.2015 06:15
quelle

Tags und Links