FEHLER :! Leer () in der Funktion 'detectMultiScale'

Aug 15 2020

Ich habe den folgenden kleinen Code:

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)

Wenn ich die letzte Zelle (mit faces) starte, wird Folgendes ausgelöst:

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'

Bis zu dieser Zelle funktioniert alles gut. Laut einer StackOverflow- Antwort habe ich cv.data.haarcascades + in den Klammern von hinzugefügt cv.CascadeClassifier. Obwohl die Leute sagten, dass dies für sie funktioniert hat, funktioniert es für mich irgendwie nicht ...

Jede Hilfe wird geschätzt.

Antworten

Ewalldinho Aug 20 2020 at 05:30

imho, dieser "kleine Code" von dir hat bereits zu viel Rauschen (unnötige Codezeilen). Ich denke, es macht es für Sie noch schwieriger zu verstehen, was los ist.

Alle Zeilen außer diesen auskommentieren / löschen:

    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)  

Wenn Ihr Bild "dropfire" tatsächlich auf diesem Pfad vorhanden ist, sollte dies fehlerfrei funktionieren, es werden jedoch keine Ergebnisse der Gesichtserkennung angezeigt. Sie können diese Zeilen am Ende hinzufügen, um das Ergebnis anzuzeigen:

    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 hat bereits einen Pfad zu all diesen cv2-XML-Dateien, sodass Sie nur Dateinamen verwenden müssen.

SubramanyaKulal Dec 08 2020 at 00:17

Das Problem besteht darin, zu überprüfen, ob XML geladen ist oder nicht, und eye_cascade.empty()zu überprüfen, ob es geladen ist oder nicht.