news 2026/6/3 14:34:21

深夜赶项目的程序员小张盯着屏幕打了个哈欠,突然想起上周写的疲劳检测工具还没调通。今天咱们就聊聊怎么用68个人脸特征点捕捉这种“灵魂出窍“的瞬间,关键时刻能救命

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深夜赶项目的程序员小张盯着屏幕打了个哈欠,突然想起上周写的疲劳检测工具还没调通。今天咱们就聊聊怎么用68个人脸特征点捕捉这种“灵魂出窍“的瞬间,关键时刻能救命

采用caffe68点检测人脸特征点,识别疲劳,当眼睛缝隙小,则认为是疲劳,有python,c++版本。

先准备个能打的面部定位工具,这里我翻出了珍藏的Caffe版68点检测模型(prototxt和caffemodel文件得提前准备好,放模型目录里别乱跑)。Python版本用OpenCV的dnn模块加载最方便:

# Python版模型加载 net = cv2.dnn.readNetFromCaffe( "face_detector/68point_deploy.prototxt", "face_detector/68point_model.caffemodel" )

C++选手别急,咱们的代码也照顾到了:

// C++版模型加载 cv::dnn::Net net = cv::dnn::readNetFromCaffe( "face_detector/68point_deploy.prototxt", "face_detector/68point_model.caffemodel" );

抓取人脸关键点时有个坑要注意:输入图片的归一化方式得和模型训练时一致。比如有些模型要求像素值从0-255缩放到-1到1,有的则用均值减法,这个不搞清楚定位准头就差远了。

拿到68个点坐标后,重点锁定眼睛区域。以左眼为例(36-41号点),计算眼睛睁开程度的套路是这样的:

def eye_aspect_ratio(eye_points): # 计算垂直方向两组距离 A = np.linalg.norm(eye_points[1] - eye_points[5]) B = np.linalg.norm(eye_points[2] - eye_points[4]) # 计算水平方向距离 C = np.linalg.norm(eye_points[0] - eye_points[3]) return (A + B) / (2.0 * C)

当这个比值连续20帧低于0.25时(别照搬这个阈值,得根据实际效果调),就该触发警报了。实时检测时建议用环形队列保存最近30帧的状态,这样既省内存又能避免误判。

C++版本的计算逻辑类似,但得注意类型转换:

double calculateEAR(const vector<Point2f>& eyePoints) { double vertical1 = norm(eyePoints[1] - eyePoints[5]); double vertical2 = norm(eyePoints[2] - eyePoints[4]); double horizontal = norm(eyePoints[0] - eyePoints[3]); return (vertical1 + vertical2) / (2 * horizontal); }

实际部署时发现了几个骚操作:

  1. 在光线不足的环境下,先做个直方图均衡化再检测
  2. 侧脸时单眼闭合的情况要特殊处理
  3. 戴眼镜的同学容易被反光干扰,加个ROI区域动态调整就好

最后上个Python版的完整流程示例:

cap = cv2.VideoCapture(0) eye_history = deque(maxlen=30) # 存最近30帧状态 while True: ret, frame = cap.read() # 人脸检测和关键点预测(此处省略) left_ear = eye_aspect_ratio(left_eye_points) right_ear = eye_aspect_ratio(right_eye_points) eye_history.append((left_ear + right_ear) / 2) if len(eye_history) == 30 and np.mean(eye_history) < 0.25: cv2.putText(frame, "WAKE UP!", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,0,255), 2) cv2.imshow("Frame", frame)

开发这种功能最解压的时刻,就是看着检测框跟着人脸晃来晃去,比看ASMR还治愈。不过别光顾着玩,记得保存模型文件路径别写死,不然换台机器分分钟给你脸色看。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 9:07:49

邮件营销素材准备:向潜在客户发送GLM-TTS成功案例

邮件营销中的声音革命&#xff1a;用 GLM-TTS 打造个性化语音触达 在数字营销的战场上&#xff0c;打开率正在成为一场残酷的淘汰赛。一封精心撰写的邮件&#xff0c;可能还没被读完第一段就被划走&#xff1b;一个极具吸引力的优惠信息&#xff0c;也可能因淹没在成百上千条通…

作者头像 李华
网站建设 2026/5/30 14:49:55

RPA流程嵌入:在UiPath中调用GLM-TTS完成语音播报任务

RPA流程嵌入&#xff1a;在UiPath中调用GLM-TTS完成语音播报任务 在现代企业自动化实践中&#xff0c;RPA早已不再局限于“自动填表”或“点击下一步”的简单操作。当业务系统越来越复杂&#xff0c;用户对交互体验的要求也水涨船高——人们不仅希望机器人能“做事”&#xff0…

作者头像 李华
网站建设 2026/5/29 5:29:10

如何将ARW文件转换为JPG?5种超简单方法

对于摄影爱好者而言&#xff0c;RAW格式是相机的“数字底片”&#xff0c;保留了最原始、最丰富的画面细节&#xff0c;是后期修图的绝佳基础。然而&#xff0c;RAW文件的体积庞大且兼容性较差&#xff0c;无法直接在大多数社交平台分享或在普通设备上查看。因此&#xff0c;ra…

作者头像 李华
网站建设 2026/5/30 15:23:01

灵活性供需不确定性下的储能优化配置方法研究及MATLAB代码复现

MATLAB代码&#xff1a;考虑灵活性供需不确定性的储能参与电网调峰优化配置 关键词&#xff1a;储能优化配置 电网调峰 风电场景生成 灵活性供需不确定性 参考文档&#xff1a;《考虑灵活性供需不确定性的储能优化配置》复现其上层模型&#xff0c;下层模型未实现 仿真平台&am…

作者头像 李华
网站建设 2026/5/26 12:39:20

SRC 入门必看:挖洞难的原因 + 避坑指南

一.为何挖不到漏洞? 信息收集不够多&#xff0c;或者做了信息收集但是分析的不够彻底和仔细。有几点要求需要大家注意&#xff1a;首先是要熟读刑法&#xff0c;了解那些是经过授权的渗透&#xff1b;其次&#xff0c;收集的信息要多&#xff0c;越多越好&#xff0c;包括子域…

作者头像 李华
网站建设 2026/6/1 16:16:34

甲方要的 6 个核心结果!护网监测别做无用功

一、护网监测 “找异常 堵漏洞”&#xff1a;甲方考核的 6 个核心结果 护网监测是蓝队的核心工作&#xff0c;甲方不看你 “做了多少事”&#xff0c;只看你 “有没有产出结果”—— 以下是 90% 企业都会考核的 6 个监测结果&#xff0c;做好了能直接拿项目奖金&#xff1a; …

作者头像 李华