Detección de rostros con OpenCV en Python

Para la Detección de rostros con OpenCV en Python en Windows, Debian y Raspberry puedes seguir estos sencillos pasos:

Contenido

Crear un ambiente o entorno virtual en Python

En linux Debian usamos el siguiente comando para instalar virtualenv, que nos va a permitir crear entornos virtuales y aislar la librerías que instalaremos para que no causen problemas:

sudo apt -y install virtualenv

Para crear un entorno virtual ejecutamos el siguiente comando:

python3 -m venv /path/to/virtual/environment
# O también puedes usar este otro si lo quieres crear en la misma carpeta:
python3 -m venv venv

Más sobre como crear un ambiente o entorno virtual en Python :https://decodigo.com/crear-un-entorno-virtual-en-python

Activar el entorno virtual

Para activar el entorno virtual:

source venv/bin/activate

Instalar OpenCV

Instalar OpenCV usando pip3:

pip3 install opencv-python 

El código en Python para Windows y Linux

Este ejemplo fue probado en Windows y Debian 11

import cv2

#decodigo.com

# https://github.com/opencv/opencv/tree/master/data/haarcascades
# leer el archivo cascade
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# Captura el video
cap = cv2.VideoCapture(0)

while True:
    # Lee el frame
    _, img = cap.read()
    # Se convierte a escala de grises
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # Detectando rostros
    faces = face_cascade.detectMultiScale(gray, 1.1, 4)
    # Dibujando un rectángulo por cada rostro detectado
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
    # Se muestra en la ventana
    cv2.imshow('img', img)
    # Para si la tecla 'Esc' es presionada
    k = cv2.waitKey(30) & 0xff
    if k==27:
        break
# Se libera el objeto de captura
cap.release()

Código para Raspberry con Raspbian

Código para Raspberry con Raspbian modificando la resolución del video de captura, también debes saber que se pueden usar otras cámaras Web. Puedes usar las Camera Pi, sin embargo a partir de la última versión de Raspbian (bullseye) la cámara dejará de ser soportada. Pero para este ejemplo puedes usar cualquier otra conectada por el puerto USB.

Detección de rostros con OpenCV en Python en una Raspberry
import cv2

#decodigo.com

# https://github.com/opencv/opencv/tree/master/data/haarcascades
# leer el archivo cascade
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# Captura el video
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)  # set new dimensionns to cam object (not cap)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)

while True:
    # Lee el frame
    _, img = cap.read()
    # Se convierte a escala de grises
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # Detectando rostros
    faces = face_cascade.detectMultiScale(gray, 1.1, 4)
    # Dibujando un rectángulo por cada rostro detectado
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
    # Se muestra en la ventana
    cv2.imshow('img', img)
    # Para si la tecla 'Esc' es presionada
    k = cv2.waitKey(30) & 0xff
    if k==27:
        break
# Se libera el objeto de captura
cap.release()

Adicionales

Podría ocurrir que necesites las siguientes librerías, pero si no tienes problemas no es necesario instalarlas

sudo apt-get libatlas-base-dev

sudo apt-get install libcblas-dev
sudo apt-get install libhdf5-dev
sudo apt-get install libhdf5-serial-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libjasper-dev 
sudo apt-get install libqtgui4 
sudo apt-get install libqt4-test

Como puedes ver la detección de rostros con OpenCV en Python es fácil pero puedes hacer mucho más con OpenCV.

Más acerca de OpenCV: https://opencv.org/

Más información en inglés: https://geekole.com/face-detection-with-opencv-in-python/