web-dev-qa-db-fra.com

erreur: (-215)! empty () dans la fonction detectMultiScale

J'essaie d'apprendre cv2 en python 2.7, mais lorsque je lance mon code, dans sa partie spécifique:

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)

il retourne ceci:

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

J'ai essayé de chercher la réponse ici mais le mieux que j'ai pu trouver, c'est que je dois charger le face_cascade dans le mauvais sens ... Une aide?

43
arthurckl

Le fichier XML ou le fichier est manquant ou son chemin est incorrect ou le chemin create_capture est incorrect.

Les chemins dans l'exemple ouvert ressemblent à ceci:

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

J'ai couru le même code. Il y a deux choses à noter ici . 1. Indiquez le chemin d'accès complet aux fichiers .xml . 2. Donner une instruction d'événement de touche à la fin.

Ajoutez ce bloc de code à la fin et lancez votre fichier, a travaillé pour moi:

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

Par exemple, mon code ressemblait à 

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

Ma sortie ressemblait à entrez la description de l'image ici

Le fichier XML est manquant, vous pouvez le récupérer dans le référentiel GitHub et le placer dans le même répertoire que votre projet. Le lien vers le dossier sur GitHub est ici . Il suffit de télécharger le fichier nommé haarcascade_frontalface_default.xml. En fait, le fichier existe sur votre système. Allez simplement dans le dossier site-packages de votre dossier d’installation Python et vérifiez le dossier cv2/data pour le fichier.

8
avneesh mishra

Si vous utilisez Anaconda, vous devez ajouter le chemin Anaconda.

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

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

Utilisez le chemin d'accès complet au fichier et utilisez "\\" au lieu de "\" dans le chemin du fichier XML.

Le chemin du fichier devrait être comme suit:

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

au lieu de: 

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

Sur OSX avec une installation homebrew, le chemin complet du dossier opencv devrait fonctionner:

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

Prenez soin du numéro de version dans le chemin.

3
Bernhard Essl

Vous pouvez trouver ce type d'erreur lorsque vous n'avez pas défini le chemin complet de votre fichier XML . Essayez celui-ci si vous utilisez opencv3.1.0 dans raspberrypi 3: " faceCascade = cv2.CascadeClassifier (' /home/pi/opencv-3.1.0/data/haarcascades/haarcascade_frontalface_default.xml ') "

2
Sahil Sharma

Probablement le face_cascade est vide. Vous pouvez vérifier si la variable est vide ou non en tapant la commande suivante:

face_cascade.empty()

Si c'est vide, vous aurez True et cela signifie que votre fichier n'est pas disponible dans le chemin que vous avez mentionné. Essayez d’ajouter le chemin complet du fichier XML comme suit:

r'D:\folder Name\haarcascade_frontalface_default.xml'
2
Vaibhav K

"\ Anaconda3\Lib\site-packages\cv2\data \" J'ai trouvé le fichier xml dans ce chemin pour Anaconda

2
My3

l'erreur peut être due au fait que les fichiers XML requis n'ont pas été chargés correctement. Recherchez le fichier haarcascade_frontalface_default.xml à l'aide du moteur de recherche de votre système d'exploitation, obtenez le chemin complet et mettez-le comme argument de cv2.CascadeClassifier sous la forme d'une chaîne. 

1

L'erreur se produit en raison de l'absence de fichiers XML ou du chemin d'accès incorrect du fichier XML. 

S'il vous plaît essayez le code suivant,

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

Votre fichier XML n'a pas été trouvé. Essayez d’utiliser des chemins absolus comme:

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

Veuillez ne pas copier coller le contenu du fichier xml, car une fois que vous le collez dans le bloc-notes, il sera enregistré dans un fichier texte. Donc, téléchargez directement le fichier à partir de la source donnée.

0