【深度学习】dlib 人脸关键点实时疲劳检测
文章目录完整代码一览环境准备与模型下载核心原理眼睛纵横比EAR逐行代码详解导入库EAR 计算函数中文绘制函数绘制眼睛轮廓主程序主循环完整代码一览import numpy as np import dlib import cv2 from sklearn.metrics.pairwise import euclidean_distances from PIL import Image,ImageDraw,ImageFont # 计算眼睛EAR纵横比 defeye_aspect_ratio(eye):Aeuclidean_distances(eye[1].reshape(1,2),eye[5].reshape(1,2))Beuclidean_distances(eye[2].reshape(1,2),eye[4].reshape(1,2))Ceuclidean_distances(eye[0].reshape(1,2),eye[3].reshape(1,2))ear((AB)/2.0)/Creturnear # 绘制中文文字 defcv2AddChineseText(img,text,position,textColor(255,0,0),textSize50):ifisinstance(img,np.ndarray):imgImage.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))drawImageDraw.Draw(img)fontStyleImageFont.truetype(simhei.ttf,textSize,encodingutf-8)draw.text(position,text,textColor,fontStyle)returncv2.cvtColor(np.asarray(img),cv2.COLOR_RGB2BGR)# 绘制眼睛轮廓 defdrawEye(eye):eyeHullcv2.convexHull(eye)cv2.drawContours(frame,[eyeHull],-1,(0,255,0),2)COUNTER0detectordlib.get_frontal_face_detector()predictordlib.shape_predictor(shape_predictor_68_face_landmarks.dat)capcv2.VideoCapture(0)whileTrue:ret,framecap.read()ifnot ret:breakfacesdetector(frame,0)forface in faces:shapepredictor(frame,face)shapenp.array([[p.x,p.y]forp in shape.parts()])rightEyeshape[36:42]leftEyeshape[42:48]rightEAReye_aspect_ratio(rightEye)leftEAReye_aspect_ratio(leftEye)ear(leftEARrightEAR)/2.0ifear0.3:COUNTER1ifCOUNTER30:framecv2AddChineseText(frame,!!!!危险!!!!,(250,250))else:COUNTER0drawEye(leftEye)drawEye(rightEye)infoEAR: {:.2f}.format(ear[0][0])framecv2AddChineseText(frame,info,(0,30))cv2.imshow(Frame,frame)ifcv2.waitKey(1)27:breakcap.release()cv2.destroyAllWindows()环境准备与模型下载import numpy as np import dlib import cv2 from sklearn.metrics.pairwise import euclidean_distances #计算欧氏距离 from PIL import Image,ImageDraw,ImageFontdlib安装可以看博主的另外一篇文章了解本文不过多赘述【深度学习】dlib 人脸关键点检测核心原理眼睛纵横比EAREAREye Aspect Ratio是衡量眼睛张开程度的一个指标。上眼睑左点A上眼睑右点B右眼角C下眼睑右点D下眼睑左点E左眼角FEAR (||A-E|| ||B-D||) / (2 * ||F-C||)分子是两只眼睛垂直方向的平均距离约等于眼睛高度分母是水平方向的距离约等于眼睛宽度。当眼睛睁开时EAR 值较大约 0.25~0.3当眼睛闭合时EAR 急剧减小接近 0。我们设定一个阈值如 0.3即可判断睁闭眼。逐行代码详解导入库import numpy as np #数组操作 import dlib #人脸检测 import cv2 #图像处理 from sklearn.metrics.pairwise import euclidean_distances #计算欧氏距离 from PIL import Image,ImageDraw,ImageFontEAR 计算函数defeye_aspect_ratio(eye):Aeuclidean_distances(eye[1].reshape(1,2),eye[5].reshape(1,2))Beuclidean_distances(eye[2].reshape(1,2),eye[4].reshape(1,2))Ceuclidean_distances(eye[0].reshape(1,2),eye[3].reshape(1,2))ear((AB)/2.0)/CreturnearEAR公式(AB)/(2*C)eye 是包含 6 个点坐标的 NumPy 数组形状为 (6, 2)。按照 dlib 的索引顺序0 和 3 是水平两端1和5、2和4 是垂直两对。计算三组距离代入公式得到 EAR。注意返回的 ear 是一个 (1,1) 数组后面取值时需用 ear[0][0]。中文绘制函数defcv2AddChineseText(img,text,position,textColor(255,0,0),textSize50):ifisinstance(img,np.ndarray):imgImage.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))drawImageDraw.Draw(img)fontStyleImageFont.truetype(simhei.ttf,textSize,encodingutf-8)draw.text(position,text,textColor,fontStyle)returncv2.cvtColor(np.asarray(img),cv2.COLOR_RGB2BGR)将 OpenCV 的 BGR 图像转为 PIL 的 RGB 图像绘制文字后再转回 BGR。绘制眼睛轮廓defdrawEye(eye):eyeHullcv2.convexHull(eye)cv2.drawContours(frame,[eyeHull],-1,(0,255,0),2)cv2.convexHull 计算眼睛点的凸包然后绘制绿色轮廓线用于直观显示眼睛区域。主程序COUNTER0detectordlib.get_frontal_face_detector()predictordlib.shape_predictor(shape_predictor_68_face_landmarks.dat)capcv2.VideoCapture(0)COUNTER 用于统计连续闭眼帧数。初始化检测器、预测器打开默认摄像头。主循环whileTrue:ret,framecap.read()ifnot ret:breakfacesdetector(frame,0)逐帧读取检测人脸。forface in faces:shapepredictor(frame,face)shapenp.array([[p.x,p.y]forp in shape.parts()])rightEyeshape[36:42]leftEyeshape[42:48]rightEAReye_aspect_ratio(rightEye)leftEAReye_aspect_ratio(leftEye)ear(leftEARrightEAR)/2.0提取 68 点分别截取左右眼的 6 个点注意 dlib 中右眼是 36~41左眼是 42~47。分别计算两眼的 EAR取平均值作为最终的 ear。ifear0.3:COUNTER1ifCOUNTER30:framecv2AddChineseText(frame,!!!!危险!!!!,(250,250))else:COUNTER0如果 EAR 低于阈值 0.3说明眼睛闭合计数器加 1。当连续闭眼超过 30 帧判定为疲劳瞌睡在画面中央显示红色警告文字。一旦睁眼计数器清零。drawEye(leftEye)drawEye(rightEye)infoEAR: {:.2f}.format(ear[0][0])framecv2AddChineseText(frame,info,(0,30))绘制眼睛轮廓并在屏幕左上角显示当前的 EAR 数值方便调试。cv2.imshow(Frame,frame)ifcv2.waitKey(1)27:break显示画面按 ESC 退出。

相关新闻

3步魔法:让Windows电脑秒变安卓应用安装中心

3步魔法:让Windows电脑秒变安卓应用安装中心

3步魔法:让Windows电脑秒变安卓应用安装中心 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经遇到过这样的困扰:在电脑上发现了一个有…

2026/7/12 6:37:28 阅读更多 →
Python提取Unity资源包实战:从AssetBundle到模型纹理的完整工具链

Python提取Unity资源包实战:从AssetBundle到模型纹理的完整工具链

1. 项目概述:为什么我们需要一个Python工具来提取Unity资源包?如果你是一名Unity开发者、技术美术,或者是对游戏资源逆向、二次创作感兴趣的爱好者,那么“如何提取Unity资源包”这个问题,你大概率遇到过。Unity的资源包…

2026/7/12 6:37:28 阅读更多 →
Apache PLC4X:工业物联网统一访问的终极解决方案

Apache PLC4X:工业物联网统一访问的终极解决方案

Apache PLC4X:工业物联网统一访问的终极解决方案 【免费下载链接】plc4x PLC4X The Industrial IoT adapter 项目地址: https://gitcode.com/gh_mirrors/pl/plc4x 在工业自动化领域,不同厂商的可编程逻辑控制器(PLC)采用各…

2026/7/12 6:35:27 阅读更多 →

最新新闻

Windows Vista Build 5270隐藏品牌Logo修改技术详解

Windows Vista Build 5270隐藏品牌Logo修改技术详解

1. 先搞清楚这个隐藏品牌logo到底是什么来头Windows Vista Build 5270是2005年12月CTP版本的一个内部测试版,这个版本的登录界面确实有个隐藏的品牌logo显示功能。很多人可能不知道,这个功能其实是通过修改系统资源文件实现的,而不是简单的注…

2026/7/12 7:32:02 阅读更多 →
SD WebUI ControlNet 插件崩溃频发?深度解析v1.4.5内核冲突根源及3种热修复方案

SD WebUI ControlNet 插件崩溃频发?深度解析v1.4.5内核冲突根源及3种热修复方案

更多请点击: https://kaifayun.com 第一章:SD WebUI ControlNet 插件崩溃频发?深度解析v1.4.5内核冲突根源及3种热修复方案 ControlNet v1.4.5 在 Stable Diffusion WebUI 1.9.x 环境中频繁触发段错误(Segmentation Fault&#x…

2026/7/12 7:30:01 阅读更多 →
Python自动化破解ZIP加密文件:字典攻击与暴力破解实战

Python自动化破解ZIP加密文件:字典攻击与暴力破解实战

1. 项目概述:当ZIP密码成为拦路虎手头有一个重要的ZIP压缩包,里面可能是急需的工作文档、珍藏多年的老照片,或者是某个项目遗留的源码,但偏偏把密码给忘了。这种场景,我相信不少朋友都遇到过。面对一个加密的ZIP文件&a…

2026/7/12 7:28:00 阅读更多 →
IntelliJ IDEA 2024.3 远程调试 Docker 容器:3 种配置方式与 5 个常见错误排查

IntelliJ IDEA 2024.3 远程调试 Docker 容器:3 种配置方式与 5 个常见错误排查

IntelliJ IDEA 2024.3 远程调试 Docker 容器:3 种配置方式与 5 个常见错误排查在当今云原生和微服务架构盛行的时代,Docker 已成为 Java 开发者日常工作中不可或缺的工具。然而,当应用运行在容器环境中时,传统的本地调试方式往往难…

2026/7/12 7:25:59 阅读更多 →
Hadoop MapReduce 实战:HBase 数据统计与写入,3步完成城市酒店均价分析

Hadoop MapReduce 实战:HBase 数据统计与写入,3步完成城市酒店均价分析

Hadoop MapReduce 与 HBase 深度整合实战:城市酒店均价分析的三维解决方案1. 现代数据架构中的批处理与实时分析融合在当今数据驱动的商业环境中,企业面临着海量数据处理的挑战。传统单机处理方式已无法满足PB级数据的分析需求,而Hadoop生态系…

2026/7/12 7:23:58 阅读更多 →
终极指南:用Rust构建的网易云音乐插件管理器

终极指南:用Rust构建的网易云音乐插件管理器

终极指南:用Rust构建的网易云音乐插件管理器 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer BetterNCM-Installer是一款基于Rust语言开发的网易云音乐插件管理工具&#xf…

2026/7/12 7:19:58 阅读更多 →

日新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/12 0:03:13 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/12 0:03:14 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/12 0:03:14 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/12 0:03:13 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/12 0:03:14 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/12 0:03:14 阅读更多 →

月新闻