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?


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

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

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


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

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


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

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


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!


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.


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'

3

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


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

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


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

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)

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)

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


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.


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

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.


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


0

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


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()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.