# 利用OpenCV和Dlib实现疲劳检测:守护安全与专注

利用OpenCV和Dlib实现疲劳检测:守护安全与专注

在当今快节奏的生活中,疲劳和注意力不集中是许多人面临的常见问题,尤其是在驾驶、学习等需要高度集中精力的场景中。疲劳不仅影响个人的健康和安全,还可能导致严重的事故。为了应对这一挑战,计算机视觉技术提供了一种有效的解决方案,通过实时监测人的生理状态,及时发现疲劳迹象并发出警报。本文将介绍如何利用OpenCV和Dlib库实现疲劳检测功能,尤其是通过监测眼睛的闭合程度来判断疲劳状态。

一、项目背景与目标

疲劳检测技术在多个领域具有重要的应用价值。例如,在驾驶场景中,通过实时监测驾驶员的眼睛状态,可以及时发现疲劳驾驶行为,提醒驾驶员休息,从而提高行车安全。在教育领域,通过监测学员上课时的状态,可以判断学员是否专注听讲或处于疲劳状态,为教学管理提供参考。

本文的目标是实现一个基于OpenCV和Dlib的疲劳检测系统,能够实时监测眼睛的闭合程度,并通过中文提示信息反馈检测结果。

二、技术栈

  • OpenCV:用于图像处理和视频流操作。
  • Dlib:用于人脸检测和关键点检测。
  • Sklearn:用于计算欧几里得距离。
  • PIL:用于在图像上绘制中文文本。

三、疲劳检测:眼睛状态监测

疲劳检测的核心是通过监测眼睛的闭合程度来判断一个人是否处于疲劳状态。眼睛的闭合程度可以通过计算眼睛的纵横比(Eye Aspect Ratio, EAR)来量化。

(一)眼睛纵横比的计算

眼睛的六个关键点分布如下:

复制代码
      1    2
0             3
      5    4

通过计算这些关键点之间的欧几里得距离,可以得到眼睛的纵横比。具体公式如下:

\\text{EAR} = \\frac{A + B}{2C}

其中:

  • (A) 是关键点1和5之间的距离
  • (B) 是关键点2和4之间的距离
  • (C) 是关键点0和3之间的距离

以下是计算EAR的代码实现:

python 复制代码
from sklearn.metrics.pairwise import euclidean_distances

def eyes_aspect_ratio(eye):
    A = euclidean_distances(eye[1].reshape(1, 2), eye[5].reshape(1, 2))[0][0]
    B = euclidean_distances(eye[2].reshape(1, 2), eye[4].reshape(1, 2))[0][0]
    C = euclidean_distances(eye[0].reshape(1, 2), eye[3].reshape(1, 2))[0][0]
    ear = (A + B) / (2.0 * C)
    return ear

(二)实时监测与警告

在实时视频流中,我们通过Dlib的人脸检测器和关键点检测器获取人脸和眼睛的关键点,然后计算EAR值。如果连续多帧(如50帧)检测到EAR值低于阈值(如0.6),则认为用户处于疲劳状态,并在屏幕上显示警告信息。

以下是完整的疲劳检测代码:

python 复制代码
import cv2
import dlib
from sklearn.metrics.pairwise import euclidean_distances
from PIL import Image, ImageDraw, ImageFont
import numpy as np

def eyes_aspect_ratio(eye):
    A = euclidean_distances(eye[1].reshape(1, 2), eye[5].reshape(1, 2))[0][0]
    B = euclidean_distances(eye[2].reshape(1, 2), eye[4].reshape(1, 2))[0][0]
    C = euclidean_distances(eye[0].reshape(1, 2), eye[3].reshape(1, 2))[0][0]
    ear = (A + B) / (2.0 * C)
    return ear

def cv2AddChineseText(img, text, position, textColor=(0, 255, 0), textSize=50):
    if isinstance(img, np.ndarray):
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    draw = ImageDraw.Draw(img)
    fontStyle = ImageFont.truetype("simsun.ttc", textSize, encoding="utf-8")
    draw.text(position, text, textColor, font=fontStyle)
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

def drawEye(eye, frame):
    eyeHull = cv2.convexHull(eye)
    cv2.drawContours(frame, [eyeHull], -1, (0, 255, 0), -1)

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
cap = cv2.VideoCapture(0)

COUNTER = 0  # 闭眼持续次数统计
while True:
    ret, frame = cap.read()
    if not ret:
        break

    faces = detector(frame, 0)
    for face in faces:
        shape = predictor(frame, face)
        shape = np.array([[p.x, p.y] for p in shape.parts()])

        rightEye = shape[36:42]
        leftEye = shape[42:48]
        rightEAR = eyes_aspect_ratio(rightEye)
        leftEAR = eyes_aspect_ratio(leftEye)
        ear = (leftEAR + rightEAR) / 2.0

        if ear < 0.6:
            COUNTER += 1
            if COUNTER >= 50:
                frame = cv2AddChineseText(frame, "!!!!危险!!!!", (250, 250))
        else:
            COUNTER = 0

        drawEye(rightEye, frame)
        drawEye(leftEye, frame)
        info = "EAR: {:.2f}".format(ear)
        frame = cv2AddChineseText(frame, info, (0, 30))

    cv2.imshow("Frame", frame)
    if cv2.waitKey(1) == 27:  # 按ESC键退出
        break

cv2.destroyAllWindows()
cap.release()

四、应用场景

(一)驾驶员疲劳检测

通过实时监测驾驶员的眼睛状态,可以及时发现疲劳驾驶行为,提醒驾驶员休息,从而提高行车安全。

(二)学员上课状态监测

通过监测学员上课时的状态,可以判断学员是否专注听讲或处于疲劳状态,为教学管理提供参考。

五、总结

本文详细介绍了如何利用OpenCV和Dlib实现疲劳检测。通过计算眼睛的纵横比,可以实时监测用户的疲劳状态。这一技术在驾驶安全和教学管理等领域具有广泛的应用前景。未来,我们还可以进一步优化算法,提高检测的准确性和实时性,为人们的生活和工作提供更多的便利和安全保障。

相关推荐
hundaxxx1 小时前
自演化大语言模型的技术背景
人工智能
数智顾问1 小时前
【73页PPT】美的简单高效的管理逻辑(附下载方式)
大数据·人工智能·产品运营
love530love1 小时前
【保姆级教程】阿里 Wan2.1-T2V-14B 模型本地部署全流程:从环境配置到视频生成(附避坑指南)
人工智能·windows·python·开源·大模型·github·音视频
木头左1 小时前
结合机器学习的Backtrader跨市场交易策略研究
人工智能·机器学习·kotlin
Coovally AI模型快速验证1 小时前
3D目标跟踪重磅突破!TrackAny3D实现「类别无关」统一建模,多项SOTA达成!
人工智能·yolo·机器学习·3d·目标跟踪·无人机·cocos2d
研梦非凡2 小时前
CVPR 2025|基于粗略边界框监督的3D实例分割
人工智能·计算机网络·计算机视觉·3d
MiaoChuAI2 小时前
秒出PPT vs 豆包AI PPT:实测哪款更好用?
人工智能·powerpoint
fsnine2 小时前
深度学习——残差神经网路
人工智能·深度学习
和鲸社区3 小时前
《斯坦福CS336》作业1开源,从0手搓大模型|代码复现+免环境配置
人工智能·python·深度学习·计算机视觉·语言模型·自然语言处理·nlp
fanstuck3 小时前
2025 年高教社杯全国大学生数学建模竞赛C 题 NIPT 的时点选择与胎儿的异常判定详解(一)
人工智能·目标检测·数学建模·数据挖掘·aigc