首页 > 其他分享 >【进阶OpenCV】 (20) --疲劳检测

【进阶OpenCV】 (20) --疲劳检测

时间:2024-10-19 17:46:28浏览次数:3  
标签:eye 进阶 img -- reshape frame cv2 shape 20

文章目录

疲劳检测

使用OpenCV实现疲劳检测通常依赖于面部特征分析,特别是眼睛的状态(如眼睛开合程度)以及闭眼的时间。

一、面部识别

通过Dlib库构造人脸检测器,用于检测人脸,然后通过shape_predictor()加载模型用于定位检测到的人脸的关键点:

detector = dlib.get_frontal_face_detector() # 构造人脸检测器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") # 定位关键点模型
cap = cv2.VideoCapture(0)

二、主循环

1. 计算眼睛纵横比

通过euclidean_distances()函数计算两点间的距离:

def eye_aspect_ratio(eye):
    """-----计算眼睛纵横比-----"""
    A = euclidean_distances(eye[1].reshape(1,2),eye[5].reshape(1,2))
    B = euclidean_distances(eye[2].reshape(1,2),eye[4].reshape(1,2))
    C = euclidean_distances(eye[0].reshape(1,2),eye[3].reshape(1,2))
    ear = ((A+B)/2.0) / C # 纵横比
    return ear
COUNTER = 0 # 闭眼持续帧数统计
while True:
    ret,frame = cap.read()
    faces = detector(frame,0)
    for face in faces:
        shape = predictor(frame,face)# 获取关键点
        # 将关键点转换为坐标(x,y)的形式
        shape = np.array([[p.x,p.y] for p in shape.parts()])
        rightEye = shape[36:42] # 右眼,关键点索引从36到41
        leftEye = shape[42:48] # 左眼,关键点索引从42到47
        rightEAR = eye_aspect_ratio(rightEye) # 计算右眼纵横比
        leftEAR = eye_aspect_ratio(leftEye) # 计算左眼纵横比
        ear = (leftEAR + rightEAR) / 2.0 # 均值处理

2. 判断疲劳状态

当宽高比小于0.3,且连续50帧保持这个状态,则认定他处于疲劳状态:

def cv2ADDChineseText(img,text,position,textColor=(0,255,0),textSize=30):
    """像图片中添加中文"""
    if (isinstance(img,np.ndarray)):
        img = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
    draw = ImageDraw.Draw(img)

    fontStyle = ImageFont.truetype("simfang.ttf",textSize,encoding="Utf-8")
    draw.text(position,text,textColor,font=fontStyle)
    return cv2.cvtColor(np.asarray(img),cv2.COLOR_BGR2RGB)

if ear < 0.3: # 小于0.3认为闭眼,也可能是眨眼
    COUNTER += 1
    if COUNTER >= 50:
        frame = cv2ADDChineseText(frame,"!!!危险!!!",(250,250))
# 宽高比 > 0.3,则计数器清零,解除疲劳标志
else:
    COUNTER = 0 # 闭眼次数清零

3. 绘制双眼凸包

将双眼绘制出来:

def drawEye(eye): # 绘制眼眶凸包
    eyeHull = cv2.convexHull(eye)
    cv2.drawContours(frame,[eyeHull],-1,(0,255,0),1)

drawEye(leftEye) # 绘制左眼凸包
drawEye(rightEye) # 绘制右眼凸包

4. 显示眼睛闭合程度值

info = "EAR:{:.2f}".format(ear[0][0])
frame = cv2ADDChineseText(frame,info,(0,30)) # 显示眼睛闭合程度值

5. 显示图像

    cv2.imshow("Frame",frame)
    if cv2.waitKey(1) == 27:
        break

三、释放资源

cv2.destroyAllWindows()
cap.release()

四、完整代码展示

import numpy as np
import dlib
import cv2
from sklearn.metrics.pairwise import euclidean_distances
from PIL import Image,ImageDraw,ImageFont

def eye_aspect_ratio(eye):
    """-----计算眼睛纵横比-----"""
    A = euclidean_distances(eye[1].reshape(1,2),eye[5].reshape(1,2))
    B = euclidean_distances(eye[2].reshape(1,2),eye[4].reshape(1,2))
    C = euclidean_distances(eye[0].reshape(1,2),eye[3].reshape(1,2))
    ear = ((A+B)/2.0) / C # 纵横比
    return ear

def cv2ADDChineseText(img,text,position,textColor=(0,255,0),textSize=30):
    """像图片中添加中文"""
    if (isinstance(img,np.ndarray)):
        img = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
    draw = ImageDraw.Draw(img)

    fontStyle = ImageFont.truetype("simfang.ttf",textSize,encoding="Utf-8")
    draw.text(position,text,textColor,font=fontStyle)
    return cv2.cvtColor(np.asarray(img),cv2.COLOR_BGR2RGB)

def drawEye(eye): # 绘制眼眶凸包
    eyeHull = cv2.convexHull(eye)
    cv2.drawContours(frame,[eyeHull],-1,(0,255,0),1)

COUNTER = 0 # 闭眼持续帧数统计
detector = dlib.get_frontal_face_detector() # 构造人脸检测器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") # 定位关键点模型
cap = cv2.VideoCapture(0)

while True:
    ret,frame = cap.read()
    faces = detector(frame,0)
    for face in faces:
        shape = predictor(frame,face)# 获取关键点
        # 将关键点转换为坐标(x,y)的形式
        shape = np.array([[p.x,p.y] for p in shape.parts()])
        rightEye = shape[36:42] # 右眼,关键点索引从36到41
        leftEye = shape[42:48] # 左眼,关键点索引从42到47
        rightEAR = eye_aspect_ratio(rightEye) # 计算右眼纵横比
        leftEAR = eye_aspect_ratio(leftEye) # 计算左眼纵横比
        ear = (leftEAR + rightEAR) / 2.0 # 均值处理

        if ear < 0.3: # 小于0.3认为闭眼,也可能是眨眼
            COUNTER += 1
            if COUNTER >= 50:
                frame = cv2ADDChineseText(frame,"!!!危险!!!",(250,250))
        # 宽高比 > 0.3,则计数器清零,解除疲劳标志
        else:
            COUNTER = 0 # 闭眼次数清零
        drawEye(leftEye) # 绘制左眼凸包
        drawEye(rightEye) # 绘制右眼凸包
        info = "EAR:{:.2f}".format(ear[0][0])
        frame = cv2ADDChineseText(frame,info,(0,30)) # 显示眼睛闭合程度值
    cv2.imshow("Frame",frame)
    if cv2.waitKey(1) == 27:
        break
cv2.destroyAllWindows()
cap.release()

总结

本篇介绍了,如何通过人脸部眼睛的变化来简单的进行疲劳检测。

标签:eye,进阶,img,--,reshape,frame,cv2,shape,20
From: https://blog.csdn.net/m0_74896766/article/details/143081672

相关文章

  • 08SQL优化
    SQL优化InnoDB引擎的三大特性,事务,外键,行级锁。执行更新的时候,where更新的条件一定要有索引,如果没有索引就会出现行锁升级为表锁,并且索引不能失效否则也会出现行锁升级为表锁,一但升级为表锁并发性能就会降低。......
  • 2024年数字化转型与管理国际学术会议(DTM 2024) 2024 International Conference on Digi
    文章目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus大会时间:2024年11月22-24日三、大会介绍2024年数字化转型与管理国际学术会......
  • 09视图
    视图......
  • 第四届教育,语言与艺术国际学术会议 2024 4th International Conference on Education,
    文章目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus三、大会介绍第四届教育,语言与艺术国际学术会议(ICELA2024)将于2024年11月2......
  • 从 GPU 到 SambaNova,spatial computing 的数据流解决方案
    很早前看到知乎的这篇回答[1],技术栈太浅薄不能理解spatialcomputing的核心问题,而今年groq、tensotorrent、SambaNova各种新鲜技术范式出现层出不穷,把我的胃口吊得高高的,遂调研spatialcomputing。DataflowAccelerator(i.e.Graph-basedAccelerator)扯到spatialcomput......
  • 学习记录,这该死的c++
    最近还是比较懈怠,除了老师布置的作业其他的也是匆匆过一眼至于代码方面最主要的问题还是不理解该怎么表达。总的来说还是要在多沉淀。为什么会有知道敲代码但是不知道该怎么成功表达这个问题啊?还是不能把代码敲得精简一些可以来个人教我怎么敲关系符号吗?运用的还不是很熟练......
  • windows安装Android studio并运行显示"hello world"
    闲言本次流程的最终实现目的,正确安装AndroidStudio,并实现运行成功希望能帮到大家目录闲言安装前准备下载AndroidStudio安装新建项目第一次创建情况如果proxy未在创建新项目时出现运行创建虚拟机运行虚拟机碎语安装前准备下载AndroidStudio官网链接https://devel......
  • 网站主页模板修改?网站后台可以修改源代码?
    网站主页模板修改确定需求:首先明确你需要修改的具体内容,比如布局调整、颜色更换、添加或删除某些功能模块等。备份现有模板:在进行任何修改之前,确保备份当前使用的模板文件,以防修改过程中出现问题可以快速恢复。编辑HTML/CSS/JavaScript:根据需求对HTML结构、CSS样式以及JavaScr......
  • Ubuntu 24.04使用virtualBox启动虚拟机提示Kernel driver not installed的解决办法
    1.Ubuntu安装virtualBoxvirtualBox官方下载对应ubuntu24.04系统的deb安装包进入到下载文件所在目录使用如下apt命令安装下载好的deb安装包sudoaptinstall-f./virtualBox*2.启动虚拟机提示“Kerneldrivernotinstalled”由于我装的是双系统,ubuntu挂载了windows下使......
  • abc_python_day01
    1.编译型VS解释型编译型将代码一次性全部编译成二进制,再执行优点:执行效率高缺点:开发效率低,不可跨平台代表语言:C语言解释型将代码一行一行地编译成二进制,再执行优点:开发效率高,可以跨平台缺点:执行效率低代表语言:python2.变量what:​ 在写代码的过程中,要用到......