163

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

163 Comentarios en "Reconocimiento facial con OpenCV + webcam"

avatar
Ordenar por:   más nuevos primero | más antiguos primero
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

fidos789
Humano

amigo todo me funciona lo unico que quisiera es q m ayudes con la base de datos de los rostros el haarcascades

pelin rodriguez (@pelinrodriguez)
Humano

probe el codigo tal cual y me funciono perfecto.
Saludos!

julio
Humano

glare algun codigo para calibrar la camara

trackback

[…] Reconocimiento facial […]

Ricardo
Humano

Hola, Gracias por el aporte. Estoy trabajando en un proyecto similar y me tengo que contar en numero de rostros detectados. Mi codigo es muy similar. Tengo que exportar ese dato despues a un excel, pero eso ya lo pude hacer (crear un archivo), solo me falta contar. Ójala me puedas ayudar.
de antemano muchas gracias.

RaulitoGC
Humano

Hola, primero agradecerte por el excelente tutorial, y la explicacion , estan geniales.
Tengo una pequeña duda, estaba leyendo sobre el tema y me encontre con algo sobre calibracion de la camara, y tambien al momento de correr el programa la camara tiene delay, me explico, yo paso mi mano frente a la camara y despues de 2 segundos aproximadamente se muestra mi mano pasando frente a la camara, esto no ocurria cuando hacia otras pruebas, mi sospecha es que tiene que ver algo con el .xml que estoy importando, pero a lo mejor me aclaras estas ideas.Gracias

jose
Humano
ME aparece este error y no entiendo muy bien la raíz del problema. ————————————————————————— error Traceback (most recent call last) in () 19 #busca las coordenadas de los rostros (si los hay) y 20 #guardamos su posicion —> 21 faces = face_cascade.detectMultiScale(gray, 1.3, 5) 22 23 #Dibujamos un rectangulo en las coordenadas de cada rostro error: C:buildsmaster_PackSlaveAddon-win64-vc12-staticopencvmodulesobjdetectsrccascadedetect.cpp:1634: error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale
Victor M
Humano
Hola, ya estuve probando algunos de los códigos y funcionan muy bien, tengo que hacer un código similar a este, con la diferencia de que no solo detecta rostros, sino que tiene que detectar de que persona se trata. me dicen que tiene que comparar con una base de datos para decirme quien es. eso ya lo tengo, pero lo que no sé, es ¿Cómo hacer para identificar a cada persona?. Me comento el profe que tengo que vectorizar una sección de la foto(por ejemplo los ojos). y esa compararla contra la base de datos. ¿Con que función puedo vectorizar… Leer más »
jaime
Humano

import cv2 #importa la libreria de opencv2

image=cv2.imread(‘D:Imagenesbutterfly.jpg’)

image_gray=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

cv2.imwrite(‘D:Imagenesbutterfly2.jpg’,image_gray)

error:

Traceback (most recent call last):
File “C:UsersNormaBertilaDesktopPROYECTO INTELIGENCIA ARTIFICIAL02IMAGEN_GRISESIMAGEN2.py”, line 6, in
image_gray=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
error: C:buildsmaster_PackSlaveAddon-win32-vc12-staticopencvmodulesimgprocsrccolor.cpp:7564: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor

Ariel
Humano
Muy bueno el codigo! Yo les escribo porque tengo problemas para guardar los videos. Estoy trabajando con windows 8.1, python 2.7.9 y opencv 3.0. Entiendo que es un problema con los codecs FourCC, dado que guarda los videos pero no los repdroduce. En el tutorial dice que utilize DIVX, pero este no funciona, tampoco el MJPG. Hay alguno que si funcione?me podrias decir como lo instalo?muchas gracias, este es el codigo que utilizo: import numpy as np import cv2 cap = cv2.VideoCapture(0) # Define the codec and create VideoWriter object fourcc = cv2.VideoWriter_fourcc(*’DIVX’) out = cv2.VideoWriter(‘output.mp4’,fourcc, 15.0, (640,480)) while(cap.isOpened()): ret,… Leer más »
ELIAZ
Humano

Hola, he probado el código y funciona correctamente, 🙂 estoy usando opencv 2.4.9, mi duda es como puedo mostrar las coordenadas del centro o de la esquina de los rostros detectados(rectángulos)? y poder calcular la distancia entre cada rectángulo, y condicionar dicha distancia (si distancia de rostro1 y rostro2 es menor o igual que distancia fijada por el usuario) entonces imprimir en la consola “rostros juntos” espero puedas ayudarme gracias!!

wpDiscuz