# 利用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实现疲劳检测。通过计算眼睛的纵横比,可以实时监测用户的疲劳状态。这一技术在驾驶安全和教学管理等领域具有广泛的应用前景。未来,我们还可以进一步优化算法,提高检测的准确性和实时性,为人们的生活和工作提供更多的便利和安全保障。

相关推荐
奕鼎竜瑆2 小时前
Solid 前端响应式开发从零到精通
前端·人工智能
YOLO数据集集合2 小时前
无人机桥梁损伤目标检测数据集 | 桥梁损伤 无人机巡检 结构健康监测 多类别检测9135期
人工智能·目标检测·无人机
动恰客流统计3 小时前
景区客流统计怎么做?兼顾管控与运营的实施方案解析
大数据·前端·人工智能
weixin_443883013 小时前
合规整改倒计时:高等级签名证书的应用场景
大数据·人工智能·法大大·法大大电子签·电子合同
魔猴疯猿3 小时前
从0到1用Python开发第一个智能体
人工智能·python·深度学习·神经网络·机器学习
天一生水water3 小时前
变分模态分解(VMD)的教程
人工智能
荆棘鸟智能4 小时前
林业遥感长势评估怎么做?从NDVI时序分析到LiDAR蓄积量回归
人工智能·算法·智慧林业
代码方舟4 小时前
数据科学风控实战:基于天远全能消金报告构建自动化信用评估网关
运维·人工智能·自动化
Yan-英杰4 小时前
2026年数据采集服务怎么选?4大主流平台(亮数据 Bright Data、Apify、ScrapingBee、Zyte)深度对比
人工智能·神经网络·microsoft·机器学习·ai开发工具