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

实时眼睛疲劳检测与提醒

1. 引言

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

2. 实现

2.1 实时视频显示

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

python 复制代码
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)

2.2 眼睛疲劳检测

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

python 复制代码
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)

2.3 提示音播放

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

python 复制代码
from threading import Thread
from playsound import playsound

def play_sound():
    playsound("tip.mp3")

3. 结论

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

提示音下载:https://sc.chinaz.com/yinxiao/230223359280.htm
代码参考源自:Shady的混乱空间

相关推荐
why15122 分钟前
腾讯(QQ浏览器)后端开发
开发语言·后端·golang
charade31225 分钟前
【C语言】内存分配的理解
c语言·开发语言·c++
LinDaiuuj26 分钟前
判断符号??,?. ,! ,!! ,|| ,&&,?: 意思以及举例
开发语言·前端·javascript
float_六七33 分钟前
Python语言基础知识详解:分支结构控制语句
python
声声codeGrandMaster33 分钟前
django之优化分页功能(利用参数共存及封装来实现)
数据库·后端·python·django
Johny_Zhao1 小时前
OpenStack 全套搭建部署指南(基于 Kolla-Ansible)
linux·python·信息安全·云计算·openstack·shell·yum源·系统运维
27669582921 小时前
海关 瑞数 后缀分析 rs
java·python·rs·瑞数·海关·瑞数后缀·后缀生成
小臭希1 小时前
Java——琐碎知识点一
java·开发语言
学c真好玩1 小时前
Django创建的应用目录详细解释以及如何操作数据库自动创建表
后端·python·django
沐暖沐2 小时前
Django(快速上手版)
python·django