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

相关推荐
深圳雨林凯AI19 分钟前
商品详情长图的自动生成:版块模板、要素抽取与版式约束的实现思路
人工智能·ai
lisw0521 分钟前
迁移学习(Transfer Learning):概念、历史、内容、挑战与展望
人工智能·机器学习·迁移学习
炫酷的大高个32 分钟前
98% 连跑 20 次只剩 67%,我算了大模型重试账
人工智能·架构·开源
可乐ea38 分钟前
智能体的模型列表为什么要从三处来源合成:一次让 GPT-6.1 Sol 选不上的发布延迟
人工智能·gpt·chatgpt·智能体框架·模型列表·多源数据合成·客户端工程
freewebsys1 小时前
【原始POSTMAN】最老一个版本的postman 大家还记得吗?官方已经不支持没有升级了,下载了组件用AI直接升级了下可以使用了!
人工智能
云南新人和数采集团1 小时前
云南靠谱软件开发公司选型指南:以昆明新腾科技为例
大数据·人工智能·科技
发现你走远了2 小时前
05-权限不是开关:工具调用如何在放行、拦截与追问之间做决定
人工智能·agent·claude
AllData公司负责人2 小时前
AI大模型数据开发底座系列说明书:AllData集成DB-GPT开源项目建设 AI 多模态分析底座,涵盖模态解析/智能大屏/MCP 扩展!
大数据·数据库·人工智能·gpt·数据采集·数据接入·模态解析
syyjhchou3 小时前
自己搭企业内部中转站,怎么让请求更容易命中缓存
人工智能·后端·语言模型·aigc
张然Adolf4 小时前
人工智能电力系统应用新手实战指南
人工智能