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

相关推荐
一次旅行3 分钟前
今日AI科技新闻总结
人工智能·科技
这张生成的图像能检测吗4 分钟前
(论文速读)Sonnet:多变量时间序列预测的谱算子神经网络
人工智能·深度学习·时序预测·时序模型
地球资源数据云5 分钟前
1900-2023年中国物种分布点位矢量数据集
大数据·数据结构·数据库·数据仓库·人工智能
littleM14 分钟前
OpenClaw vs HermesAgent 对比分析系列
人工智能·架构·ai编程
AI医影跨模态组学16 分钟前
Research(IF=10.9)南方医科大学珠江医院汪洋教授等团队:深度学习在脊柱MRI诊断中的应用:AI辅助与人工的多中心对比研究
人工智能·深度学习·论文·医学影像·影像组学
Zldaisy3d21 分钟前
上交大特材所 l 增材制造多层级功能结构综述
人工智能
缝艺智研社24 分钟前
誉财 YC - 16 POLO 衫智能自动钉扣机:POLO 衫钉扣新变革
人工智能·新人首发·自动化缝纫机·线上模板机·无人自动化产线
带电的小王26 分钟前
【动手学深度学习】8.4. 循环神经网络
人工智能·pytorch·rnn·深度学习
yigan_Eins26 分钟前
Transformer|残差连接的技术演进:从CNN到ResNet
人工智能·深度学习·cnn·transformer
道可云27 分钟前
道可云人工智能&OPC每日资讯|《广东省加快推进人工智能全域全时全行业高水平应用行动方案》发布
人工智能