191

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_featuresEl 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 son los “modelos” de rostros humanos. Podemos crear nuevos modelos, si queremos, para detectar peces, plátanos, gatos… Sin embargo, estos archivos algunas veces no son importados correctamente cuando utilizamos OpenCV-Pyhton del sistema, así que recomiendo bajar las haarcascades desde este enlace y guardarlas en la misma carpeta dónde vayamos a guardar nuestro código en Python.

Si estamos en Linux, también podemos descargar la última versión de OpenCV (en el momento en que redacto esto es la 2.4.9) desde la página web oficial de OpenCV,guardar el archivo, descomprimirlo y copiar los archivos que hay dentro de data->haarcascades en el directorio dónde vayamos a guardar nuestro código en python. También podemos guardarlos en cualquier otro lugar y escribir la ruta en el código.

El código que utilizaremos es una variante escrita por una servidora del código oficial para detectar rostros en imágenes estáticas.


#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:
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
cap = cv2.VideoCapture(0)

while(True):
    #leemos un frame y lo guardamos
    ret, img = cap.read()

    #convertimos la imagen a blanco y negro
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    #buscamos las coordenadas de los rostros (si los hay) y
    #guardamos su posicion
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    #Dibujamos un rectangulo en las coordenadas de cada rostro
    for (x,y,w,h) in faces:
        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.

Antes de comentar, por favor, lee las Normas

191 Comentarios en "Reconocimiento facial con OpenCV + webcam"

avatar
Ordenar por:   más nuevos primero | más antiguos primero
samantha
Humano

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

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

Eduardo
Humano

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
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

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

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
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

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

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

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

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

Antonio
Humano

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

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
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

hola

fermin
Humano

Me sale el siguiente error:
OpenCV Error: Parsing error (haarcascade_frontalface_alt.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
Traceback (most recent call last):
File “facial.py”, line 11, in
face_cascade = cv2.CascadeClassifier(‘haarcascade_frontalface_alt.xml’)
cv2.error: /build/opencv-ISmtkH/opencv-2.4.9.1+dfsg/modules/core/src/persistence.cpp:2252: error: (-212) haarcascade_frontalface_alt.xml(7): Valid XML should start with ” in function icvXMLParse

Henry Vanderhorst
Humano

Gracias me sirvió de mucho y buenos días!!! necesito ayuda
como puedo conectar una base de datos, por ejemplo: cuando me ponga al frente me salga un texto diciendo mi nombre, como puedo?

Nacho
Humano
Hola!! muchas gracias por los tutoriales, la verdad es que contigo es muy fácil!!! Estoy intentando guardar la cara recortada en disco pero me da un error de NameError: name ‘x’ is not defined cuando esta definido más arriba. Te pedo el código. Muchas Gracias!!! import cv2 face_cascade = cv2.CascadeClassifier(‘haarcascade_frontalface_alt.xml’) cap = cv2.VideoCapture(0) while(True): ret,imag =cap.read() gray = cv2.cvtColor(imag,cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray,1.3,5) for (x,y,w,h) in faces: cv2.rectangle(imag,(x,y),(x+w,y+h),(125,255,0),2) imagen_recortada = imag[x:w, y:h] cv2.imshow(‘Imagen’, imag) if cv2.waitKey(1) & 0xFF ==ord(‘q’): break cap.release() cv2.destroyAllWindows()
Papamono
Humano

Excelente aporte, tengo una consulta
Cuando reconoce el rostro.
¿Cómo podría recortar el rostro?

Cosa de que en vez de dibujar un rectángulo en el rostro, lo recortara.

Muchas gracias!

jason
Humano

Hola

Jasson
Humano

Hola buen dia, excelente aporte. Una duda, quiero implementar un condicional dentro del programa, es decir:
if(faces):
dibuja el rectangulo
else:
print(“No detecto ningun rostro”)

Pero me arroja un error en el if, debido a que es un array o tupla .
Eh buscado pero no eh encontrado la solución.
Gracias

DIEGO H
Humano

Hola! Muchas Gracias por tu aporte!
Tengo el siguiente error:

raceback (most recent call last):
File “C:Python27Libsite-packagesrec_caras.py”, line 9, in
face_cascade = cv2.CascadeClassifier(‘haarcascade_frontalface_alt.xml’)
error: C:buildsmaster_PackSlaveAddon-win32-vc12-staticopencvmodulescoresrcpersistence.cpp:2220: error: (-212) haarcascade_frontalface_alt.xml(5): Valid XML should start with ” in function icvXMLParse

Difusa
Humano

Hola buenas noches, de antemano muchas gracias por el tutorial ha sido de mucha ayuda; al correr el codigo me sale el siguiente error:
Traceback (most recent call last):
File “”, line 11, in
cv2-destroyAllWindows()
NameError: name ‘destroyAllWindows’ is not defined
Espero contar con su ayuda muchas gracias

Luis Gerardo
Humano

Hola que tal! buenos días, tengo un pequeño problema al ejecutar el programa, al momento de de correr me aparece un problema en la linea 12, necesito de su apoyo profesional para solucionarlo, agradecería mucho su asesoramiento para este problema, muchas gracias por su atención y tiempo, un cordial y afectuoso saludo

Presento el error marcado el ejecutar:
Traceback (most recent call last):
File “C:/Python27/programas/d4.py”, line 12, in
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
error: C:buildsmaster_PackSlaveAddon-win32-vc12-staticopencvmodulesobjdetectsrccascadedetect.cpp:1634: error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale

Luis Gerardo
Humano

Traceback (most recent call last):
File “C:/Python27/programas/d4.py”, line 12, in
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
error: C:buildsmaster_PackSlaveAddon-win32-vc12-staticopencvmodulesobjdetectsrccascadedetect.cpp:1634: error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale

David Cantillo
Humano

Buenas, al momento de ejecutar los códigos de reconocimiento de rostros,cuando son estáticos me aparece la imagen pero no se crea el recuadro y cuando es como vídeo, puedo hacer que funcione la cámara pero también no aparece los recuadros alrededor del rostro.He tenido errores con códigos que funcionan, y tengo las últimas versiones de opencv y numpy, la verdad no sé que puede pasar,me gustaría si alguien tiene una solución.

Julio Rodriguez
Humano

buenas noches me gusto esto se puede aplicar con la raspicam? yo supongo que si pero como donde podriamos el codigo para leer la raspicam? espero me puedas responder

polenorht
Humano

hola! estoy haciendo algo parecido, en Open cv con Visual Studio 2010, me imagino que cambia todo por no ser python, no? me podrías ayudar? Gracias!

Marcelo
Humano

Consulta, en “haarcascade_frontalface_alt.xml” se guardan solamente las características, o además están los algoritmos de AdaBoost para optimizar la detección? O eso es aparte? Estuve leyendo la bibliografía pero no está muy claro.
Agradezco la atención!

Andres Castrillon
Humano

Hola, disculpa yo quiero utilizar para el reconocimiento de rostros una raspi cam, como cambiaría el programa para hacer esta adaptación? Gracias por la atención.

Jesus
Humano

Hola buen dia, espero me puedas ayudar, para poder calibrar una webcam usb existe algun codigo para hacerlo usando python y opencv , algun software o metodo ya que es para mi proyecto, necesito datos como el angulo de vision , distancia focal … gracias

Nicolas
Humano
Hola Gl4r3, gracias por tus tutoriales me han servido de mucho para lo que estoy haciendo. Siguiendo esta linea quisiera pedir tu ayuda para recrear este codigo con otro de tu repertorio, este es :”Interacción entre OpenCV y Arduino con pySerial”. asi en envez de encender un led al reconocer un color intento lo haga cuando reconozca una persona. Intente modificar este codigo pero me arroja error de formato de codigo, no me aplico mucho en arduino la verdad pero no creo que requiera mayores cambios. es al momento de enviar/compilar en python que se me da el error. si… Leer más »
Jhornan
Humano

Excelente… Gracias por todo….!!!!

Jesus Maldonado
Humano
Hola GLARE, mis sinceras felicitaciones y agradecimientos por tu labor y esfuerzo incansable para esta grandiosa comunidad. No te queda calificativo mas corto que una persona Altruista y Filantropo, ya que sin pedir nada a cambio das y das conocimientos a todos sin esperar nada a cambio; y a pesar de algunas dudas que a cualquiera desesperarían por contestar por la estulticia que denotan, tu con toda calma, paciencia y tranquilidad respondes sin escatimar nada ni a nadie. Me congratulo de haber llegado a este blog y conocer a una persona de tu categoría humana (aunque tu creas que no… Leer más »
Matheoz
Humano

Hola, ya pude ejecutar el ejemplo, esta muy bien, Gracias. Tengo una pregunta: ¿como le hago para hacer una coincidencia, un match? Es decir, ya tengo el recuadro de la imagen, ahora quiero comparar esa cara con una foto que tengo precargada en una img.

Matias
Humano

Hola un gusto tener este tipo de paginas a la disposicion!! tengo una consulta, como puedo contar las caras con el face detected?? el ejemplo va de maravilla todo funciona OK, pero ahora quier contabilizar las caras que aparecen y que pueda aparecer el numero en pantalla?? he estado tratando de declarar como una funcion pero no funciona para nada

gabriel
Humano

Saludos
Excelente aporte el codigo funciona bien
utilize windows 10, python 2.7.11, opencv 3.0 fue un fastidio la compatibilidad …

Tengo un duda hice una modificacion de manera que guarde el rostro de la persona, pero utilizo una tecla para la funcion (cv2.imwrite), creo que se podria terminar el while de manera que cuando detecte el rostro termine, sera que me podrias ayudar?

Anónimo
Humano

Hola que tal!!.. Gracias por tu aporte …pero tengo una duda, en esta linea de codigo : faces = face_cascade.detectMultiScale(gray, 1.3, 5)

Me da el siguiente error:
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):

Andrés
Humano

Hola, primero que todo me gustaría felicitarlos por su página. Llegué a ella buscando ayuda y ya le dí la vuelta por todos los tutoriales interesantes que hay. Mi consulta es ¿hay forma de utilizar la webcam para reconocer guiños? De antemano muchas gracias, saludos.

William
Humano

me podrias ayudar con el comentario anterior que te escribi, estoy haciendo un proyecto y no lo puedo correr correctamente. Me podrias decir en que puedo modificar para que pueda correrse.

William
Humano
def mostrar1(): #cargamos la plantilla e inicializamos la webcam: face_cascade = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’) cap = cv2.VideoCapture(0) while(True): #leemos un frame y lo guardamos ret, img = cap.read() #convertimos la imagen a blanco y negro gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #buscamos las coordenadas de los rostros (si los hay) y #guardamos su posicion faces = face_cascade.detectMultiScale(gray, 1.3, 5) #Dibujamos un rectangulo en las coordenadas de cada rostro for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(125,255,0),2) #Mostramos la imagen cv2.imshow(‘webcam’,img) #con la tecla ‘q’ salimos del programa if cv2.waitKey(1) & 0xFF == ord(‘q’): break cap.release() cv2.destroyAllWindows() Al correr el codigo me sale el siguiente mensaje: OpenCV Error:… Leer más »
Luisa
Humano

Buenas Noches, estoy corriendo el programa y me sale el siguiente error
quisiera saber porque se produce esto. De antemano gracias

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
error: ..\..\..\..\opencv\modules\imgproc\src\color.cpp:3737: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor

Diana
Humano

hola, de donde me puedo descargar todas las funciones?

Leandro
Humano

Hola! Muy interesante todos los artículos, una duda sobre el código de este post, ¿Por qué importas la librería numpy si nunca la utilizas? Gracias, saludos!

soyasi
Humano

Encontré tu blog de casualidad, te dejo una imagen con el aumento de 30 aumentos, ni un solo fallo en tu código. Uso opensuse leap 42.1 con la versión de opencv-2.4.11-69.1 y python-opencv-qt5-2.4.11-69.2. Gracias, algo nuevo que he aprendido.

William
Humano

Muy buen post, pero al momento de correr me aparece una linea que tiene error. A continuacion te envio el mensaje que me sale al momento de correr el codigo.
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\William\workspace\PrimerProyecto\src\ReconocimientoFacial.py”, line 25, 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

William
Humano

Me podrias ayudar a solucionar este problema. Gracias

Julian David
Humano

buenas, saludos
grale, muy buen blog, felicitaciones…
quisiera saber si me podrias ayudar para modificar el codigo y que en vez de que el haarcascade detecte rostros pase a detectarme objetos o figuras ya sea circulos o cuadrados etc…
face_cascade = cv2.CascadeClassifier(‘haarcascade_frontalface_alt.xml’)
en esa linea en lugar de que sea para rostros hacerlo para otras cosas
gracias y saludos…

enrique
Humano

amigo m podrias ayudar veras estoy utilizando las librerias en la raspberry funciona pero se pone demasiado lenta…. al igual hice reconocimiento facial y de de ojos en mi laptop y tambn se pone lenta mi laptop es una i5 de 8GB en ram

JordyC++n
Humano

Hola, muy buena publicación, breve y precisa.

Tengo una duda, en la linea donde se espera una Q (‘q’) para salir del programa, no me funciona

#con la tecla ‘q’ salimos del programa
if cv2.waitKey(1) & 0xFF == ord(‘q’):

Me gustaría que esto realmente funcionara, ¿a qué se debe?

Gracias

fidos789
Humano

ten la bondad

wpDiscuz