Ich versuche, cv2 in Python 2.7 zu lernen, aber wenn ich meinen Code ausführe, in dem spezifischen Teil davon:
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
img = cv2.imread('2015-05-27-191152.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
es gibt folgendes zurück:
File "face_detection.py", line 11, in <module>
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/objdetect/src/cascadedetect.cpp:1595: error: (-215) !empty() in function detectMultiScale
Ich habe versucht, die Antwort hier zu suchen, aber das Beste, was ich finden konnte, ist, dass ich die face_cascade falsch laden muss ... Hilfe?
python
python-2.7
opencv
image-recognition
arthurckl
quelle
quelle
Antworten:
Das XML oder die Datei fehlt oder der Pfad dazu ist falsch oder der Pfad create_capture ist falsch.
Die Pfade im opencv-Beispiel sehen folgendermaßen aus:
cascade_fn = args.get('--cascade', "../../data/haarcascades/haarcascade_frontalface_alt.xml") nested_fn = args.get('--nested-cascade', "../../data/haarcascades/haarcascade_eye.xml") cam = create_capture(video_src, fallback='synth:bg=../data/lena.jpg:noise=0.05')
quelle
Ich hatte das gleiche Problem.
Ich musste nichts anderes herunterladen, um dies zu lösen. CV2 hatte alles was ich brauchte.
Anstatt herauszufinden, wo sich die
.xml
Dateien befinden und die Werte fest zu codieren, habe ich eine von cv2 angegebene Eigenschaft verwendet.Von OP
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
Wird
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
quelle
Ich habe den gleichen Code ausgeführt. Hier sind zwei Dinge zu beachten. 1. Geben Sie den gesamten Pfad der XML-Dateien an. 2. Geben Sie am Ende eine Anweisung für ein Tastendruckereignis.
Fügen Sie diesen Codeblock am Ende hinzu und führen Sie Ihre Datei aus, die für mich funktioniert hat:
k = cv2.waitKey(0) if k == 27: # wait for ESC key to exit cv2.destroyAllWindows() elif k == ord('s'): # wait for 's' key to save and exit cv2.imwrite('messigray.png',img) cv2.destroyAllWindows()
Zum Beispiel sah mein Code so aus
import numpy as np import cv2 face_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_eye.xml') img = cv2.imread('lena.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) #faces = face_cascade.detectMultiScale(gray) for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] eyes = eye_cascade.detectMultiScale(roi_gray) for (ex,ey,ew,eh) in eyes: cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) cv2.imshow('img',img) k = cv2.waitKey(0) if k == 27: # wait for ESC key to exit cv2.destroyAllWindows() elif k == ord('s'): # wait for 's' key to save and exit cv2.imwrite('messigray.png',img) cv2.destroyAllWindows()
Meine Ausgabe sah folgendermaßen aus:
quelle
Verwenden Sie den gesamten Dateipfad und verwenden Sie "\\" anstelle von "\" im XML-Dateipfad.
Der Dateipfad sollte wie folgt sein:
face_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml')
Anstatt von:
cascade_fn = args.get('--cascade', "..\..\data\haarcascades\haarcascade_frontalface_alt.xml")
quelle
Die XML-Datei fehlt. Sie können die Datei aus dem GitHub-Repository abrufen und im selben Verzeichnis wie Ihr Projekt ablegen. Der Link zum Ordner auf GitHub ist hier . Laden Sie einfach die Datei mit dem Namen haarcascade_frontalface_default.xml herunter . Tatsächlich ist die Datei auf Ihrem System vorhanden. Gehen Sie einfach zum Site-Packages- Ordner Ihres Python-Installationsordners und überprüfen Sie den Ordner cv2 / data auf die Datei
quelle
Wenn Sie Anaconda verwenden, sollten Sie den Anaconda-Pfad hinzufügen.
new_path = 'C:/Users/.../Anaconda/Library/etc/haarcascades/' face_cascade = cv2.CascadeClassifier(new_path + 'haarcascade_frontalface_default.xml')
quelle
Der Code muss nicht geändert werden
Laden Sie diese XML-Datei herunter und geben Sie den Pfad dieser Datei ein
es wird den Fehler beheben (100%)
quelle
Dieser Fehler bedeutet, dass die XML-Datei nicht gefunden wurde. Für die Bibliothek müssen Sie den vollständigen Pfad übergeben, obwohl Sie wahrscheinlich nur eine Datei verwenden, die mit der OpenCV-Bibliothek geliefert wurde.
Mit dem eingebauten
pkg_resources
Modul können Sie dies automatisch für Sie ermitteln. Der folgende Code zeigt den vollständigen Pfad zu einer Datei an, in der dascv2
Modul geladen wurde:import pkg_resources haar_xml = pkg_resources.resource_filename( 'cv2', 'data/haarcascade_frontalface_default.xml')
Für mich war das
'/Users/andrew/.local/share/virtualenvs/foo-_b9W43ee/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml'
; Ihre ist garantiert anders. Lassen Sie es einfach die Python-pkg_resources
Bibliothek herausfinden.Erfolg!
quelle
Unter OSX mit einer Homebrew-Installation sollte der vollständige Pfad zum opencv-Ordner funktionieren:
face_cascade = cv2.CascadeClassifier('/usr/local/Cellar/opencv/3.4.0_1/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('/usr/local/Cellar/opencv/3.4.0_1/share/OpenCV/haarcascades/haarcascade_eye.xml')
Achten Sie auf die Versionsnummer im Pfad.
quelle
Wahrscheinlich
face_cascade
ist das leer. Sie können überprüfen, ob die Variable leer ist oder nicht, indem Sie den folgenden Befehl eingeben:Wenn es leer ist, erhalten Sie
True
und dies bedeutet, dass Ihre Datei in dem von Ihnen angegebenen Pfad nicht verfügbar ist. Versuchen Sie, den vollständigen Pfad der XML-Datei wie folgt hinzuzufügen:r'D:\folder Name\haarcascade_frontalface_default.xml'
quelle
"\ Anaconda3 \ Lib \ site-packages \ cv2 \ data \" Ich habe die XML-Datei in diesem Pfad für Anaconda gefunden
quelle
Sie müssen nur den richtigen Pfad der
haarcascade_frontalface_default.xml
Datei hinzufügen, dh Sie müssen nur das Präfix (cv2.data.haarcascades
) hinzufügen.face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
quelle
Möglicherweise finden Sie solche Fehler, wenn Sie nicht den vollständigen Pfad Ihrer XML-Datei definiert haben. Versuchen Sie dies, wenn Sie opencv3.1.0 in raspberrypi 3 verwenden: " faceCascade = cv2.CascadeClassifier ('/ home / pi / opencv-3.1.0 / data / haarcascades / haarcascade_frontalface_default.xml ')"
quelle
Sie können dieses Problem lösen, indem Sie XML in dasselbe Verzeichnis stellen, in dem sich Ihre Hauptpython-Datei (von der aus Sie versucht haben, diese Datei einzuschließen) befindet. Der nächste Schritt besteht nun darin, den vollständigen Pfad zu verwenden. Zum Beispiel
Dies wird nicht funktionieren
front_cascade = cv2.CascadeClassifier('./haarcascade_eye.xml')
Verwenden Sie den vollständigen Pfad, jetzt funktioniert es einwandfrei
front_cascade = cv2.CascadeClassifier('/Users/xyz/Documents/project/haarcascade_eye.xml')
quelle
Ich fand dies in einer anderen Antwort, arbeitete aber schließlich für mich, als ich die beiden Antworten hinzufügte.
import cv2 from matplotlib import pyplot as plt import numpy as np face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml") eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_eye.xml") img = cv2.imread('image1.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5)
quelle
Ihre XML-Datei wurde nicht gefunden. Versuchen Sie es mit absoluten Pfaden wie:
quelle
Der Fehler kann darauf zurückzuführen sein, dass die erforderlichen XML-Dateien nicht ordnungsgemäß geladen wurden. Suchen Sie
haarcascade_frontalface_default.xml
mit der Suchmaschine Ihres Betriebssystems nach der Datei, rufen Sie den vollständigen Pfad ab und geben Sie ihn als Argument fürcv2.CascadeClassifier
als Zeichenfolge anquelle
Bitte kopieren Sie den Inhalt der XML-Datei nicht, da er nach dem Einfügen in den Editor als Textdatei gespeichert wird. Laden Sie die Datei also direkt von der angegebenen Quelle herunter.
quelle
Ich bin auf das gleiche Problem gestoßen. schrieb aber den richtigen Ort.
face_cascade = cv2.CascadeClassifier('./model/haarcascade_frontalface_default.xml')
Ich habe herausgefunden, dass ich den vollständigen Pfad deklarieren muss, um den Fehler zu beheben.
face_cascade = cv2.CascadeClassifier('C:/pythonScript/Facial-Emotion-Detection/model/haarcascade_frontalface_default.xml')
quelle
Ich hatte das gleiche Problem mit
opencv-python
und habe eine virtuelle Umgebung verwendet. Wenn es Ihr Fall ist, sollten Sie diexml
Dateien finden unter:/home/username/virtual_environment/lib/python3.5/site-packages/cv2/data/haarcascade_frontalface_default.xml
/home/username/virtual_environment/lib/python3.5/site-packages/cv2/data/haarcascade_eye.xml
Bitte stellen Sie sicher, dass Sie den absoluten Pfad verwenden. Sonst funktioniert es nicht.
quelle
Die Hauptidee der Lösung wie oben erwähnt: Finden Sie den richtigen Weg der
.xml
Datei und verwenden Sie ihn, um korrekt auf die Datei zuzugreifen.In meinem Fall habe ich opencv in anoconda env installiert, zuerst direkt auf den Pfad von Anoconda, dann
Finden Sie den Pfad der
.xml
Datei mit:$ find . -name 'haarcascade_eye.xml'
(Durchsuchen Sie beispielsweise diehaarcascade_eye.xml
Datei im aktuellen Verzeichnis (.))Verwenden Sie dann die Rückgabe
path
:eye_cascade = cv2.CascadeClassifier(path + 'haarcascade_eye.xml')
quelle
Ich hatte ein ähnliches Problem. Wenn Sie den Pfad zu XML korrigieren, verschwindet dieser Fehler.
quelle
Der Fehler tritt auf, weil XML-Dateien fehlen oder der Pfad der XML-Datei falsch ist.
Bitte versuchen Sie den folgenden Code,
import numpy as np import cv2 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml') cap = cv2.VideoCapture(0) while 1: ret, img = cap.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] eyes = eye_cascade.detectMultiScale(roi_gray) for (ex,ey,ew,eh) in eyes: cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) cv2.imshow('img',img) k = cv2.waitKey(30) & 0xff if k == 27: break cap.release() cv2.destroyAllWindows()
quelle