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

相关推荐
liulilittle4 分钟前
C++ 浮点数封装。
linux·服务器·开发语言·前端·网络·数据库·c++
BoBoZz1921 分钟前
CutWithScalars根据标量利用vtkContourFilter得到等值线
python·vtk·图形渲染·图形处理
失散1341 分钟前
Python——1 概述
开发语言·python
萧鼎43 分钟前
Python 图像哈希库 imagehash——从原理到实践
开发语言·python·哈希算法
qq_2515335944 分钟前
使用 Python 提取 MAC 地址
网络·python·macos
小小8程序员1 小时前
STL 库(C++ Standard Template Library)全面介绍
java·开发语言·c++
立志成为大牛的小牛1 小时前
数据结构——五十六、排序的基本概念(王道408)
开发语言·数据结构·程序人生·算法
老王熬夜敲代码1 小时前
C++中的atomic
开发语言·c++·笔记·面试
a努力。2 小时前
腾讯Java面试被问:String、StringBuffer、StringBuilder区别
java·开发语言·后端·面试·职场和发展·架构
长安第一美人2 小时前
php出现zend_mm_heap corrupted 或者Segment fault
开发语言·嵌入式硬件·php·zmq·工业应用开发