ERRORE:! Empty () nella funzione "detectMultiScale"
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
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.
Il problema è verificare se XML è caricato o meno, utilizzare eye_cascade.empty()
per verificare se è caricato o meno.