Python – Detección de rostros con OpenCV

Con Python y OpenCV la detección de rostros es mucho más sencilla de lograr que con Java (con muy pocas líneas de código).

Necesitas desde luego, tener instalado Python.  En este ejemplo descargamos la última versión disponible para Windows directamente de la página.

https://www.python.org/downloads/

python_opencv3_01





Instala Python en un ruta que recuerdes.

python_opencv3_pycharm_001

Como IDE para editar y compilar usaremos PyCharm Community de JetBrains.

https://www.jetbrains.com/pycharm/download/

python_opencv3_pycharm_01

Descargar OpenCV

Descargaremos OpenCV desde PyCharm, pero es necesario descargar OpenCV e instalar la versión para Windows, ya que necesitaremos los archivos HAARs que vienen como parte del paquete de archivos de datos para reconocer rostros, ojos y otras cosas bastante útiles.  Después de instalar el archivo ejecutable de OpenCV recuerda la ruta, la usaremos más tarde.

http://opencv.org/downloads.html

python_opencv3_pycharm_02

Crear un proyecto nuevo en PyCharm

Una vez instalado PyCharm, crea un nuevo proyecto.

python_opencv3_pycharm__03

Al crear el proyecto PyCharm solicitará la ruta del python que instalaste anteriormente.

python_opencv3_pycharm_04

Descargar e instalar OpenCV desde PyCharm

En las opciones de menú.  En File>Settings

python_opencv3_pycharm_05

Agrega un paquete nuevo.

python_opencv3_pycharm_06

Busca y selecciona opencv-python y especifica la versión 3.1 o superior.  Después da click en instalar.

python_opencv3_pycharm_07

No deberías tener problemas para instalar este paquete.

Ahora el código

El código es muy sencillo, solo tienes que crear una archivo de python con el nombre que desees y usar las siguientes líneas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import cv2
 
face_cascade = cv2.CascadeClassifier('C:/Users/decodigo/Documents/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
if face_cascade.empty(): raise Exception("¿Está seguro que es la ruta correcta?")
 
eye_cascade = cv2.CascadeClassifier('C:/Users/decodigo/Documents/opencv/sources/data/haarcascades/haarcascade_eye.xml')
if eye_cascade.empty(): raise Exception("¿Está seguro que es la ruta correcta?")
 
video = cv2.VideoCapture(0)
while video.isOpened():
    ret, frame = video.read()
    if frame is not None:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray, 1.3, 5)
        for (x,y,w,h) in faces:
            cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
            roi_gray = gray[y:y+h, x:x+w]
            roi_color = frame[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('Video', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
 
video.release()
cv2.destroyAllWindows()

Con las primeras líneas buscamos los archivos HAARs que nos permiten detectar ojos y rostros en OpenCV.

3
4
5
6
7
face_cascade = cv2.CascadeClassifier('C:/Users/decodigo/Documents/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
if face_cascade.empty(): raise Exception("¿Está seguro que es la ruta correcta?")
 
eye_cascade = cv2.CascadeClassifier('C:/Users/decodigo/Documents/opencv/sources/data/haarcascades/haarcascade_eye.xml')
if eye_cascade.empty(): raise Exception("¿Está seguro que es la ruta correcta?")

Después de eso tomamos el control de la webcam.  Recuerda que si tienes más de una cámara conectada (las laptops vienen con una incluida), debes jugar un poco con los índices para obtener la señal de la cámara que deseas.

9
video = cv2.VideoCapture(0)

Obtenemos la información de cada frame recibido de la webcam. Hacemos una copia en escala de grises y con la ayuda de la función face_cascade.detectMultiScale(gray, 1.3, 5) obtenemos una lista de todos los rostros encontrados en el frame.

En el ciclo for damos tratamiento a cada rostro encontrado.  Se dibuja un rectángulo y se obtiene una copia del area donde se ha detectado un rostro para después hacer la búsqueda de los ojos.

16
17
18
19
            cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
            roi_gray = gray[y:y+h, x:x+w]
            roi_color = frame[y:y+h, x:x+w]
            eyes = eye_cascade.detectMultiScale(roi_gray)

Para cada ojo se da un tratamiento similar al que hicimos cuando detectamos un rostro en nuevo ciclo for anidado.
Finalmente, mostramos el resultado de cada frame y su tratamiento en una ventana.

22
            cv2.imshow('Video', frame)

Quizá notaste que todo el bloque de código principal se encuentra en un ciclo while que se mantiene activo mientras la señal video está abierta.  Este ciclo terminará cuando pulsemos la tecla “q“.

23
24
   if cv2.waitKey(1) & 0xFF == ord('q'):
        break

Al terminar el ciclo la ventana donde mostramos el video cerrará.

26
27
video.release()
cv2.destroyAllWindows()

Como puedes ver se trata de un ejemplo muy sencillo. Sólo recuerda cambiar la ruta de los archivos HAAR y usar la correcta dependiendo de donde hayas instalado OpenCV al inicio.  El resultado será algo como la imagen siguiente, donde hay un rostro se dibuja un rectángulo azul, y dentro del mismo se dibuja otro más por cada ojo detectado.  Desde luego el método no es perfecto, pero seguro que puede ser util como primer acercamiento a OpenCV.

python_opencv3_pycharm_08

Esperamos que disfrutes el ejemplo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *