BŁĄD:! Pusty () w funkcji „DetectMultiScale”
Mam następujący mały kod:
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)
Kiedy uruchamiam ostatnią komórkę (z faces
), podnosi:
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'
Do tej komórki wszystko działa dobrze. Zgodnie z odpowiedzią StackOverflow dodałem cv.data.haarcascades +
w nawiasach cv.CascadeClassifier
. Chociaż ludzie mówili, że to zadziałało dla nich, jakoś nie dla mnie ...
Każda pomoc jest mile widziana.
Odpowiedzi
imho, ten twój „mały kod” ma już za dużo szumu (niepotrzebnych wierszy kodu). Myślę, że to jeszcze trudniej ci zrozumieć, co się dzieje.
Skomentuj / usuń wszystkie wiersze oprócz tych:
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)
Jeśli twój obraz "dropfire" naprawdę istnieje na tej ścieżce, powinno to działać bez błędów, ale nie pokaże żadnych wyników wykrywania twarzy. Możesz dodać te wiersze na końcu, aby zobaczyć wynik:
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 ma już ścieżkę do wszystkich tych plików xml cv2, więc wystarczy użyć nazw plików.
Problem polega na tym, aby sprawdzić, czy XML jest załadowany, czy nie, użyj, eye_cascade.empty()
aby sprawdzić, czy jest załadowany, czy nie.