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?
python
python-2.7
opencv
image-recognition
Arthurckl
fuente
fuente
Respuestas:
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')
fuente
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
.xml
archivos 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')
fuente
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í:
fuente
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")
fuente
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
fuente
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')
fuente
no es necesario cambiar el código
descargar ese archivo .xml, luego poner la ruta de ese archivo
solucionará el error (100%)
fuente
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_resources
módulo integrado para determinarlo automáticamente. El siguiente código busca la ruta completa a un archivo dentro del lugar desde dondecv2
se 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 lapkg_resources
biblioteca de Python lo resuelva.¡Éxito!
fuente
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.
fuente
Probablemente
face_cascade
esté vacío. Puede verificar si la variable está vacía o no escribiendo el siguiente comando:Si está vacío, obtendrá
True
y 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'
fuente
"\ Anaconda3 \ Lib \ site-packages \ cv2 \ data \" Encontré el archivo xml en esta ruta para Anaconda
fuente
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 ')"
fuente
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')
fuente
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)
fuente
Solo necesita agregar la ruta adecuada del
haarcascade_frontalface_default.xml
archivo, 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')
fuente
No se encontró su archivo XML. Intente usar rutas absolutas como:
fuente
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 argumentocv2.CascadeClassifier
como cadenafuente
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.
fuente
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')
fuente
Tuve el mismo problema
opencv-python
y usé un entorno virtual. Si es tu caso, deberías encontrar losxml
archivos 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á.
fuente
La idea principal de la solución como se mencionó anteriormente: encuentre la ruta correcta del
.xml
archivo 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
.xml
archivo usando:$ find . -name 'haarcascade_eye.xml'
(por ejemplo, busque elhaarcascade_eye.xml
archivo en el directorio actual (.))Luego usa la devolución
path
:eye_cascade = cv2.CascadeClassifier(path + 'haarcascade_eye.xml')
fuente
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()
fuente