Detección de bostezos usando OpenCV y Dlib

En este artículo, cubriremos todos los pasos necesarios para crear un programa de detección de bostezos utilizando los paquetes OpenCV y dlib . Pero antes de realizar este proyecto, debe estar familiarizado con los conceptos básicos de OpenCV y también debe saber cómo usar la detección de rostros y la detección de puntos de referencia con el módulo dlib .

Requisitos: 

  1. Biblioteca Dlib instalada 
  2. Archivo ‘.dat’ de punto de referencia de cara de Dlib. Opcional: archivo XML para el clasificador de Harcasscade (si desea utilizar el enlace del clasificador de Harcasscade: – https://github.com/opencv/opencv/tree/master/data/haarcascades
  3. El paquete OpenCV debe estar instalado en su entorno

PASOS: 

  1. Inicialice el objeto de representación de video usando el método VideoCapture en OpenCV
  2. Crear una imagen en escala de grises
  3. Crear instancias de objetos de modelo para la detección de rostros y puntos de referencia
  4. Detectar rostros y luego pasar el rostro como entrada al modelo de detección de puntos de referencia
  5. Calcule la distancia del labio superior e inferior (o cualquier métrica que desee usar para la detección de bostezos)
  6. Crear una condición Si para la distancia entre labios
  7. Mostrar el marco/imagen

Implementación:

Python3

import numpy as np
import cv2
import dlib
import time 
from scipy.spatial import distance as dist
from imutils import face_utils
  
  
  
def cal_yawn(shape): 
    top_lip = shape[50:53]
    top_lip = np.concatenate((top_lip, shape[61:64]))
  
    low_lip = shape[56:59]
    low_lip = np.concatenate((low_lip, shape[65:68]))
  
    top_mean = np.mean(top_lip, axis=0)
    low_mean = np.mean(low_lip, axis=0)
  
    distance = dist.euclidean(top_mean,low_mean)
    return distance
  
cam = cv2.VideoCapture('http://192.168.1.50:4747/video')
  
  
#-------Models---------#
face_model = dlib.get_frontal_face_detector()
landmark_model = dlib.shape_predictor('Model\shape_predictor_68_face_landmarks.dat')
  
#--------Variables-------#
yawn_thresh = 35
ptime = 0
while True : 
    suc,frame = cam.read()
  
    if not suc : 
        break
  
  
    #---------FPS------------#    
    ctime = time.time() 
    fps= int(1/(ctime-ptime))
    ptime = ctime
    cv2.putText(frame,f'FPS:{fps}',(frame.shape[1]-120,frame.shape[0]-20),cv2.FONT_HERSHEY_PLAIN,2,(0,200,0),3)
  
    #------Detecting face------#
    img_gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    faces = face_model(img_gray)
    for face in faces:
        # #------Uncomment the following lines if you also want to detect the face ----------#
        # x1 = face.left()
        # y1 = face.top()
        # x2 = face.right()
        # y2 = face.bottom()
        # # print(face.top())
        # cv2.rectangle(frame,(x1,y1),(x2,y2),(200,0,00),2)
  
  
        #----------Detect Landmarks-----------#
        shapes = landmark_model(img_gray,face)
        shape = face_utils.shape_to_np(shapes)
  
        #-------Detecting/Marking the lower and upper lip--------#
        lip = shape[48:60]
        cv2.drawContours(frame,[lip],-1,(0, 165, 255),thickness=3)
  
        #-------Calculating the lip distance-----#
        lip_dist = cal_yawn(shape)
        # print(lip_dist)
        if lip_dist > yawn_thresh : 
            cv2.putText(frame, f'User Yawning!',(frame.shape[1]//2 - 170 ,frame.shape[0]//2),cv2.FONT_HERSHEY_SIMPLEX,2,(0,0,200),2)  
  
  
    cv2.imshow('Webcam' , frame)
    if cv2.waitKey(1) & 0xFF == ord('q') : 
        break
  
cam.release()
cv2.destroyAllWindows()

Producción: 

¿Qué sigue?

Puede intentar combinar este programa con un programa de detección de parpadeo/detección de vivacidad para predecir el estado del usuario, esto puede servir como base para una aplicación del mundo real para detectar el estado del usuario y establecer alarmas o recordatorios en consecuencia.

Publicación traducida automáticamente

Artículo escrito por bobde_yagyesh 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 *