ERREUR:! Empty () dans la fonction 'detectMultiScale'
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
à 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.
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.