Fehler: (-215)! empty () in der Funktion detectMultiScale

95

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?

arthurckl
quelle
28
Ihre XML-Datei wurde nicht gefunden. Versuchen Sie einen absoluten Pfad wie "/my/files/bla/cacade.xml"
berak
@berak Ich habe den ursprünglichen Pfad durch den von Ihnen vorgeschlagenen ersetzt, aber der Code gibt den gleichen Fehler zurück
arthurckl
Können Sie überprüfen, ob Ihr Bild nicht leer ist (z. B. wenn es nicht richtig geladen wurde), indem Sie einen Test oder eine Bildanzeige hinzufügen?
Micka
2
Oh, ich verstehe, ich habe den Fila-Pfad falsch geschrieben. Danke für die Hilfe !
Arthurckl
1
Ich habe das gleiche Problem und egal wie sehr ich es versucht habe, ich konnte es nicht lösen. Können Sie uns sagen, wie Sie gelöst haben? @arthurckl
Aysebilgegunduz

Antworten:

64

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')
Person
quelle
53

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 .xmlDateien 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')
Mandelbrotter
quelle
9
Dies sollte als richtige Antwort markiert werden, hätte mir Zeit gespart.
Joe Albowicz
4
Dies funktionierte perfekt, dies sollte als korrekt markiert werden
Seaver Olson
Welchen Fehler haben Sie @VIVID erhalten? War es mit cv2.data.haarcascades oder mit cv2.CascadeClassifie?
Mandelbrotter
@Mandelbrotter Hier ist mein Problem: stackoverflow.com/questions/63423843/…
VIVID
17

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:

Ausgabe

Keerthana Gopalakrishnan
quelle
Der absolute Pfad für mich war falsch, musste CWD (C: Laufwerk / Projektverzeichnis /) enthalten, dh 'C: / Flask / venv / Lib / site-packages / cv2 / data /'
ThomasLYIT
11

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")
Anubhav
quelle
11

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

Avneesh Mishra
quelle
8

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')
Ale
quelle
8

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

Codierer
quelle
5

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_resourcesModul können Sie dies automatisch für Sie ermitteln. Der folgende Code zeigt den vollständigen Pfad zu einer Datei an, in der das cv2Modul 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_resourcesBibliothek herausfinden.

classifier = cv2.CascadeClassifier(haar_xml)
faces = classifier.detectMultiScale(frame)

Erfolg!

andrewdotn
quelle
4

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.

Master Bee
quelle
3

Wahrscheinlich face_cascadeist das leer. Sie können überprüfen, ob die Variable leer ist oder nicht, indem Sie den folgenden Befehl eingeben:

face_cascade.empty()

Wenn es leer ist, erhalten Sie Trueund 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'
Vaibhav K.
quelle
3

"\ Anaconda3 \ Lib \ site-packages \ cv2 \ data \" Ich habe die XML-Datei in diesem Pfad für Anaconda gefunden

My3
quelle
3

Sie müssen nur den richtigen Pfad der haarcascade_frontalface_default.xmlDatei 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')
MashukKhan
quelle
2

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 ')"

Sahil Sharma
quelle
2

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')
am2505
quelle
2

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)
Dipak
quelle
1

Ihre XML-Datei wurde nicht gefunden. Versuchen Sie es mit absoluten Pfaden wie:

/path/to/my/file (Mac, Linux)
C:\\path\\to\\my\\file (Windows)
Clyde McQueen
quelle
1

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ür cv2.CascadeClassifierals Zeichenfolge an

Niharranjan Pradhan
quelle
1

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.

Nagesh Singh Chauhan
quelle
1

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')
kiLLua
quelle
Mein Problem gelöst! Kombiniere das mit stackoverflow.com/a/3430395/3525780 und erhalten Sie immer das aktuelle Arbeitsverzeichnis
Fusseldieb
0

Ich hatte das gleiche Problem mit opencv-pythonund habe eine virtuelle Umgebung verwendet. Wenn es Ihr Fall ist, sollten Sie die xmlDateien 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.

lenhhoxung
quelle
0

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 .xmlDatei mit:

    $ find . -name 'haarcascade_eye.xml' (Durchsuchen Sie beispielsweise die haarcascade_eye.xmlDatei im aktuellen Verzeichnis (.))

  • Verwenden Sie dann die Rückgabe path:

eye_cascade = cv2.CascadeClassifier(path + 'haarcascade_eye.xml')

Xiaoyan Zhuo
quelle
0

Ich hatte ein ähnliches Problem. Wenn Sie den Pfad zu XML korrigieren, verschwindet dieser Fehler.

Sagar Singh
quelle
Willkommen bei SO. Obwohl wir uns für Ihre Antwort bedanken, wäre es besser, wenn sie zusätzlich zu den anderen Antworten einen zusätzlichen Wert liefern würde. In diesem Fall bietet Ihre Antwort keinen zusätzlichen Wert, da bereits zahlreiche Antworten erwähnt wurden, die den Pfad zum XML ändern.
Doj
-1

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