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

server/2024/10/20 1:28:18/

目录

一、了解项目

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, ImageFontdef 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 eardef 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  # 每检测到一次,将+1if COUNTER >= 50:  # 如果持续50帧画面,警报frame = cv2AddChineseText(frame, "!!!!危险!!!!",(250,250))  # 绘制中文文本# 宽高比>0.3,则计数器清零、解除疲劳标志else:COUNTER = 0   # 闭眼次数清0drawEye(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、运行结果


http://www.ppmy.cn/server/133204.html

相关文章

质因数分解

#include <stdio.h>int main() {long long x;while (scanf("%lld", &x) ! EOF) { // 读取输入直到文件结束if (x 0) break; // 如果输入为0则退出循环for (long long i 2; i * i < x; i) {while (x % i 0) { // 当x能被i整除时printf("%lld &q…

mybatis-plus的Iservice接口的save方法,返回true,但是数据库表里却没有看到新记录

背景 需求是记录下操作过数据库的行为&#xff0c;将其记录到一个操作行为表中&#xff0c;我选择了使用aop特性来实现这一功能&#xff0c;发现当操作行为一切正常时&#xff0c;这个mybatis的save方法正常执行&#xff0c;行为表里正常增加记录。但是当操作行为抛出异常时&a…

QUIC 协议的优势

QUIC 协议的优势包括&#xff1a; 快速建立连接&#xff1a;将传输层和加密层的握手合并&#xff0c;减少了连接建立的延迟。QUIC 建连时间大约为 0~1RTT&#xff0c;相比 HTTPS 的 3RTT 建连&#xff0c;具有极大的优势。客户端第一次建连的握手协商需 1RTT&#xff0c;而已建…

JavaScript 中怎么判断前端各种运行环境

在 JavaScript 中&#xff0c;可以通过多种方式来判断前端应用的运行环境&#xff0c;比如浏览器环境、Node.js 环境、React Native 环境等。以下是一些常见的方法&#xff1a; 目录 1. 判断是否在浏览器环境中 2. 判断是否在 Node.js 环境中 3. 判断是否在 React Native 环…

Nature 正刊丨从植物吸收羰基硫推断陆地光合作用

01摘要 陆地光合作用或总初级生产力&#xff08;GPP&#xff09;是生物圈中最大的碳通量&#xff0c;但其全球规模和时空动态仍不确定1。历史上认为全球年平均GPP约为120 PgC yr-1&#xff08;参考文献2,3,4,5,6&#xff09;&#xff0c;比根据氧-18&#xff08;18O&#xff09…

Require:业界优秀的HTTP管理方案。

方案异步JDK额外依赖特点HttpURLConnection 【优点】Java内置&#xff0c;简单易用。对于简单的HTTP请求和响应处理非常合适。 【缺点】功能相对较少&#xff0c;不支持现代特性&#xff08;如异步请求、连接池等&#xff09;。API相对繁琐&#xff0c;处理复杂请求时代码冗长。…

K8s的储存

一 configmap 1.1 configmap的功能 configMap用于保存配置数据&#xff0c;以键值对形式存储。 configMap 资源提供了向 Pod 注入配置数据的方法。 镜像和配置文件解耦&#xff0c;以便实现镜像的可移植性和可复用性。 etcd限制了文件大小不能超过1M 1.2 configmap的使用场…

SLAM评估工具evo学习

参考链接 官方github&#xff1a;https://github.com/MichaelGrupp/evo 一、 指令分析 1.1 tum数据集&#xff0c;evo_ape指令 evo_ape {kitti,tum,euroc,bag} -h evo_ape tum -h(1) 终端输入&#xff1a; evo_ape tum -h (2) 终端打印&#xff1a; usage: evo_ape tum …