ERRORE:! Empty () nella funzione "detectMultiScale"

Aug 15 2020

Ho il seguente piccolo codice:

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)

Quando eseguo l'ultima cella (con faces), si solleva:

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'

Fino a quando questa cella non funziona tutto bene. Secondo una risposta di StackOverflow , ho aggiunto cv.data.haarcascades + tra parentesi cv.CascadeClassifier. Anche se le persone hanno detto che questo ha funzionato per loro, non per me in qualche modo ...

Qualsiasi aiuto è apprezzato.

Risposte

Ewalldinho Aug 20 2020 at 05:30

imho, quel tuo "piccolo codice" ha già troppo rumore (righe di codice non necessarie). Penso che ti renda ancora più difficile capire cosa sta succedendo.

Commenta / elimina tutte le righe tranne queste:

    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)  

Se la tua immagine "dropfire" esiste davvero in quel percorso, dovrebbe funzionare senza errori, ma non mostrerà alcun risultato del rilevamento del volto. Puoi aggiungere queste righe alla fine per vedere il risultato:

    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 ha già il percorso per tutti quei file xml cv2, quindi devi solo usare i nomi dei file.

SubramanyaKulal Dec 08 2020 at 00:17

Il problema è verificare se XML è caricato o meno, utilizzare eye_cascade.empty()per verificare se è caricato o meno.