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?

Arthurckl
fuente
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')
Persona
fuente
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')
Mandelbrotter
fuente
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

Keerthana Gopalakrishnan
fuente
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")
Anubhav
fuente
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

avneesh mishra
fuente
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')
Cerveza inglesa
fuente
8

no es necesario cambiar el código

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

solucionará el error (100%)

Descifrador
fuente
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!

andrewdotn
fuente
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.

Abeja maestra
fuente
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'
Vaibhav K
fuente
3

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

Mi3
fuente
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 ')"

Sahil Sharma
fuente
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')
am2505
fuente
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)
Dipak
fuente
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')
MashukKhan
fuente
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)
Clyde McQueen
fuente
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

Niharranjan Pradhan
fuente
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.

Nagesh Singh Chauhan
fuente
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')
kiLLua
fuente
¡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á.

Lenhhoxung
fuente
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')

Xiaoyan Zhuo
fuente
-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()
Codemaker
fuente