Con este articulo os quiero enseñar lo fácil que es hacer una practica sencilla con Python para detectar caras a tiempo real en una webcam. Usaremos la potente libreria de Python OpenCV y un algortimo ya entrenado llamado haarcascade. si después de esto os sigue picando la curiosidad seguiremos ampliando los tutoriales sobre opencv!.

OpenCV (Open Source Computer Vision Library) es una biblioteca de software libre creada para el aprendizaje y visión por computadora. OpenCV se creó para proporcionar una infraestructura común para aplicaciones de visión y para acelerar el uso de la percepción de máquinas en los productos comerciales.

Y una vez que sabes que es OpenCV abre tu editor de código favorito y empezamos!!!

En primer lugar, asegurarse de tener instalado OpenCV. Puedes instalarlo usando pip:

pip install opencv-python

La detección de rostros utilizando cascadas Haar es un enfoque basado en el aprendizaje automático en el que una función en cascada se entrena con un conjunto de datos de entrada. OpenCV ya contiene muchos clasificadores pre-entrenados para cara, ojos, sonrisas, etc. Hoy utilizaremos el clasificador de cara. También puedes experimentar con otros clasificadores.

Debes descargar el archivo XML de clasificador llamado (haarcascade_frontalface_default.xml), yo te lo he dejado aquí para que lo pudeas descargar fácilmente. Una vez descargado situalo en tu espacio de trabajo donde estés programando este script de Python

Descarga haarcascade

Algunas cosas a tener en cuenta:


La detección solo funciona en imágenes en escala de grises. Por lo tanto, es importante convertir la imagen en color a escala de grises. (línea 8)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


La función detectMultiScale se utiliza para detectar las caras. Se necesitan 3 argumentos:

faces = face_cascade.detectMultiScale(gray, 1.1, 4)

  • Imagen de entrada
  • ScaleFactor
  • MinNeighbours

. VAMOS A EXPLICARLOS

ScaleFactor especifica cuánto se reduce el tamaño de la imagen con cada escala.

MinNeighbours especifica cuántos vecinos debe tener cada rectángulo candidato para retenerlo.

Las caras contiene una lista de coordenadas para las regiones rectangulares donde se encontraron. Usamos estas coordenadas para dibujar los rectángulos en nuestra imagen.

for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)

Ahora que ya tenemos claro el como se pueden detectar caras en imagenes estáticas, nos vamos a los Videos, detectar caras en tiempo real.Como saben, los videos están compuestos básicamente de cuadros, que son imágenes fijas. Entonces realizamos la detección de rostros para cada cuadro en un video.

La única diferencia aquí es que usamos un bucle infinito para recorrer cada fotograma en el video. Usamos cap.read () para leer cada cuadro.

while True:
# Read the frame
_, img = cap.read()
# Convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Detect the faces
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
# Draw the rectangle around each face
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
# Display
cv2.imshow(‘img’, img)
# Stop if escape key is pressed
if cv2.waitKey(10)==ord(«q»):
break

El primer valor devuelto es un indicador que indica si el marco se leyó correctamente o no. El segundo valor devuelto es el cuadro fijo en el que realizaremos la detección.

Pues ahora que tenemos todo explicado vamos a juntar el código y a detectar caras con Python

import cv2
face_cascade=cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
cap = cv2.VideoCapture(0)
while True:
# Read the frame
_, img = cap.read()
# Convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Detect the faces
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
# Draw the rectangle around each face
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
# Display
cv2.imshow('img', img)
# Stop if escape key is pressed
if cv2.waitKey(10)==ord("q"):
break
cap.release()

Una vez que ya te ha funcionado.. te animas para detectar la cara y los OJOS!!!. Recuerda usar otro algoritmo de haarcascade.