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

88

J'essaye d'apprendre cv2 en python 2.7, mais quand j'exécute mon code, dans la partie spécifique de celui-ci:

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 renvoie 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 est que je dois charger la face_cascade dans le mauvais sens ... Une aide?

Arthurckl
la source
28
votre fichier xml est introuvable. essayez un chemin absolu comme "/my/files/bla/cacade.xml"
berak
@berak J'ai remplacé le chemin d'origine par celui que vous avez suggéré mais le code renvoie la même erreur
arthurckl
pouvez-vous vérifier que votre image n'est pas vide (par exemple si elle n'est pas chargée correctement) en ajoutant un test ou un affichage d'image?
Micka
2
Oh je comprends, j'ai écrit le chemin fila dans le mauvais sens. Merci pour l'aide !
arthurckl
1
J'ai le même problème et peu importe mes efforts, je n'ai pas pu le résoudre. Pouvez-vous nous dire comment vous avez résolu? @arthurckl
aysebilgegunduz

Réponses:

61

Le XML ou le fichier est manquant ou le chemin d'accès est incorrect ou le chemin create_capture est incorrect.

Les chemins dans l'exemple d'opencv 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')
La personne
la source
44

J'ai eu le même problème.

Je n'avais pas besoin de télécharger autre chose pour résoudre ce problème. CV2 avait tout ce dont j'avais besoin.

Au lieu d'essayer de déterminer où se trouvent les .xmlfichiers et de coder en dur les valeurs, j'ai utilisé une propriété donnée par cv2.

De OP

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

Devient

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
Mandelbrotter
la source
6
Cela devrait être marqué comme bonne réponse, cela m'aurait fait gagner du temps.
Joe Albowicz
2
Cela a parfaitement fonctionné, cela devrait être marqué correctement
Seaver Olson
Quelle erreur avez-vous obtenu @VIVID? Était-ce avec cv2.data.haarcascades ou avec cv2.CascadeClassifie?
Mandelbrotter
@Mandelbrotter Voici mon problème: stackoverflow.com/questions/63423843/…
VIVID
16

J'ai exécuté le même code. Il y a deux choses à noter ici. 1. Donnez le chemin complet des fichiers .xml. 2. Donnez une instruction d'événement de pression de touche à la fin.

Ajoutez ce bloc de code à la fin et exécutez votre fichier, cela a fonctionné 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 à ceci:

sortie

Keerthana Gopalakrishnan
la source
le chemin absolu pour moi était erroné devait inclure CWD (C: Drive / projectdirectory /) ie 'C: / Flask / venv / Lib / site-packages / cv2 / data /'
ThomasLYIT
11

Utilisez le chemin complet du fichier et utilisez "\\" au lieu de "\" dans le chemin du fichier xml.

Le chemin du fichier doit être le suivant:

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

Le fichier XML est manquant, vous pouvez obtenir le fichier à partir du 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 . Téléchargez simplement 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

avneesh mishra
la source
8

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

pas besoin de changer le code

téléchargez ce fichier .xml, puis mettez le chemin de ce fichier

cela résoudra l'erreur (100%)

Codeur
la source
5

Cette erreur signifie que le fichier XML est introuvable. La bibliothèque a besoin que vous lui transmettiez le chemin complet, même si vous utilisez probablement simplement un fichier fourni avec la bibliothèque OpenCV.

Vous pouvez utiliser le pkg_resourcesmodule intégré pour déterminer automatiquement cela pour vous. Le code suivant recherche le chemin complet vers un fichier à l'intérieur de l'endroit où le cv2module a été chargé:

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

Pour moi, c'était '/Users/andrew/.local/share/virtualenvs/foo-_b9W43ee/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml'; le vôtre est garanti différent. Laissez simplement la pkg_resourcesbibliothèque de python le comprendre.

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

Succès!

andrewdotn
la source
4

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.

Maître abeille
la source
3

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

face_cascade.empty()

S'il est vide, vous obtiendrez Trueet 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'
Vaibhav K
la source
3

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

Mon3
la source
2

Vous pouvez trouver ce type d'erreurs 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 ')"

Sahil Sharma
la source
2

Vous pouvez résoudre ce problème en plaçant XML dans le même répertoire dans lequel votre fichier python principal (d'où vous avez essayé d'inclure ce fichier) a été placé. Maintenant, l'étape suivante consiste à utiliser le chemin complet. Par exemple

Cela ne fonctionnera pas

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

Utilisez le chemin complet, maintenant cela fonctionnera bien

front_cascade = cv2.CascadeClassifier('/Users/xyz/Documents/project/haarcascade_eye.xml')
am2505
la source
2

J'ai trouvé cela dans une autre réponse, mais j'ai finalement travaillé pour moi lorsque j'ai ajouté les deux réponses.

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
la source
2

Vous avez juste besoin d'ajouter le chemin correct du haarcascade_frontalface_default.xmlfichier, c'est- à- dire que vous n'avez qu'à ajouter le préfixe ( cv2.data.haarcascades)

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
MashukKhan
la source
1
Cette approche a également fonctionné pour moi
Maf
1

Votre fichier XML est introuvable. Essayez d'utiliser des chemins absolus comme:

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

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 en utilisant le moteur de recherche de votre système d'exploitation, obtenez le chemin complet et placez-le comme argument en cv2.CascadeClassifiertant que chaîne

Niharranjan Pradhan
la source
1

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

Nagesh Singh Chauhan
la source
1

J'ai rencontré le même problème. mais a écrit le bon emplacement.

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

J'ai compris que je devais déclarer le chemin complet pour supprimer l'erreur.

face_cascade = cv2.CascadeClassifier('C:/pythonScript/Facial-Emotion-Detection/model/haarcascade_frontalface_default.xml')
kiLLua
la source
J'ai résolu mon problème! Combinez cela avec stackoverflow.com/a/3430395/3525780 et obtenez toujours le répertoire de travail actuel
Fusseldieb
0

J'ai eu le même problème avec opencv-pythonet j'ai utilisé un environnement virtuel. Si c'est votre cas, vous devriez trouver les xmlfichiers sur:

/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

Veuillez vous assurer que vous utilisez le chemin absolu. Sinon, cela ne fonctionnera pas.

lenhhoxung
la source
0

L'idée principale de la solution mentionnée ci-dessus: trouver le bon chemin du .xmlfichier et l'utiliser pour accéder correctement au fichier.

Dans mon cas, j'ai installé l'opencv dans anoconda env, d'abord directement sur le chemin d'Anoconda, puis

  • recherchez le chemin du .xmlfichier en utilisant:

    $ find . -name 'haarcascade_eye.xml' (par exemple, recherchez le haarcascade_eye.xmlfichier dans le répertoire actuel (.))

  • Ensuite, utilisez le retour path:

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

Xiaoyan Zhuo
la source
-1

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

Veuillez essayer 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()
Codemaker
la source