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?


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

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

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


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

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


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

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


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!


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.


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'

3

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


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


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

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)

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

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)

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


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.


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

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.


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


-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()
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.