从特征到应用:用 dlib+OpenCV 实现实时疲劳检测(基于眼睛纵横比)

基于EAR的实时疲劳检测

在前两篇内容中,我们完成了人脸检测、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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值