EROR:! Empty () dalam fungsi 'detectMultiScale'

Aug 15 2020

Saya memiliki kode kecil berikut:

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)

Ketika saya menjalankan sel terakhir (dengan faces), itu memunculkan:

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'

Sampai sel ini semuanya bekerja dengan baik. Menurut jawaban StackOverflow , saya menambahkan cv.data.haarcascades + tanda kurung cv.CascadeClassifier. Meskipun orang mengatakan ini berhasil untuk mereka, itu tidak untuk saya entah bagaimana ...

Setiap bantuan dihargai.

Jawaban

Ewalldinho Aug 20 2020 at 05:30

imho, "kode kecil" milik Anda itu sudah terlalu berisik (baris kode yang tidak perlu). Saya pikir itu membuat Anda lebih sulit untuk memahami apa yang sedang terjadi.

Beri komentar / hapus semua baris kecuali ini:

    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)  

Jika gambar Anda "dropfire" benar-benar ada di jalur itu, ini akan bekerja tanpa kesalahan, tetapi tidak akan menampilkan hasil deteksi wajah apa pun. Anda dapat menambahkan garis-garis ini di akhir untuk melihat hasilnya:

    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 sudah memiliki jalur ke semua file xml cv2 tersebut, jadi Anda hanya perlu menggunakan nama file.

SubramanyaKulal Dec 08 2020 at 00:17

Masalahnya adalah untuk memeriksa apakah XML dimuat atau tidak, gunakan eye_cascade.empty()untuk memeriksa apakah itu dimuat atau tidak.