# 利用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 分钟前
A2A 与 MCP:智能体协作的新纪元与AI工程化的思考
人工智能·开源·mcp
小爷毛毛_卓寿杰7 分钟前
【Dify(v1.2) 核心源码深入解析】Agent 模块
人工智能·后端·python
北京青翼科技39 分钟前
【PCIE736-0】基于 PCIE X16 总线架构的 4 路 QSFP28 100G 光纤通道处理平台
图像处理·人工智能·fpga开发·信号处理
IT古董1 小时前
【漫话机器学习系列】206.稀疏性(Sparsity)
人工智能
AI小码1 小时前
期待的 A2A 和 MCP 的对比,谷歌与Anthropic联手打造的AI协作新时代,你准备好了吗?
人工智能·mcp
视觉AI1 小时前
PyTorch 模型转换为 TensorRT 引擎的通用方法
人工智能·pytorch·python
风筝超冷1 小时前
面试篇 - 位置编码
人工智能·深度学习
pen-ai1 小时前
【NLP】 21. Transformer整体流程概述 Encoder 与 Decoder架构对比
人工智能·自然语言处理·transformer
蹦蹦跳跳真可爱5891 小时前
Python----机器学习(基于PyTorch的垃圾邮件逻辑回归)
人工智能·pytorch·python·机器学习·逻辑回归
人工干智能2 小时前
科普:如何通过ROC曲线,确定二分类的“理论阈值”
大数据·人工智能·分类