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.
- 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.
- Para detectar la cara, usamos:
Python3
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
- 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.
- 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