Python | Detección de sonrisas usando OpenCV

Los detectores de emociones se utilizan en muchas industrias, una de las cuales es la industria de los medios de comunicación, donde es importante que las empresas determinen la reacción del público a sus productos. En este artículo, vamos a construir un detector de sonrisas usando OpenCV que toma imágenes en vivo desde la cámara web. El detector de sonrisas/felicidad que vamos a implementar sería básico, existen muchas formas mejores de implementarlo.
Paso #1: En primer lugar, necesitamos importar la biblioteca OpenCV. 
 

import cv2

Paso #2: Incluya las cascadas de cabello deseadas.
Las cascadas de Haar son clasificadores que se utilizan para detectar características (de la cara en este caso) mediante la superposición de patrones predefinidos sobre los segmentos de la cara y se utilizan como archivos XML. En nuestro modelo, utilizaremos cascadas de rostro, ojos y sonrisa, que después de la descarga deben colocarse en el directorio de trabajo.
Todas las cascadas de Haar requeridas se pueden encontrar aquí
 

Python3

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_eye.xml')
smile_cascade = cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_smile.xml')

Paso #3: 
En este paso, vamos a construir la función principal que realizaría la detección de sonrisas. 
 

  1. La transmisión en vivo proveniente de la cámara web/dispositivo de video se procesa cuadro por cuadro. Procesamos la imagen en escala de grises, ya que las cascadas de haar funcionan mejor en ellas.
  2. Para detectar la cara, usamos: 
     

Python3

faces  = face_cascade.detectMultiScale(gray, 1.3, 5)
  1. donde 1,3 es el factor de escala y 5 es el número de vecinos más cercanos. Podemos ajustar estos factores según nuestra conveniencia/resultados para mejorar nuestro detector.
  2. Ahora, para cada rostro subsiguiente detectado, debemos verificar si hay sonrisas. 
     

Python3

def detect(gray, frame):
    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]
        smiles = smile_cascade.detectMultiScale(roi_gray, 1.8, 20)
 
        for (sx, sy, sw, sh) in smiles:
            cv2.rectangle(roi_color, (sx, sy), ((sx + sw), (sy + sh)), (0, 0, 255), 2)
    return frame

Explicaciones – 
 

  • Los datos de la cara se almacenan como tuplas de coordenadas. Aquí, x e y definen la coordenada de la esquina superior izquierda del marco de la cara, w y h definen el ancho y la altura del marco. 
     
  • La función cv2.rectangle toma el marco de argumentos, las coordenadas de la parte superior izquierda de la cara, las coordenadas de la parte inferior derecha, el código RGB para el rectángulo (que contendría dentro de él la cara detectada) y el grosor del rectángulo. 
     
  • El roi_gray define la región de interés de la cara y roi_color hace lo mismo para el marco original. 
     
  • En la línea 7, aplicamos la detección de sonrisas usando la cascada. 
     

Paso #4: 
Definimos la función principal en este paso. Después de la ejecución, la función se puede terminar presionando la tecla «q». 
 

Python3

video_capture = cv2.VideoCapture(0)
while video_capture.isOpened():
   # Captures video_capture frame by frame
    _, frame = video_capture.read()
 
    # To capture image in monochrome                   
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
     
    # calls the detect() function   
    canvas = detect(gray, frame)  
 
    # Displays the result on camera feed                    
    cv2.imshow('Video', canvas)
 
    # The control breaks once q key is pressed                       
    if cv2.waitKey(1) & 0xff == ord('q'):              
        break
 
# Release the capture once all the processing is done.
video_capture.release()                                
cv2.destroyAllWindows()

Producción: 
 

Publicación traducida automáticamente

Artículo escrito por noob_coders_ka_baap y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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