282

Reconocimiento facial con OpenCV + webcam

openCV_face

“El sujeto de pruebas 255-C corrió por el largo pasadizo de pulcro y brillante color blanco hacia su salvación. Al final, la puerta automática con el símbolo de “Salida” se abrió. ¡Por fin…!

Una auténtica lástima que detrás se escondiera la torreta 94-H5A, diseñada para detectar seres humanos mediante algoritmos de Haar, eliminarlos y cantar una hermosa aria italiana en el proceso. O cara mia, addio!”

 

Después de esta introducción tan literaria debo decir que no vamos a construir una adorable torreta automática. El tutorial de hoy consistirá en escribir un código con OpenCV y Python para detectar rostros con una webcam en tiempo real. Para ello utilizaremos un algoritmo de Haar, que ya nos viene implementado por defecto con OpenCV.


Antes de empezar… ¿cómo funciona el reconocimiento facial de OpenCV?

Para legos: OpenCV utiliza un conjunto de “bloques” para reconocer formas llamados Haar-like features (“características de tipo Haar”. Sí, es una traducción pésima). Por ejemplo, algunas de estas formas pueden ser:

haar-like_features

 

El algoritmo busca en la imagen combinaciones de estos patrones. Por ejemplo, si queremos detectar un rostro, como es en nuestro caso, el algoritmo buscará en la imagen la combinación de estos bloques que, si se juntan, se aproximan a un rostro:

haarcascade

 

Este sistema tiene un porcentaje de aciertos bastante alto, aunque su éxito también dependerá del tipo de cámara utilizada, la iluminación de la sala, etc.


Tutorial:

En primer lugar vamos a necesitar una webcam configurada y funcional. En este aspecto sí que no puedo ayudarte, hay muchos tipos de webcam y ordenadores, así que la configuración dependerá de tu modelo.

También debemos tener instalada la librería de OpenCV para Python.

Ahora hay que descargar los archivos haarcascade. Estos archivos en formato .xml son los “modelos” que utiliza OpenCV para detectar rostros humanos (aunque podríamos crear nuevos modelos para detectar peces, plátanos, gatos…).

Sin embargo, estos archivos .xml algunas veces no son importados correctamente cuando utilizamos OpenCV-Pyhton del sistema, así que recomiendo bajar las haarcascades desde este enlace y guardarlas en un directorio que recordemos. Tendremos que decirle a la función cv2.CascadeClassifier() la ruta a nuestro fichero .xml.

 


#Ejemplo de deteccion facial con OpenCV y Python
#Por Glare
#www.robologs.net
 
import numpy as np
import cv2
 
#Cargamos la plantilla e inicializamos la webcam:
# !!! RECUERDA CAMBIAR EL PATH DEL ARCHIVO .xml POR EL TUYO!!!
face_cascade = cv2.CascadeClassifier('/home/glare/rostrosCV/haarcascade_frontalface_alt.xml')
cap = cv2.VideoCapture(0)
 
while(True):
    #Leemos un frame y lo guardamos
    valido, img = cap.read()

    #Si el frame se ha capturado correctamente, continuamos
    if valido:
 
	    #Convertimos la imagen a blanco y negro
	    img_gris = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
	 
	    # Buscamos las coordenadas de los rostros (si los hay) y
	    # guardamos su posicion
	    array_rostros = face_cascade.detectMultiScale(img_gris, 1.3, 5)
	 
	    # Iteramos el array de rostros y pintamos un recuadro alrededor de
	    # cada uno
	    for (x,y,w,h) in array_rostros:
	    	    cv2.rectangle(img,(x,y),(x+w,y+h),(125,255,0),2)
	 
	    #Mostramos la imagen
	    cv2.imshow('img',img)
	     
	    #Con la tecla 'q' salimos del programa
	    if cv2.waitKey(1) & 0xFF == ord('q'):
	    	    break
cap.release()
cv2.destroyAllWindows()

Y ejecutamos nuestro código. Si todo ha funcionado bien, deberíamos ver nuestro careto dentro de un recuadro de color verde. Si no, intenta moverte o cambiar la iluminación de la habitación.

Si te surgió algún problema al seguir al tutorial no dudes en comentar y te responderé lo más rápido posible.

Actualización 3/11/2016: Resolución de errores frecuentes con OpenCV+Python

Gl4r3

Brillante, luminosa y cegadora a veces, Glare es tan artista como técnica. Le encanta dar rienda suelta a sus módulos de imaginación y desdibujar los ya de por si delgados límites que separan el mundo de la electrónica y el arte. Su mayor creación hasta la fecha es un instrumento capaz de convertir los colores y la luz en música. Cuándo sus circuitos no están trabajando en una nueva obra electrónica, le gusta dedicar sus ciclos a la lectura o a documentar sus invenciones para beneficio de los humanos. Sus artilugios favoritos son aquellos que combinan una funcionalidad práctica con un diseño elegante y artístico.

282
Deja un comentario

avatar
109 Hilos iniciados
173 Respuestas a hilos
1 Followers
 
Most reacted comment
Hottest comment thread
111 Nº autores comentarios
Gl4r3MildredDavidSebastian J.Abenajmin Autores de comentarios recientes
más nuevos primero más antiguos primero
Mildred
Humano
Mildred

Como resuelvo este error??

Traceback (most recent call last):
File “D:/DocumentosR/IngnieriaOpenCV/facial.py”, line 25, in
array_rostros = face_cascade.detectMultiScale(img_gris, 1.3, 5)
error: C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\objdetect\src\cascadedetect.cpp:1634: error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale

Mildred
Humano
Mildred

como descargo los archivos .xml

David
Humano
David

Buen dia, estoy realizando un proyecto de detección de piezas malas y buenas , tengo un modelo ya preentrenado con algunas imágenes que he tomado, lo que quiero es saber como puedo hacer para que me detecte en tiempo real y me indique en el frame si es pieza mala o buena. Tendría que usar un modelo de estos ya entrenados? ya que no he encontrado como implementarlo.

benajmin
Humano
benajmin

Buen dia, tengo un problema, me aparece este mensaje al ejecutar el codigo, me podrian ayudar.

Traceback (most recent call last):
File “prueba1.py”, line 21, in
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
cv2.error: OpenCV(4.1.0) /tmp/build_opencv/opencv/modules/objdetect/src/cascadedetect.cpp:1658: error: (-215:Assertion failed) !empty() in function ‘detectMultiScale’

Sebastian J.A
Humano
Sebastian J.A

Me salia ese mismo error, la solucion simplemente es poner la ruta donde se encuentra haarcascade_frontalface_alt.xml ( No es solo guardarla en la misma carpeta dónde vayamos a guardar nuestro código en Python.)
Ej.
face_cascade = cv2.CascadeClassifier(‘C:\\Users\\USUARIO\\Desktop\\Proyecto \\haarcascade_frontalface_alt.xml’)

Pablo
Humano
Pablo

Esta muy bien, pero tengo una pregunta, será posible que al reconocer el rostro se pueda mandar señales a un Arduino conectado a la computadora para que este realice alguna acción como escribir un mensaje en una pantalla LCD o algo parecido?

Agradecería que me ayuden con eso!

Pablo
Humano
Pablo

Me pueden ayudar con eso, por favor!

Josué
Humano
Josué

El código me funcionó muy bien, solo que me gustaría agregarle una base de datos que autentique a la persona que esta dentro del recuadro verde, vi otro código en GitHub pero me genera errores en ciertas librerías y rutas, ¿crees que pueda ser un poco más fácil que el código que vi?
Link:
https://github.com/futurelabmx/FaceRecognition2

Marcos Maximiliano Tafura
Humano
Marcos Maximiliano Tafura

Buenas soy estudiante de ing mecatronica ind quisiera saber si se podria aplicar esto a un arduino o comprometeria la integridad del programa, a parte de poder hacer una transferencia a dos servos para hacer un seguimiento una vez detectado el rostro.
desde ya muchas gracias sos crack!!.

David Gonzalez
Humano
David Gonzalez

Buen dia amigo, muy buen trabajo.
tengo dos preguntas como podria mejorarlo ya que con lenes puestos no me detecta el rostro, y como recortaria la imagen para solo guardar la seccion de la cara ya sea con video o con foto

jose
Humano
jose

Este programa se podria editar para que ne vez de que detecte un rostro haga la deteccion de 3 rostros?

daniel
Humano
daniel

me aparece este erroralguien me podria ayudar ?
Traceback (most recent call last):
File “C:/Users/Daniel/Desktop/prueba.py”, line 21, in
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
cv2.error: OpenCV(4.1.0) C:\projects\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1658: error: (-215:Assertion failed) !empty() in function ‘cv::CascadeClassifier::detectMultiScale’

Emmanuel
Humano
Emmanuel

ImportError: DLL load failed: No se puede encontrar el módulo especificado.

Emmanuel
Humano
Emmanuel

listo desaparecio el error, pero surgio otro:
import numpy as np

Marco Carbajal
Humano
Marco Carbajal

debes descargar la librería de numpy

Emmanuel
Humano
Emmanuel

Por que me sale error en la linea 34-cv2-destroyAllWindows() y aparte se activa la camara pero no se ve nada

Emmanuel
Humano
Emmanuel

cv2-destroyAllWindows()

lupe
Humano
lupe

Oye y si quisiera poner un filtro como los de snapchat (imagen png) de algun personaje o culaquier imagen sobre el reconocimiento facial encontrado como seria ???
de antemano te agradesco tu respuesta !!!

Juan
Humano
Juan

Que tal buena noche, ejecuto el programa en python y me marca error al exportar numpy error “Traceback (most recent call last):
File “C:\Users\kynky\.platformio\python27\reconocimiento.py”, line 1, in
import numpy as np
ImportError: No module named numpy”

Jon Trueba
Humano
Jon Trueba

Me da este error y no entiendo a que se debe.
VIDIOC_STREAMON: Invalid argument
Traceback (most recent call last):
File “/home/pi/Desktop/Reconocimiento facial/Código Python.py”, line 19, in
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.error: OpenCV(3.4.4) /home/pi/packaging/opencv-python/opencv/modules/imgproc/src/color.cpp:181: error: (-215:Assertion failed) !_src.empty() in function ‘cvtColor’

Andrade
Humano
Andrade

hola, quiero saber como hacer que el rostro me lo encierre en un circulo y no en un retangulo, porque he estado intentando y no puedo. Alguien puede ayudarme??

Gonzalo
Humano
Gonzalo

OpenCV Error: Assertion failed (!empty()) in cv::CascadeClassifier::detectMultiScale, file C:\builds\master_PackSlaveAddon-win32-vc12-static\opencv\modules\objdetect\src\cascadedetect.cpp, line 1634
Traceback (most recent call last):
File “C:\Users\… \__init__.py”, line 21, in
faces = face_cascade.detectMultiScale(gray, 1.3, 5) cv2.error: C:\builds\master_PackSlaveAddon-win32-vc12 static\opencv\modules\objdetect\src\cascadedetect.cpp:1634: error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale

Hola amigo, estoy con este problema, no estoy dándome cuenta como solucionarlo, alguna idea? Desde ya muchas gracias..

chrissmen
Humano
chrissmen

Yo esto usando visual studio code y resolví ese error ejecutando el programa como administrador, suerte!

Ing. Manuel Ramirez
Humano

Hola que tal. que pasaria si yo quisiera tener una base de datos con personas ya registradas y que el sistema detectara a esa persona he indicara su nombre y numero de serie y aperture una puerta por ejemplo. que necesitaria y si tiene sun codigo sencillo de ejemplo o un lugar para ilustrarme al respecto

Marlon
Humano
Marlon

Te recomiendo que explores esta libreria: https://github.com/ageitgey/face_recognition

1Ns8y
Humano
1Ns8y

OpenCV Error: Parsing error (haarcascade_frontalface_default.xml(7): Valid XML should start with ”) in icvXMLParse, file /build/opencv-ISmtkH/opencv-2.4.9.1+dfsg/modules/core/src/persistence.cpp, line 2252

error in the same code . how can i resolve this problem

andres
Humano
andres

try save the haarcascade and your code in the same folder

sebastian piñera
Humano
sebastian piñera

Traceback (most recent call last):
File “/home/pi/holacara.py”, line 17, in
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
error: /build/opencv-U1UwfN/opencv-2.4.9.1+dfsg1/modules/imgproc/src/color.cpp:3737: error: (-215) scn == 3 || scn == 4 in function cvtColor

me sale esto

TD28
Humano
TD28

Hola, muchas gracias Gl4r3 por este articulo, solo queria preguntar como se puede hacer un archivo tipo haarcascades si quiero reconocer ciertos objetos??, de antemano, gracias.

Un ciudadano
Humano
Un ciudadano

Buenas, soy nuevo en esto de OpenCV y Python y me surgía la duda de si podría hacer un zoom y detectar exclusivamente la pupila pues los haarcascades que he encontrado detectan todo el ojo.
Gracias de antemano

Toni
Humano
Toni

hola GL4R3, no se mucho sobre python y openCV, pero este tema de reconocimiento facial se puede aplicar el en reconocimiento de letras??
¿tambien se tendria que utilizar haarcascade? de antemano gracias por este articulo

Toni
Humano
Toni

hola GL4R3, no se mucho sobre python y openCV, pero este tema de reconocimiento facial se puede aplicar el en reconocimiento de letras??
¿tambien se tendria que utilizar haarcascade? de antemano gracias por este articulo.

Jesus Garcia
Humano
Jesus Garcia

Hola, buenas noches.
Habría posibilidad de detectar los parpadeos de una persona?

Abraham Rivera
Humano
Abraham Rivera

hay forma de detectar a la “persona” con reconocimiento facial, lo que quiero es qe funcione como huella digital, se que el margen de error puede ser alto, pero con que sea 70 me parece bien.

jorge
Humano
jorge

a mi me sale error faces = face_cascade.detectMultiScale(gray, 1.3, 5) en esta linea

Luis Enrique
Humano
Luis Enrique

Hola que tal buen dia, disculpa, tu sabrás como realizar en imágenes la detección de colores, me sugirieron utilizar eigenvectores, pero ni idea, según vi, lo utilizan en detección y autenticación de rostros, pero no tengo ni idea, podrias orientarme??

ALEJANDRO ACOSTA
Humano
ALEJANDRO ACOSTA

EL LINK DEL CODIGO ORIGINAL DE RECONOCIMIENTO FACIAL ESTA CAIDO

santiago
Humano
santiago

una pregunta en realidad no se donde buscar, como puedo hacer que no me reconozca fotografias, que solo reconozca rostros autenticos. gracias

Édgar Felipe
Humano
Édgar Felipe

Muchas gracias por compartir este proyecto. Quiero hacer uso de él, pero implementándolo para que mande esa imagen por correo electrónico, es decir que se presione un botón, tome la foto, pero si en esta no hay rostro, no la mandé y se encienda un Led rojo. Respecto a el tema de enviar por correo electrónico, ya tengo conocimiento, lo haré con la librería SMTP. La cuestión no es detectar un rostro, sino cualquiera en general. Solo quiero que detecte que haya una cara ahí en la foto. Cómo puedo utilizar este código para algo así? Muchas gracias. 🙂

MarioTavarez
Humano
MarioTavarez

Hola super interesante y muy bien explicado, quería preguntarte sobre como podría cargar una imagen por ejemplo de un carro y con la camara web mientras este grabando yo mostrarle 2 imagenes una con el carro que le cargue en la imagen y otra con una moto y me reconozca la imagen del carro y la empiece a seguir de tal modo que no la pierda algo como esto: https://software.intel.com/sites/landingpage/realsense/camera-sdk/v1.1/documentation/html/index.html?doc_ot_object_tracking.html

Miguel
Humano
Miguel

Hola eres una mujer super brillante. Soy nuevo en esto y me has ayudado bastante. Tengo una consulta, algun tip para comparar una botella que visualizo a través de mi camaraweb :(( Necesito compararla con otra botella pero estoy atorado, ya le saco el borde a la botella del video pero ya no se que hacer con ella, ojala me puedas ayudar :(((

richard
Humano
richard

hola en caso de querer hacer un reconocimiento del iris de los ojos como podria ser el codigo gracias 😀

samantha
Humano
samantha

hola me sale este error sabrias porque
Traceback (most recent call last):
File “C:/Users/DELL/Desktop/prueba.py”, line 7, in
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
error: ……..opencvmodulesimgprocsrccolor.cpp:3737: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor

simon
Humano
simon

por que me sale este error HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP

Eduardo
Humano
Eduardo

Hola. Muy buen tutorial. Consulta. Es muy complicado encender un led con una raspberry pi que se encienda con un rostro en particular y no cuando detecte cualquier rostro??

Ronald
Humano
Ronald

Hola, De antemano gracias por compartir tus conocimientos, muy buen blog. Pasando a otro tema, necesito colaboración con un trabajo para la universidad, me piden monitorear a un bebé durmiendo y que cuando éste se mueva 5 veces dentro de 10 segundos, me indique que está realizando esta acción. Ya estoy haciendo reconocimiento facial gracias a este blog, pero el problema radica en que además de reconocer o visualizar un rostro, necesito que de alguna forma el programa me informe de movimientos del rostro dentro de un tiempo determinado. Todo esto lo debo implementar con una raspberry pi y su… Leer más »

f3rm1n
Humano
f3rm1n

Hola Gl4r3,

De nuevo yo aqui, es normal que vaya algo lento con la deteccion de rostros lo que estoy implementando es reproducir un sonido que actua en cuanto reconoce un rostro mandando señal a un arduino indicando de igual manera que detecto un rostro, tengo retardo de 1 a 1.5 segundos aproximadamente.

En todo caso que podria hacer para que sea mas fluido todo el proceso.

¿O aun asi es muy pesado el proceso?

B4lt4r
Humano
B4lt4r

Estimado Gl4r3, te felicito por tu dedicacion a difundir estos temas… mi consulta es si puedes indicarme, si existe alguna libreria/funcion o codigo de ejemplo de comparacion 2 imagenes distintas de un mismo rostro inferir que es la misma persona. desde ya gracias!

f3rm1n
Humano
f3rm1n

Hola GL4R3, este código me ayudó muchísimo sólo que ahora igual que el comentario de abajo quiero utilizar la detección de rostro y activar ya sea un led o un motor, de cualquier índole. No se si me explicó bien, tener una variable que pueda manipular a mi antojo e buscado en varias fuentes y e tratado de modificar el código con la detección de colores, y no e tenido éxito quisiera que nos ayudarás con este problema, muy buena página todo me funcionó tal y como dice obvió instalando todas las librerías sin más por el momento gracias por… Leer más »

Omar
Humano
Omar

Hola Gl4r3 tu codigo esta excelente pero quiero trabajarlo mas y e tratado de cuando detecte un rostro lo pueda usar como una variable…
ejemplo:

deteccion de rostros (1)
deteccion de rostros (2)

dependiendo de las circunstancias y a esa variable poderla meter en una indicacion de un while o un for en todo caso cuando detecte el rostro quiero activar mas cosas me gustaria que pudieses ayudarme tengo todo instalado sin problemas utilizo ubuntu 14.04.5 y un arduino nano

de antemano gracias buenas noches

Edward
Humano
Edward

Hola Gl4r3, tengo un problema con la conversión a gris, me da un error que dice:

Traceback (most recent call last):
File “/home/pi/Desktop/Proyectos/Otros/deteccion_picamera.py”, line 14, in
gray = cv2.cvtColor(img, cv2.COLOR_BRG2GRAY)
error: /home/pi/opencv-2.4.9/modules/imgproc/src/color.cpp:3737: error: (-215) scn == 3 || scn == 4 un function cvtColor

¿Qué significa esto?

Gracias por tu ayuda 🙂

Marco
Humano
Marco

Hola, primeramente muchas gracias por el tutorial super bien explicado. mi pregunta es como conseguiría por ejemplo : pongo un color rojo en la cámara y que me encienda un led de ese color o en vez de colocar un “color rojo” un rostro y que me lo reconozca y encienda un led

Edward
Humano
Edward

Hola, te pregunto, ¿cómo hago para que me detecte con la cámara pi?

Antonio
Humano
Antonio

Antes de nada quería decir que es un buen tutorial, me gustaría que cuando encuentre un rostro, se escuchará rostro encontrado u otro mensaje ¿Seria posible hacer eso a través del comando espeak o alguno parecido? Muchas gracias

osmer
Humano
osmer

muy buenas noche disculpe soy nuevo en este mundo de la programación y no se casi nada y me quede trabado descargando ‘haarcascade_frontalface_alt.xml’ no se como descargarla y ya tengo sin de sin mentira una semana en esto y se que la comunidad es burlista pero de verdad pido disculpa por mi ignorancia que la dejo evidenciada aquí y por favor le pido a alguien su ayuda y si critican que sean constructiva y me puedan dar la solución definitiva y de ante mano muchas gracias

julio
Humano
julio

Hola…mira siempre he trabajado opencv en visualstudio y todo ha funcionado correctamente pero decidi cambiarme a python . El problema que he tenido es con videocapture(0) – uso python 2.7 y opencv 2.4.13. Cuando realizo la deteccion de rostros en imagen todo funciona, pero al tratar de ussar mi webcam externa (usb) el resultado de videocapture(0) o videocapture(-1) siempre es una imagen negra aun cuadno el ret es TRUE. El videocapture opera bien cuando utilizo un .avi..hay no hay probelma, pero con mi webcam no pasa nada, el codigo implementado es el siguiente: import numpy as np import cv2 import… Leer más »

julio
Humano
julio

hola