• 【Python】OpenCV-实时眼睛疲劳检测与提醒


    实时眼睛疲劳检测与提醒

    1. 引言

    眼睛疲劳对于长时间使用电子设备的人群来说是一个常见的问题。为了帮助用户及时发现眼睛疲劳并采取相应的措施,本文介绍了一个实时眼睛疲劳检测与提醒系统的简单实现。使用了OpenCV、MediaPipe以及Playsound库,通过摄像头捕捉实时图像,检测眼睛疲劳并在需要时播放提示音。

    2. 实现

    2.1 实时视频显示

    首先,通过OpenCV库捕获摄像头实时视频,显示在窗口中。

    import cv2
    
    cap = cv2.VideoCapture(0)
    while cap.isOpened():
        ret, frame = cap.read()
        if ret is False:
            break
        cv2.imshow("frame", frame)
        cv2.waitKey(10)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.2 眼睛疲劳检测

    接下来,使用MediaPipe库中的FaceMesh模型,获取面部特征点,从中提取左右眼的特定特征点。通过计算眼睛的EAR(Eye Aspect Ratio),判断眼睛是否闭合。

    import cv2
    import mediapipe as mp
    import numpy as np
    
    # 初始化FaceMesh
    face_mesh = mp.solutions.face_mesh.FaceMesh()
    
    cap = cv2.VideoCapture(0)
    sleep_frame_count = 0
    while cap.isOpened():
        ret, frame = cap.read()
        if ret is False:
            break
        rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        result = face_mesh.process(rgb_frame)
        if result.multi_face_landmarks:
            for face in result.multi_face_landmarks:
                # 获取眼睛特定特征点
                right_eye_landmark_ids = [362, 385, 387, 263, 373, 380]
                left_eye_landmark_ids = [33, 160, 158, 133, 153, 144]
                right_eye_landmarks = []
                left_eye_landmarks = []
                for id, landmark in enumerate(face.landmark):
                    if id in right_eye_landmark_ids:
                        x = int(landmark.x * frame.shape[1])
                        y = int(landmark.y * frame.shape[0])
                        cv2.circle(frame, [x, y], 1, [0, 255, 0])
                        right_eye_landmarks.append(np.array([x, y]))
                    if id in left_eye_landmark_ids:
                        x = int(landmark.x * frame.shape[1])
                        y = int(landmark.y * frame.shape[0])
                        cv2.circle(frame, [x, y], 1, [0, 255, 0])
                        left_eye_landmarks.append(np.array([x, y]))
    
                # 计算眼睛的EAR
                def EAR(landmarks):
                    d1 = np.linalg.norm(landmarks[1] - landmarks[5])
                    d2 = np.linalg.norm(landmarks[2] - landmarks[4])
                    d3 = np.linalg.norm(landmarks[0] - landmarks[3])
                    return (d1 + d2) / d3 * 0.5
    
                left_ear = EAR(left_eye_landmarks)
                right_ear = EAR(right_eye_landmarks)
    
                # 判断眼睛是否闭合
                if (left_ear + right_ear) / 2 < 0.85:
                    sleep_frame_count += 1
                    if sleep_frame_count >= 30:
                        sleep_frame_count = 0
                        print("不要睡觉")
                        # 在新线程中播放提示音
                        t = Thread(target=play_sound).start()
        cv2.imshow("frame", frame)
        cv2.waitKey(10)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    2.3 提示音播放

    当检测到眼睛疲劳时,通过Playsound库在新线程中播放提示音。

    from threading import Thread
    from playsound import playsound
    
    def play_sound():
        playsound("tip.mp3")
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3. 结论

    通过上述代码,展示了一个基于OpenCV、MediaPipe和Playsound的简单实时眼睛疲劳检测与提醒系统。通过面部特征点的获取和EAR的计算,系统能够及时识别用户的眼睛状态,并在需要时通过提示音提醒用户。这个简单而有效的系统可以用于提高长时间使用电子设备的用户对眼睛疲劳的警觉。

    提示音下载:https://sc.chinaz.com/yinxiao/230223359280.htm

    代码参考源自:Shady的混乱空间

  • 相关阅读:
    list的简单模拟实现
    Seata AT模式TransactionHook竟然会被莫名删除!
    一文全面介绍JWT框架知识
    《七月集训》(第六天)——滑动窗口
    APM32F103VCT6 写内部Flash失败解决方案(亲试可用)
    React基础
    Vue课程61-判断用户添加的数据是否为空
    ES6之数值的扩展
    《opencv学习笔记》-- 直方图均衡化、图像直方图、直方图的计算和绘制、直方图对比、反向投影、模板匹配
    加上boot程序,FreeRTOS就跑不起来了
  • 原文地址:https://blog.csdn.net/linjiuxiansheng/article/details/136179229