error: (-215)! empty () en la función detectMultiScale


88

Estoy tratando de aprender cv2 en python 2.7, pero cuando ejecuto mi código, en la parte específica:

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
 eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')


img = cv2.imread('2015-05-27-191152.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

devuelve esto:

File "face_detection.py", line 11, in <module>
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/objdetect/src/cascadedetect.cpp:1595: error: (-215) !empty() in function detectMultiScale

Traté de buscar la respuesta aquí, pero lo mejor que pude encontrar es que debo estar cargando face_cascade de manera incorrecta ... ¿Alguna ayuda?


28
su archivo xml no fue encontrado. pruebe una ruta absoluta como "/my/files/bla/cacade.xml"
berak

@berak reemplacé la ruta original por la que sugirió, pero el código devuelve el mismo error
arthurckl

¿Puede verificar que su imagen no esté vacía (por ejemplo, si no se cargó correctamente) agregando una prueba o visualización de imagen?
Micka

2
Oh, lo entiendo, escribí el camino de fila de la manera incorrecta. Gracias por la ayuda !
Arthurckl

1
Tengo el mismo problema y no importa cuánto lo intenté, no pude resolverlo. ¿Puedes decirnos cómo lo resolviste? @arthurckl
aysebilgegunduz

Respuestas:


61

Falta el XML o el archivo o la ruta es incorrecta o la ruta create_capture es incorrecta.

Las rutas de la muestra de opencv se ven así:

cascade_fn = args.get('--cascade', "../../data/haarcascades/haarcascade_frontalface_alt.xml")
nested_fn  = args.get('--nested-cascade', "../../data/haarcascades/haarcascade_eye.xml")

cam = create_capture(video_src, fallback='synth:bg=../data/lena.jpg:noise=0.05')

44

Tuve el mismo problema.

No necesité descargar nada más para solucionar esto. CV2 tenía todo lo que necesitaba.

En lugar de intentar averiguar dónde están los .xmlarchivos y codificar los valores, utilicé una propiedad dada por cv2.

Desde OP

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

Se convierte

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')

6
Esto debería estar marcado como respuesta correcta, me habría ahorrado tiempo.
Joe Albowicz

2
Esto funcionó perfectamente, esto debería marcarse como correcto
Seaver Olson

¿Qué error obtuviste @VIVID? ¿Fue con cv2.data.haarcascades o con cv2.CascadeClassifie?
Mandelbrotter

@Mandelbrotter Aquí está mi problema: stackoverflow.com/questions/63423843/…
VIVID

16

Ejecuté el mismo código. Hay dos cosas a tener en cuenta aquí. 1. Proporcione la ruta completa de los archivos .xml. 2. Dar una instrucción de evento de pulsación de tecla al final.

Agregue este bloque de código al final y ejecute su archivo, funcionó para mí:

k = cv2.waitKey(0)
if k == 27:         # wait for ESC key to exit
    cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
    cv2.imwrite('messigray.png',img)
    cv2.destroyAllWindows()

Por ejemplo, mi código parecía

import numpy as np
import cv2

face_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_eye.xml')

img = cv2.imread('lena.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.3, 5)
#faces = face_cascade.detectMultiScale(gray)

for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex,ey,ew,eh) in eyes:
        cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

cv2.imshow('img',img)

k = cv2.waitKey(0)
if k == 27:         # wait for ESC key to exit
    cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
    cv2.imwrite('messigray.png',img)
    cv2.destroyAllWindows()

Mi salida se veía así:

salida


La ruta absoluta para mí era incorrecta tenía que incluir CWD (C: Drive / projectdirectory /) es decir, 'C: / Flask / venv / Lib / site-packages / cv2 / data /'
ThomasLYIT

11

Use la ruta completa del archivo y use "\\" en lugar de "\" en la ruta del archivo xml.

La ruta del archivo debe ser la siguiente:

face_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml')

en vez de:

cascade_fn = args.get('--cascade', "..\..\data\haarcascades\haarcascade_frontalface_alt.xml")

11

Falta el archivo XML, puede obtener el archivo del repositorio de GitHub y colocarlo en el mismo directorio que su proyecto. El enlace a la carpeta en GitHub está aquí . Simplemente descargue el archivo llamado haarcascade_frontalface_default.xml . En realidad, el archivo existe en su sistema. Simplemente vaya a la carpeta de paquetes de sitio de su carpeta de instalación de Python y verifique la carpeta cv2 / data para el archivo


8

Si está utilizando Anaconda, debe agregar la ruta de Anaconda.

new_path = 'C:/Users/.../Anaconda/Library/etc/haarcascades/'

face_cascade = cv2.CascadeClassifier(new_path + 'haarcascade_frontalface_default.xml')

8

no es necesario cambiar el código

descargar ese archivo .xml, luego poner la ruta de ese archivo

solucionará el error (100%)


5

Este error significa que no se pudo encontrar el archivo XML. La biblioteca necesita que le pase la ruta completa, aunque probablemente solo esté usando un archivo que vino con la biblioteca OpenCV.

Puede utilizar el pkg_resourcesmódulo integrado para determinarlo automáticamente. El siguiente código busca la ruta completa a un archivo dentro del lugar desde donde cv2se cargó el módulo:

import pkg_resources
haar_xml = pkg_resources.resource_filename(
    'cv2', 'data/haarcascade_frontalface_default.xml')

Para mí esto fue '/Users/andrew/.local/share/virtualenvs/foo-_b9W43ee/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml'; el tuyo está garantizado para ser diferente. Deja que la pkg_resourcesbiblioteca de Python lo resuelva.

classifier = cv2.CascadeClassifier(haar_xml)
faces = classifier.detectMultiScale(frame)

¡Éxito!


4

En OSX con una instalación casera, la ruta completa a la carpeta opencv debería funcionar:

face_cascade = cv2.CascadeClassifier('/usr/local/Cellar/opencv/3.4.0_1/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('/usr/local/Cellar/opencv/3.4.0_1/share/OpenCV/haarcascades/haarcascade_eye.xml')

Tenga cuidado con el número de versión en la ruta.


3

Probablemente face_cascadeesté vacío. Puede verificar si la variable está vacía o no escribiendo el siguiente comando:

face_cascade.empty()

Si está vacío, obtendrá Truey esto significa que su archivo no está disponible en la ruta que mencionó. Intente agregar la ruta completa del archivo xml de la siguiente manera:

r'D:\folder Name\haarcascade_frontalface_default.xml'

3

"\ Anaconda3 \ Lib \ site-packages \ cv2 \ data \" Encontré el archivo xml en esta ruta para Anaconda


2

Puede encontrar este tipo de errores cuando no definió la ruta completa de su archivo XML. Pruebe este si está usando opencv3.1.0 en raspberrypi 3: " faceCascade = cv2.CascadeClassifier ('/ home / pi / opencv-3.1.0 / data / haarcascades / haarcascade_frontalface_default.xml ')"


2

Puede resolver este problema colocando XML en el mismo directorio en el que se colocó su archivo python principal (desde donde intentó incluir este archivo). Ahora, el siguiente paso es utilizar la ruta completa. Por ejemplo

Esto no funcionará

front_cascade = cv2.CascadeClassifier('./haarcascade_eye.xml')

Use la ruta completa, ahora funcionará bien

front_cascade = cv2.CascadeClassifier('/Users/xyz/Documents/project/haarcascade_eye.xml')

2

Encontré esto en alguna otra respuesta, pero finalmente funcionó para mí cuando agregué las dos respuestas.

import cv2
from matplotlib import pyplot as plt
import numpy as np
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_eye.xml")

img = cv2.imread('image1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)

2

Solo necesita agregar la ruta adecuada del haarcascade_frontalface_default.xmlarchivo, es decir , solo tiene que agregar el prefijo ( cv2.data.haarcascades)

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')

1
Este enfoque también funcionó para mí
Maf hace

1

No se encontró su archivo XML. Intente usar rutas absolutas como:

/path/to/my/file (Mac, Linux)
C:\\path\\to\\my\\file (Windows)

1

el error puede deberse a que los archivos xml necesarios no se han cargado correctamente. Busque el archivo haarcascade_frontalface_default.xml utilizando el motor de búsqueda de su sistema operativo, obtenga la ruta completa y colóquelo como argumento cv2.CascadeClassifiercomo cadena


1

No copie y pegue el contenido del archivo xml, porque una vez que lo pegue en el bloc de notas, se guardará como archivo de texto. Así que descargue directamente el archivo de la fuente dada.


1

Tuve el mismo problema. pero escribió la ubicación correcta.

face_cascade = cv2.CascadeClassifier('./model/haarcascade_frontalface_default.xml')

Descubrí que necesito declarar la ruta completa para eliminar el error.

face_cascade = cv2.CascadeClassifier('C:/pythonScript/Facial-Emotion-Detection/model/haarcascade_frontalface_default.xml')

¡Resolvió mi problema! Combine eso con stackoverflow.com/a/3430395/3525780 y obtenga siempre el directorio de trabajo actual
Fusseldieb

0

Tuve el mismo problema opencv-pythony usé un entorno virtual. Si es tu caso, deberías encontrar los xmlarchivos en:

/home/username/virtual_environment/lib/python3.5/site-packages/cv2/data/haarcascade_frontalface_default.xml

/home/username/virtual_environment/lib/python3.5/site-packages/cv2/data/haarcascade_eye.xml

Asegúrese de utilizar la ruta absoluta. De lo contrario, no funcionará.


0

La idea principal de la solución como se mencionó anteriormente: encuentre la ruta correcta del .xmlarchivo y utilícela para acceder al archivo correctamente.

En mi caso, instalé opencv en anoconda env, primero directo a la ruta de Anoconda, luego

  • encuentre la ruta del .xmlarchivo usando:

    $ find . -name 'haarcascade_eye.xml' (por ejemplo, busque el haarcascade_eye.xmlarchivo en el directorio actual (.))

  • Luego usa la devolución path:

eye_cascade = cv2.CascadeClassifier(path + 'haarcascade_eye.xml')


-1

El error se produce debido a que faltan archivos xml o una ruta incorrecta del archivo xml.

Prueba el siguiente código,

import numpy as np
import cv2

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

cap = cv2.VideoCapture(0)

while 1:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    for (x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]

        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex,ey,ew,eh) in eyes:
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

    cv2.imshow('img',img)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.