LỖI:! Blank () trong hàm 'detectorMultiScale'

Aug 15 2020

Tôi có đoạn mã nhỏ sau:

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)

Khi tôi chạy ô cuối cùng (với faces), nó tăng:

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'

Cho đến khi ô này hoạt động tốt. Theo câu trả lời của StackOverflow , tôi đã thêm vào cv.data.haarcascades + trong ngoặc đơn của cv.CascadeClassifier. Mặc dù mọi người nói rằng điều này có hiệu quả với họ, nhưng nó không có lợi cho tôi ...

Bất kỳ trợ giúp được đánh giá cao.

Trả lời

Ewalldinho Aug 20 2020 at 05:30

imho, "đoạn mã nhỏ" của bạn có quá nhiều nhiễu (những dòng mã không cần thiết) rồi. Tôi nghĩ nó khiến bạn càng khó hiểu chuyện gì đang xảy ra.

Nhận xét / xóa tất cả các dòng ngoại trừ những dòng này:

    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)  

Nếu "dropfire" hình ảnh của bạn thực sự tồn tại ở đường dẫn đó, điều này sẽ hoạt động mà không có lỗi, nhưng nó sẽ không hiển thị bất kỳ kết quả phát hiện khuôn mặt nào. Bạn có thể thêm những dòng này vào cuối để xem kết quả:

    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 đã có đường dẫn đến tất cả các tệp cv2 xml đó, vì vậy bạn chỉ cần sử dụng tên tệp.

SubramanyaKulal Dec 08 2020 at 00:17

Vấn đề là kiểm tra xem XML có được tải hay không, sử dụng eye_cascade.empty()để kiểm tra xem nó đã được tải hay chưa.