【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的混乱空间

相关推荐
豌豆花下猫3 分钟前
Python 潮流周刊#78:async/await 是糟糕的设计(摘要)
后端·python·ai
YMWM_5 分钟前
第一章 Go语言简介
开发语言·后端·golang
只因在人海中多看了你一眼6 分钟前
python语言基础
开发语言·python
2401_858286118 分钟前
101.【C语言】数据结构之二叉树的堆实现(顺序结构) 下
c语言·开发语言·数据结构·算法·
y25089 分钟前
《Object类》
java·开发语言
小技与小术14 分钟前
数据结构之树与二叉树
开发语言·数据结构·python
hccee35 分钟前
C# IO文件操作
开发语言·c#
hummhumm40 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
杜小满44 分钟前
周志华深度森林deep forest(deep-forest)最新可安装教程,仅需在pycharm中完成,超简单安装教程
python·随机森林·pycharm·集成学习
J老熊1 小时前
JavaFX:简介、使用场景、常见问题及对比其他框架分析
java·开发语言·后端·面试·系统架构·软件工程