首页 > 其他分享 >《深度学习》Dlib库 人脸应用实例 疲劳监测

《深度学习》Dlib库 人脸应用实例 疲劳监测

时间:2024-10-19 22:19:46浏览次数:3  
标签:eye img frame cv2 shape 实例 人脸 Dlib 关键点

目录

一、了解项目

1、脸部关键点

2、实现方法

3、流程

初始化阶段:

视频处理循环:

显示与交互:

二、案例实现

1、完整代码

2、运行结果


一、了解项目

1、脸部关键点

2、实现方法

        通过眼睛的纵横比来判断眼睛是否闭合。从而判断人是否处于疲劳状态。

3、流程

  1. 初始化阶段
    • 导入必要的库:numpy、dlib、cv2(OpenCV)、sklearn.metrics.pairwise(用于计算欧氏距离)、PIL(用于添加中文文本)。
    • 定义辅助函数:
      • eye_aspect_ratio计算眼睛的纵横比(EAR),用于判断眼睛是否闭合。
      • cv2AddChineseText在图像上添加中文文本。
      • drawEye绘制眼睛的凸包轮廓。
    • 初始化变量:COUNTER用于统计闭眼持续的帧数,detectorpredictor分别为dlib的人脸检测器和关键点定位器。
    • 加载视频文件
  2. 视频处理循环
    • 从视频文件中逐帧读取图像。
    • 使用dlib的人脸检测器检测图像中的人脸。
    • 对每个人脸,使用关键点定位器获取68个面部特征点的坐标。
    • 根据特征点坐标,提取左右眼睛的坐标区域。
    • 计算左右眼睛的EAR值,并取平均值作为最终的EAR值。
    • 根据EAR值判断眼睛是否闭合(EAR值小于0.3认为眼睛闭合):
      • 如果眼睛闭合持续时间超过50帧,则在图像上添加“危险”提示。
      • 否则,将闭眼计数器清零。
    • 绘制左右眼睛的凸包轮廓。
    • 在图像上显示当前的EAR值。
  3. 显示与交互
    • 使用OpenCV的imshow函数显示处理后的视频帧。
    • 检测按键事件,如果按下ESC键(ASCII码为27),则退出循环。

二、案例实现

1、完整代码

import numpy as np
import dlib
import cv2
from sklearn.metrics.pairwise import euclidean_distances
from PIL import Image, ImageDraw, ImageFont


def eye_aspect_ratio(eye):   # 计算眼睛纵横比,传入的eye格式为数组类型,需要使用reshape重塑其形状,将其改变为1行2两列格式
    A = euclidean_distances(eye[1].reshape(1, 2), eye[5].reshape(1, 2))   # 计算关键点1到5的欧几里得距离
    B = euclidean_distances(eye[2].reshape(1, 2), eye[4].reshape(1, 2))
    C = euclidean_distances(eye[0].reshape(1, 2), eye[3].reshape(1, 2))
    ear = ((A + B) / 2.0) / C  # 计算纵横比
    return ear

def cv2AddChineseText(img,text,position,textColor=(0,255,0),textSize=30):
    """向图片中添加中文"""
    if (isinstance(img,np.ndarray)):  # 判断是否0penCV图片类型
        img = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))  # 实现array到image的转换
    draw = ImageDraw.Draw(img)  # 在img图片上创建一个绘图的对象
    # 字体的格式
    fontStyle = ImageFont.truetype("STXINGKA.TTF",textSize,encoding = "utf-8")
    draw.text(position,text,textColor,font=fontStyle)
    return cv2.cvtColor(np.asarray(img),cv2.COLOR_BGR2RGB)       # 转换回0penCV格式

def drawEye(eye):   # 绘制眼框凸包
    eyeHull = cv2.convexHull(eye)
    cv2.drawContours(frame,[eyeHull],-1,(0,255,0),-1)  # 最后的-1表示画笔宽度为-1,即填充轮廓


COUNTER = 0  # 闭眼持续次数统计,初始化为0
detector = dlib.get_frontal_face_detector()  # 构造脸部位置检测器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")  # 读取人脸关键点定位模型
cap = cv2.VideoCapture('笑容.mp4')  # 读取视频

while True:
    ret, frame = cap.read()   # 读取视频帧
    faces = detector(frame, 0)  # 获取人脸
    for face in faces:  # 循环遍历每一个人脸
        shape = predictor(frame,face)   # 获取关键点
        # 将关键点转换为坐标(x,y)的形式
        shape = np.array([[p.x, p.y] for p in shape.parts()])  # 获取关键点迭代器,再遍历出来每个关键点的坐标点
        rightEye = shape[36:42]  # 右眼坐标,关键点索引从36到41(不包含42)
        leftEye = shape[42:48]   # 左眼坐标,关键点索引从42到47(不包含48)
        rightEAR = eye_aspect_ratio(rightEye)  # 计算右眼纵横比
        leftEAR = eye_aspect_ratio(leftEye)  # 计算左眼纵横比
        ear =(leftEAR + rightEAR)/2.0   # 均值处理

        if ear < 0.3:  
            COUNTER += 1  # 每检测到一次,将+1
            if COUNTER >= 50:  # 如果持续50帧画面,警报
                frame = cv2AddChineseText(frame, "!!!!危险!!!!",(250,250))  # 绘制中文文本
        # 宽高比>0.3,则计数器清零、解除疲劳标志
        else:
            COUNTER = 0   # 闭眼次数清0
            
        drawEye(leftEye)  # 绘制左眼凸包
        drawEye(rightEye)  # 绘制右眼凸包
        info = "EAR:{:.2f}".format(ear[0][0])  # 显示比例的值
        frame = cv2AddChineseText(frame, info,(0, 30))  # 显示眼睛闭合程度值

    cv2.imshow("Frame", frame) 
    if cv2.waitKey(1) == 27:
        break
# 释放资源
cv2.destroyAllWindows()
cap.release()

2、运行结果

标签:eye,img,frame,cv2,shape,实例,人脸,Dlib,关键点
From: https://blog.csdn.net/qq_64603703/article/details/143083413

相关文章

  • 基于支持向量机和降维PCA的人脸识别实战
    公众号:尤而小屋编辑:Peter作者:Peter大家好,我是Peter~今天给大家介绍一个基于支持向量机SVM和PCA降维的人脸识别的实战案例,主要包含:人脸数据lfw数据集下载PCA降维基于SVM的分类模型构建模型分类预测结果可视化效果如下图:基于SVM和PCA算法的人脸识别使用数据为fetch_l......
  • python 代码实例 --- GUI 登录界面
    importsysfromPyQt5.QtWidgetsimportQApplication,QWidget,QLabel,QLineEdit,QPushButton,QVBoxLayout#type:ignoreclassLoginWindow(QWidget):def__init__(self):super().__init__()self.init_ui()definit_ui(self):......
  • [ 常微分方程 ] 04 高阶微分方程实例
    高阶微分方程一般用于一些具体的物理情景中,下面以质点振动和宇宙速度的推导为例。参考书:王高雄《常微分方程(第四版)》文章目录一、质点振动01无阻尼自由振动(1)物理推导(2)微分方程推导02有阻尼自由摆动03无阻尼强迫振动04有阻尼强迫振动05质点振动小结一、质点振......
  • 【高级SQL 十条调优技巧含实例可执行命令】
    高级SQL技巧是在SQL查询和操作方面进行更高级的优化和功能实现的技巧。以下是一些常见的高级SQL技巧:使用窗口函数:窗口函数是一种强大的SQL功能,它允许在查询结果上执行聚合函数,同时保留原始数据行。使用窗口函数可以实现排序、分组和计算行号等功能。窗口函数:SELE......
  • 人脸对齐和关键点计算估计姿态代码
    1.人脸对齐代码1.1定义结构体#include<iostream>#include<opencv2/opencv.hpp>#include<onnxruntime_cxx_api.h>#include<vector>#include<cmath>#include<filesystem>usingnamespacecv;typedefstructFacePts{floatx[5],......
  • STM32 ADC实例解析(1)-寄存器方式
    文章目录一、寄存器列表二、示例代码三、总结优点:缺点:在很长的一段时间里我在项目中都是使用寄存器方式一、寄存器列表__IOuint32_tSR;/!<ADC状态寄存器,地址偏移量:0x00/__IOuint32_tCR1;/!<ADC控制寄存器1,地址偏移量:0x04/__IOuint32_tCR2;/!<ADC控制寄存......
  • STM32 ADC实例解析(1)-HAL+DMA方式
    文章目录一、STM32ADC与DMA的结合使用初始化ADC:配置DMA:启动DMA传输:中断处理(可选):二、示例代码初始化GPIO设置中断设置三、应用优势高效性:减轻CPU负担:灵活性:易用性:随着开发项目的累计,将ADC与DMA结合使用,可以实现高效的数据采集和处理。一、STM32ADC与DMA的结合......
  • 传统特征算法——人脸识别
    人脸识别是目前人工智能领域中成熟较早、落地较广的技术之一,广泛应用于手机解锁、支付验证、安防布控等多个领域。其核心在于通过特定的算法识别图像或视频中人脸的身份,这一过程的实现离不开特征算法的支持。以下是对人脸识别特征算法的详细介绍:一、人脸识别系统概述一个......
  • 双胶合望远镜设计实例
    根据前文算出的参数填入zemax孔径: 视场波长像距为0,没有成像,图像很奇怪设置M可以填充像距点列图,结构还行,因为满足了初级相差为0,参数都是标准查表得来得:评价函数设置:设置变量优化后焦距差不多是250,如果差别很大可以加大焦距的权重......
  • 【进阶OpenCV】 (17)-- Dlib库 --实现人脸检测
    文章目录Dlib库一、Dlib库安装二、实现人脸检测1.生成人脸检测器2.检测人脸3.显示人脸总结Dlib库Dlib提供了丰富的图像处理和计算机视觉工具,如面部特征检测、物体检测、图像变换等,这些工具使得开发者能够轻松地进行各种图像处理任务。一、Dlib库安装pipinst......