ERROR:! Vacío () en la función 'detectMultiScale'

Aug 15 2020

Tengo el siguiente pequeño código:

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)

Cuando ejecuto la última celda (con faces), genera:

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'

Hasta que esta celda todo funcione bien. De acuerdo con una respuesta de StackOverflow , agregué cv.data.haarcascades + entre paréntesis de cv.CascadeClassifier. Aunque la gente dijo que esto funcionó para ellos, de alguna manera no es para mí ...

Se agradece cualquier ayuda.

Respuestas

Ewalldinho Aug 20 2020 at 05:30

En mi humilde opinión, ese "pequeño código" tuyo ya tiene demasiado ruido (líneas de código innecesarias). Creo que te hace aún más difícil entender lo que está pasando.

Comente / elimine todas las líneas excepto estas:

    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)  

Si su imagen "dropfire" realmente existe en esa ruta, esto debería funcionar sin errores, pero no mostrará ningún resultado de detección de rostros. Puede agregar estas líneas al final para ver el resultado:

    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 ya tiene una ruta a todos esos archivos xml cv2, por lo que solo necesita usar nombres de archivo.

SubramanyaKulal Dec 08 2020 at 00:17

El problema es verificar si XML está cargado o no, use eye_cascade.empty()para verificar si está cargado o no.