在前两篇内容中,我们完成了人脸检测、68 点关键点定位与面部特征可视化。本文将基于这些技术,聚焦一个实用场景 ——实时疲劳检测,通过计算眼睛纵横比(EAR)判断用户是否闭眼,并在持续闭眼时触发警报,可应用于驾驶安全、学习专注度监控等场景。
一、核心原理:眼睛纵横比(EAR)如何判断闭眼?
疲劳检测的核心逻辑是通过眼睛开合状态判断是否困倦,而眼睛纵横比(Eye Aspect Ratio,简称 EAR)是衡量眼睛开合程度的经典指标,由研究者 Tereza Soukupová 在 2016 年提出。
1. EAR 的计算逻辑
眼睛的 6 个关键点(如右眼 36-41、左眼 42-47)分布如下图所示,EAR 通过计算 “垂直方向距离之和” 与 “水平方向距离” 的比值,量化眼睛的开合程度:
1 2
\ /
0 ----------+---------- 3
/ \
5 4
- 垂直距离:关键点 1 与 5 的距离(A)、关键点 2 与 4 的距离(B);
- 水平距离:关键点 0 与 3 的距离(C);
- EAR 公式:
EAR = (A + B) / (2 * C)
2. EAR 的判断标准
- 睁眼状态:EAR 值通常在 0.25~0.35 之间(具体数值需根据摄像头距离、人脸大小微调);
- 闭眼状态:EAR 值会急剧下降至 0.2 以下,甚至接近 0;
- 疲劳判断:若 EAR 持续低于阈值(如 0.3)超过一定帧数(如 50 帧,约 1 秒,因摄像头通常为 30~60 帧 / 秒),则判定为疲劳状态。
二、完整代码实现与逐模块解析
1. 完整代码
import numpy as np
import dlib
import cv2
from sklearn.metrics.pairwise import euclidean_distances # 计算欧式距离
from PIL import Image, ImageDraw, ImageFont # 处理中文显示
# 模块1:计算眼睛纵横比(EAR)
def eye_aspect_ratio(eye):
# 计算垂直方向两个距离:A(1-5)、B(2-4)
A = euclidean_distances(eye[1].reshape(1, 2), eye[5].reshape(1, 2))
B = euclidean_distances(eye[2].reshape(1, 2), eye[4].reshape(1, 2))
# 计算水平方向距离:C(0-3)
C = e
基于EAR的实时疲劳检测

最低0.47元/天 解锁文章
1396

被折叠的 条评论
为什么被折叠?



