ERROR:! Vacío () en la función 'detectMultiScale'
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
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.
El problema es verificar si XML está cargado o no, use eye_cascade.empty()
para verificar si está cargado o no.