2017-02-07 8 views
-1

Es gibt eine Reihe von Fragen über diese Funktion werfen Fehler, wie here und here aber ich denke, dass meine eine einzigartige Wendung hat. Ich versuche, alle Bilder in einem Ordner durchzugehen und Gesichter zu erkennen.OpenCV color_bgr2gray Fehler

import cv2 
import sys 
import os 

#Get the folder to be searched and the location of the cascade file from arguments 
imageDirectory = sys.argv[1] 
cascadePath = sys.argv[2] 
faceCascade = cv2.CascadeClassifier(cascadePath) 

#Iterate over the png files in the directory 
for imagePath in os.listdir(imageDirectory): 
    if imagePath.endswith(".png"): 
     image = cv2.imread(imagePath) 
     gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 

     faces = faceCascade.detectMultiScale(
      gray, 
      scaleFactor=1.1, 
      minNeighbors=5, 
      minSize=(30, 30) 
      #flags = cv2.CV_HAAR_SCALE_IMAGE 
     ) 

Das erste Bild korrekt verarbeitet werden, aber dann wird der zweite einen Fehler aus:

OpenCV Fehler: Assertion (SCN == 3 || SCN == 4) in cvtColor, fehlerhafte Datei/tmp/opencv3-20170202-24427-1s95vpr/modules/imgproc/src/color.cpp, Zeile 9748 Traceback (letzter Aufruf zuletzt): Datei "face_detect_flip.py", Zeile 22, in grey = cv2.cvtColor (Bild, cv2.COLOR_BGR2GRAY) cv2.error: /tmp/opencv3-20170202-24427-1s95vpr/modules/imgproc/src/color.cpp:9748: Fehler: (-215) SCN == 3 || scn == 4 in Funktion cvtColor

Die Dateien sind alle Farb .pngs so kann ich nicht sagen, warum das Skript auf einige von ihnen funktionieren, andere aber nicht. Manchmal ändert sich die Reihenfolge oder der Dateiname (aber nicht die Erweiterung), egal ob das Skript läuft oder nicht, aber nicht in irgendeinem Muster, das ich erkennen kann.

+0

Es kann nicht überraschen, dass 'cv2.imread' ein Bild nicht laden kann. Es ist eine gute Praxis, dies zu prüfen und diese Situation angemessen zu behandeln. Das schaffst du nicht. –

+0

Aber warum führt das Ändern des Dateinamens oder der Reihenfolge, in der Dateien geladen werden, zu Fehlern? Sicher, ich kann es testen, aber ich möchte es trotzdem irgendwann laden. – pgcudahy

+0

Das ist ziemlich schwierig zu sagen, ohne den relevanten Kontext zu haben, der in diesem Fall die Parameter ist, die Sie dem Programm und dem Inhalt des Verzeichnisses geben, das Sie ihm zur Verarbeitung mitteilen. Kannst du auch näher erläutern, was du unter "Ändern der Reihenfolge oder des Dateinamens" meinst? Vielleicht einige Beispiele dafür, was funktioniert und was nicht? | Offensichtlich möchten Sie es als einen Punkt laden. Einer der Gründe für den Test ist es, Probleme zu identifizieren, wenn sie auftreten - es ist viel aussagekräftiger, etwas wie "Fehler beim Laden der Datei foo.png" als der angezeigte Fehler zu sehen. –

Antwort

0

Aussehen wie das Bild, das diesen Fehler verursacht, nicht mehr als 3 (RGB-Bild) hat oder 4 (RGBA-Bild) -Kanäle. Die cvtColor Funktion benötigt das Bild, um mindestens 3 Kanäle zu haben, um es zu konvertieren.

Ein möglicher Grund könnte sein, dass die Datei nicht korrekt gelesen wird. Dies würde dazu führen, dass das variable Bild None ist und daher nicht die korrekte Anzahl an Kanälen hat.

Ein anderer Grund könnte sein, wenn das Bild weniger Kanäle hat. Vielleicht ist es ein Graustufenbild und hat daher nur einen Kanal.

Sie können drucken (image.shape) verwenden, um die Anzahl der Kanäle zu überprüfen. Wenn der Wert None lautet, wurde die Datei nicht korrekt gelesen.