ERREUR:! Empty () dans la fonction 'detectMultiScale'

Aug 15 2020

J'ai le petit code suivant:

from google.colab import drive
from IPython.display import display
import PIL
from PIL import Image, ImageDraw
import kraken
from kraken import pageseg
import cv2 as cv

img = Image.open("/content/drive/My Drive/images/dropfire.jpg")

face_cascade = cv.CascadeClassifier(cv.data.haarcascades + "/content/drive/My Drive/datas/haarcascade_frontalface_default.xml")
eye_cascade = cv.CascadeClassifier(cv.data.haarcascades + "/content/drive/My Drive/datas/haarcascade_eye.xml")

file_name = "/content/drive/My Drive/images/dropfire.jpg"
img = cv.imread(file_name)
pil_img = Image.open(file_name)
cv_img = pil_img.convert('L')
cv_img = cv.imread(file_name)

faces = face_cascade.detectMultiScale(cv_img)

Quand je lance la dernière cellule (avec faces), cela soulève:

error                                     Traceback (most recent call last)
<ipython-input-23-2bd7582f8a20> in <module>()
----> 1 faces = face_cascade.detectMultiScale(cv_img)

error: OpenCV(4.1.2) /io/opencv/modules/objdetect/src/cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'detectMultiScale'

Jusqu'à ce que cette cellule tout fonctionne bien. Selon une réponse StackOverflow , j'ai ajouté cv.data.haarcascades + entre parenthèses cv.CascadeClassifier. Bien que les gens aient dit que cela fonctionnait pour eux, ce n'est pas pour moi en quelque sorte ...

Toute aide est appréciée.

Réponses

Ewalldinho Aug 20 2020 at 05:30

à mon humble avis, ce "petit code" de la vôtre a déjà trop de bruit (lignes de code inutiles). Je pense que cela vous rend encore plus difficile de comprendre ce qui se passe.

Commentez / supprimez toutes les lignes sauf celles-ci:

    import cv2 as cv
    
    face_cascade = cv.CascadeClassifier(cv.data.haarcascades + "haarcascade_frontalface_default.xml")
    eye_cascade = cv.CascadeClassifier(cv.data.haarcascades + "haarcascade_eye.xml")

    file_name = "/content/drive/My Drive/images/dropfire.jpg"
    img = cv.imread(file_name)  # this reads the image already
    
    cv_img = cv.imread(file_name) # this reads same image once more, not sure if intended
    faces = face_cascade.detectMultiScale(cv_img)  

Si votre image "dropfire" existe vraiment sur ce chemin, cela devrait fonctionner sans erreur, mais elle n'affichera aucun résultat de détection de visage. Vous pouvez ajouter ces lignes à la fin pour voir le résultat:

    for (x, y, w, h) in faces:
        cv.rectangle(cv_img, (x, y), (x+w, y+h), (0, 0, 255), 3)
    cv.imshow("Nice face", cv_img)
    cv.waitKey(0)

cv.data.haarcascades a déjà le chemin vers tous ces fichiers xml cv2, vous n'avez donc qu'à utiliser des noms de fichiers.

SubramanyaKulal Dec 08 2020 at 00:17

Le problème est de vérifier si XML est chargé ou non, utilisez eye_cascade.empty()pour vérifier s'il est chargé ou non.