errore: (-215)! empty () nella funzione detectMultiScale


97

Sto cercando di imparare cv2 in python 2.7, ma quando eseguo il mio codice, nella parte specifica di esso:

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)

restituisce questo:

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

Ho provato a cercare la risposta qui, ma il meglio che ho trovato è che devo caricare face_cascade nel modo sbagliato ... Qualche aiuto?


28
il tuo file xml non è stato trovato. prova un percorso assoluto come "/my/files/bla/cacade.xml"
berak

@berak ho sostituito il percorso originale per quello che hai suggerito ma il codice restituisce lo stesso errore
arthurckl

puoi verificare che la tua immagine non sia vuota (es. se non caricata correttamente) aggiungendo un test o la visualizzazione dell'immagine?
Micka

2
Oh ho capito, ho scritto il percorso fila nel modo sbagliato. Grazie per l'aiuto !
Arthurckl

1
Ho lo stesso problema e non importa quanto ci abbia provato, non sono riuscito a risolverlo. Puoi dirci come hai risolto? @arthurckl
aysebilgegunduz

Risposte:


65

L'XML o il file mancano o il percorso non è corretto o il percorso create_capture non è corretto.

I percorsi nell'esempio di opencv hanno questo aspetto:

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

59

Ho avuto lo stesso problema.

Non ho bisogno di scaricare nient'altro per risolvere questo problema. CV2 aveva tutto ciò di cui avevo bisogno.

Invece di cercare di capire dove si trova il file .xml file e codificare i valori, ho usato una proprietà data da cv2.

Da OP

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

Diventa

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')

9
Questa dovrebbe essere contrassegnata come risposta corretta, mi avrebbe fatto risparmiare tempo.
Joe Albowicz

4
Questo ha funzionato perfettamente, dovrebbe essere contrassegnato come corretto
Seaver Olson

Quale errore hai ricevuto @VIVID? Era con cv2.data.haarcascades o con cv2.CascadeClassifie?
Mandelbrotter

@Mandelbrotter Ecco il mio problema: stackoverflow.com/questions/63423843/…
VIVID

17

Ho eseguito lo stesso codice. Ci sono due cose da notare qui. 1. Fornire l'intero percorso dei file .xml. 2. Dare un'istruzione all'evento di pressione del tasto alla fine.

Aggiungi questo blocco di codice alla fine ed esegui il tuo file, ha funzionato per me:

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

Ad esempio, il mio codice sembrava

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

Il mio output era così:

ouput


il percorso assoluto per me era sbagliato dovevo includere CWD (C: Drive / projectdirectory /) cioè 'C: / Flask / venv / Lib / site-packages / cv2 / data /'
ThomasLYIT

11

Utilizza l'intero percorso del file e utilizza "\\" invece di "\" nel percorso del file xml.

Il percorso del file dovrebbe essere il seguente:

face_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml')

invece di:

cascade_fn = args.get('--cascade', "..\..\data\haarcascades\haarcascade_frontalface_alt.xml")

11

Manca il file XML, puoi ottenere il file dal repository GitHub e inserirlo nella stessa directory del tuo progetto. Il collegamento alla cartella su GitHub è qui . Basta scaricare il file denominato haarcascade_frontalface_default.xml . In realtà, il file esiste sul tuo sistema. Vai al cartella site-packages della tua cartella di installazione di Python e controlla la cartella cv2 / data per il file


8

Se stai usando Anaconda dovresti aggiungere il percorso Anaconda.

new_path = 'C:/Users/.../Anaconda/Library/etc/haarcascades/'

face_cascade = cv2.CascadeClassifier(new_path + 'haarcascade_frontalface_default.xml')

8

non è necessario modificare il codice

scarica quel file .xml, quindi inserisci il percorso di quel file

risolverà l'errore (100%)


5

Questo errore indica che non è stato possibile trovare il file XML. La libreria richiede che tu gli passi il percorso completo, anche se probabilmente stai usando solo un file fornito con la libreria OpenCV.

Puoi usare il pkg_resourcesmodulo integrato per determinarlo automaticamente. Il codice seguente cerca il percorso completo di un file all'interno del punto da cui cv2è stato caricato il modulo:

import pkg_resources
haar_xml = pkg_resources.resource_filename(
    'cv2', 'data/haarcascade_frontalface_default.xml')

Per me questo era '/Users/andrew/.local/share/virtualenvs/foo-_b9W43ee/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml'; il tuo è garantito per essere diverso. Lascia che la pkg_resourceslibreria di Python lo capisca.

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

Successo!


4

Su OSX con un'installazione homebrew, il percorso completo della cartella opencv dovrebbe funzionare:

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

Prenditi cura del numero di versione nel percorso.


3

Probabilmente face_cascadeè vuoto. Puoi verificare se la variabile è vuota o meno digitando il seguente comando:

face_cascade.empty()

Se è vuoto otterrai Truee questo significa che il tuo file non è disponibile nel percorso che hai menzionato. Prova ad aggiungere il percorso completo del file xml come segue:

r'D:\folder Name\haarcascade_frontalface_default.xml'

3

"\ Anaconda3 \ Lib \ site-packages \ cv2 \ data \" Ho trovato il file xml in questo percorso per Anaconda


3

Devi solo aggiungere il percorso corretto del haarcascade_frontalface_default.xmlfile cioè devi solo aggiungere il prefisso ( cv2.data.haarcascades)

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')

2

Potresti trovare questo tipo di errori quando non hai definito il percorso completo del tuo file XML. Prova questo se stai usando opencv3.1.0 in raspberrypi 3: " faceCascade = cv2.CascadeClassifier ('/ home / pi / opencv-3.1.0 / data / haarcascades / haarcascade_frontalface_default.xml ')"


2

Puoi risolvere questo problema inserendo XML nella stessa directory in cui si trova il tuo file Python principale (da cui hai provato a includere questo file). Ora il passaggio successivo consiste nell'utilizzare il percorso completo. Per esempio

Questo non funzionerà

front_cascade = cv2.CascadeClassifier('./haarcascade_eye.xml')

Usa il percorso completo, ora funzionerà bene

front_cascade = cv2.CascadeClassifier('/Users/xyz/Documents/project/haarcascade_eye.xml')

2

L'ho trovato in qualche altra risposta, ma alla fine ha funzionato per me quando ho aggiunto le due risposte.

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

Il tuo file XML non è stato trovato. Prova a utilizzare percorsi assoluti come:

/path/to/my/file (Mac, Linux)
C:\\path\\to\\my\\file (Windows)

1

l'errore potrebbe essere dovuto al fatto che i file xml richiesti non sono stati caricati correttamente. Cerca il file haarcascade_frontalface_default.xml utilizzando il motore di ricerca del tuo sistema operativo, ottieni il percorso completo e mettilo come argomento cv2.CascadeClassifiercome stringa


1

Si prega di non copiare e incollare il contenuto del file xml, perché una volta incollato nel blocco note verrà salvato come file di testo. Quindi scarica direttamente il file dalla fonte specificata.


1

Mi sono imbattuto nello stesso problema. ma ha scritto la posizione corretta.

face_cascade = cv2.CascadeClassifier('./model/haarcascade_frontalface_default.xml')

Ho capito che devo dichiarare il percorso completo per rimuovere l'errore.

face_cascade = cv2.CascadeClassifier('C:/pythonScript/Facial-Emotion-Detection/model/haarcascade_frontalface_default.xml')

Risolto il mio problema! Che si combinano con stackoverflow.com/a/3430395/3525780 e sempre ottenere la directory di lavoro corrente
Fusseldieb

0

Ho avuto lo stesso problema con opencv-pythone ho utilizzato un ambiente virtuale. Se è il tuo caso, dovresti trovare i xmlfile in:

/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

Assicurati di utilizzare il percorso assoluto. Altrimenti non funzionerà.


0

L'idea principale della soluzione come sopra menzionata: trova il percorso giusto del file .xml file e usalo per accedere correttamente al file.

Nel mio caso ho installato l'opencv in anoconda env, prima direttamente sul percorso di Anoconda, poi

  • trova il percorso di .xml file utilizzando:

    $ find . -name 'haarcascade_eye.xml' (ad esempio cerca il haarcascade_eye.xmlfile nella directory corrente (.))

  • Quindi usa il ritorno path:

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


0

Ho affrontato un problema simile. Sembra che la correzione del percorso a XML faccia scomparire questo errore.


Benvenuto in SO. Anche se ti ringraziamo per la tua risposta, sarebbe meglio se fornisse un valore aggiuntivo oltre alle altre risposte. In questo caso, la tua risposta non fornisce un valore aggiuntivo, poiché ci sono molte risposte già menzionate cambiando percorso all'XML.
Doj

-1

L'errore si verifica a causa della mancanza di file xml o di un percorso errato del file xml.

Prova il codice seguente,

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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.