《计算机视觉》—— 疲劳检测

news2025/1/21 3:58:58

文章目录

  • 一、疲劳检测实现的思想
  • 二、代码实现

一、疲劳检测实现的思想

  • 了解以下几篇文章有助于了解疲劳检测的方法
    • 基于dlib库的人脸检测
      • https://blog.csdn.net/weixin_73504499/article/details/142977202?spm=1001.2014.3001.5501
    • 基于dlib库的人脸关键点定位
      • https://blog.csdn.net/weixin_73504499/article/details/142990867?spm=1001.2014.3001.5501
    • 基于dlib库的人脸关键部位的轮廓检测
      • https://blog.csdn.net/weixin_73504499/article/details/143027371?spm=1001.2014.3001.5501
  • 实现疲劳检测的方法核心方法是通过眼睛的关键点定位来实现的,具体思想如下:
    • 通过68个人脸关键点定位后的效果如下:
      在这里插入图片描述

    • 通过[36-41]和[42~45]这分别两组6个关键点来确定左眼和右眼的位置,眼睛的闭合程度会改变这些点的位置, 因此可以通过这6个点来计算眼睛睁开时的宽高比

    • 设定一个阈值来判断眼睛的闭合程度,低于这个阈值则表示眼睛处于非正常睁开状态,若长时间都低于这个阈值,则会判定为是处于疲劳状态

    • 具体实现如下图
      在这里插入图片描述

      • 取眼睛的6个关键点的上下两组点,分别求出两个距离,并取平均值,作为眼睛镇开时的高度
      • 取左右两个点,计算距离,作为眼睛镇开时的宽度
      • 高度与宽度的比值与设定的阈值进行比较,并做出判断

二、代码实现

好未写完!!!!!!!!!!!!!!!!

  • 定义计算眼睛纵横比的函数

    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)):  # 判断是否是OpenCV图片类型
            img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 实现 array 到 image 的转换
        draw = ImageDraw.Draw(img)  # 在img图片上创建一个绘图的对象
        # 字体的格式                       C 盘中的 Windows/Fonts 中,复制到此文件夹下可看到文件名
        fontStyle = ImageFont.truetype("simsun.ttc", textSize, encoding="utf-8")
        draw.text(position, text, textColor, font=fontStyle)  # 绘制文本
        return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)  # 转换回 OpenCV 格式
    
  • 完整代码:

    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)):  # 判断是否是OpenCV图片类型
            img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 实现 array 到 image 的转换
        draw = ImageDraw.Draw(img)  # 在img图片上创建一个绘图的对象
        # 字体的格式                       C 盘中的 Windows/Fonts 中,复制到此文件夹下可看到文件名
        fontStyle = ImageFont.truetype("simsun.ttc", textSize, encoding="utf-8")
        draw.text(position, text, textColor, font=fontStyle)  # 绘制文本
        return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)  # 转换回 OpenCV 格式
    
    """ 绘制眼眶凸包 """
    def drawEye(eye):
        eyeHull = cv2.convexHull(eye)
        cv2.drawContours(frame, [eyeHull], -1, (0, 255, 0))
    
    
    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()
        frame = cv2.flip(frame, 1)
    
        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(不包含42)
            leftEye = shape[42:48]      # 左眼,关键点索引从42到47(不包含48)
            rightEAR = eye_aspect_ratio(rightEye)   # 计算右眼纵横比
            leftEAR = eye_aspect_ratio(leftEye)     # 计算左眼纵横比
    
            ear = (rightEAR + leftEAR) / 2.0        # 均值处理
    
            if ear < 0.3:   # 小于0.3认为闭眼,也可能是眨眼(可根据实际调整)
                COUNTER += 1    # 每检测到一次,将+1
                if COUNTER >= 50:   # 持续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)
    
        # 检查是否按下ESC键(ASCII码27),如果按下则退出循环
        if cv2.waitKey(10) == 27:
            break
    
    # 释放摄像头资源
    cap.release()
    # 关闭所有OpenCV创建的窗口
    cv2.destroyAllWindows()
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于开源Jetlinks物联网平台协议包-MQTT自定义主题数据的自动回复

目录 1.根据需要自动回复某些主题 2.调用doReply方法进行自动回复 1.根据需要自动回复某些主题 根据主题判断&#xff0c;哪些主题是需要自动回复的&#xff0c;比如设备登录&#xff0c;需要自动回复。 2.调用doReply方法进行自动回复&#xff08;代码不一定全部正确&#xf…

第 5 章:vuex

1. 理解 vuex vuex 是什么&#xff1a; 概念&#xff1a;专门在 Vue 中实现集中式状态&#xff08;数据&#xff09;管理的一个 Vue 插件&#xff0c;对 vue 应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&am…

安乃达:用CRM构建从销售到管理到售后的全链路数字化运营平台

安乃达驱动技术(上海)股份有限公司((简称&#xff1a;“安乃达”,股票代码为&#xff1a;“603350”))自2011年以来&#xff0c;公司通过多年的研发与积累现有直驱轮毂电机、减速轮毂电机和中置电机三大系列产品&#xff0c;并具备与电机相匹配的控制器、传感器、仪表等电驱动成…

springboot旧物置换网站

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;…

ThinkPHP 3.2 + Nginx 页面404问题

学习公司Callout项目时&#xff0c;发现公司项目所使用的TP版本是3.2&#xff0c;所以才可以使用例如&#xff0c;C,M,A等方法 因此我用phpEnv搭建了一个项目&#xff0c;域名为thinkphp&#xff0c;所选根目录如下 我打开网页&#xff0c;访问 thinkphp/ 和 thinkphp/index.p…

ROS 的 urdf 中 link 和 joint 的子标签中 origin 的含义

主要参考文章——主要文章&#xff0c;官方关于urdf的介绍和官方文档的翻译解析 link标签里面的origin含义 link标签里面有三个主要的子标签&#xff0c;分别是visual——连杆的外观和坐标系&#xff0c;collisoin——连杆的碰撞属性和inertial——连杆的惯性设置 首先&…

C++ | AVL树

前言 本篇博客讲解c中数据结构AVL树&#xff0c;看这篇博客之前请先去看&#xff1a;C | 二叉搜索树-CSDN博客 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-m…

2024最新:零基础到精通的大模型AI产品经理全学习路线

随着人工智能技术的发展&#xff0c;尤其是大模型&#xff08;Large Model&#xff09;的兴起&#xff0c;越来越多的企业开始重视这一领域的投入。作为大模型产品经理&#xff0c;你需要具备一系列跨学科的知识和技能&#xff0c;以便有效地推动产品的开发、优化和市场化。以下…

第51期 C语言实现中断<一>

Q&#xff1a;怎样理解用C语言实现中断的过程呢&#xff1f; A&#xff1a;以下是一段使用C语言实现中断的主程序&#xff0c;和汇编语言实现中断一样也使用了定时器中断和按键中断。执行该主程序会在DE2-115的红色LED上显示流水灯&#xff0c;按下KEY1可以改变流水灯移动的…

FreeRTOS - 任务通知

1. 任务通知 所谓"任务通知"&#xff0c;你可以反过来读"通知任务"。 我们使用队列、信号量、事件组等等方法时&#xff0c;并不知道对方是谁。使用任务通知时&#xff0c;可以明确指定&#xff1a;通知哪个任务。 使用队列、信号量、事件组时&#xff…

【DBA Part01】国产Linux上安装Oracle进行数据迁移

内容如下&#xff1a; 1.1.生产环境RHEL/OEL Linux8Oracle11gR2安装配置 1.2.国产麒麟操作系统Oracle11gR2安装配置 1.3.国产麒麟操作系统Oracle11gR2 RAC集群安装配置 1.4.Oracle11gR2迁移到国产麒麟操作系统&#xff08;单机/RAC&#xff09; 本阶段课程项目需求说明&am…

[C++刷题] 基础小知识点(1) 乘方函数pow()

乘方 pow() 该函数在math.h头文件中 例如: 求圆的面积公式 s3.14*pow(r,2); 也可用于开方 pow(4,1.0/3) 注意这里要写1.0, 不然1/30,该函数会失效 例题: #include<iostream> using namespace std; #include<math.h>) int main() {int h;int r;cin >> h &g…

c++算法第3天

本篇文章包含三道算法题&#xff0c;难度由浅入深&#xff0c;适合新手练习哟 目录 第一题 题目链接 题目解析 代码原理 代码编写 本题总结 第二题 题目链接 题目解析 代码原理 代码编写 第三题 题目链接 题目解析 代码原理 代码编写 第一题 题目链接 [NOIP2…

ai抠图软件哪个好?一些快速掌握的基本抠图技巧,学习

有谁和小编一样&#xff0c;不修图还好&#xff0c;一要修图&#xff0c;100%会踩坑&#xff01; 没错&#xff0c;就是踩了网页上各种ai抠图软件免费版广告的坑&#xff0c;抠图不干净就算了&#xff0c;还会损坏原来的图片文件就很过分&#xff01; 伤心事不再多说&#xff0…

Junit单元测试时提示:Method should have no parameters

场景 Junit中运行单元测试时提示&#xff1a; Method XXX should have no parameters 如图&#xff1a; 代码如下&#xff1a; package com.ws.test.common;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extensi…

软考倒计时!中项计算题带练来啦!

已经进入下半年软考最后一个月&#xff0c;各位小伙伴的软考复习也已经来到了最后冲刺阶段&#xff0c;大家在知识点的背诵同时也别忽略计算题的练习&#xff0c;那么和小编一起来中项计算题的跟练吧&#xff01; 01、试题一 某信息系统项目包含如下 A、B、C、D、E&#xff0c…

Helm入门到实战演示

目录 1、Helm介绍 2、Helm v3版本变化 3、安装Helm v3 4、配置国内存放chart仓库的地址 5、Helm基本使用 5.1 搜索和下载Chart 5.2 部署chart 5.2.1 helm部署memcached服务 5.3 release相关操作 6、自定义Chart模板 6.1 自定义一个Chart 6.2 Chart.yaml编写规则 6.…

字节撒钱啦,快来薅羊毛!!!!!!!!!!!!!!!!

豆包MarsCode是给开发用的一款智能助手&#xff0c;能够实现代码智能补全、AI问答、智能测试等功能。 目前有一个推广活动&#xff0c;体验送10火星币&#xff0c;邀请一个新用户得10火星币&#xff0c;20个火星币就可以获得20京东E卡&#xff0c;隔日到账。 整个过程10分钟不…

STM32CUBEIDE的使用【三】RTC

于正点原子潘多拉开发板&#xff0c;使用stm32官方免费软件进行开发 CubeMx 配置 使用CubeMx 配置RTC 勾选RTC 设置日期和时间 配置LCD的引脚用来显示 STM32CUBEIDE 在usbd_cdc_if.c中重定向printf函数用于打印 #include <stdarg.h>void usb_printf(const char *f…

海思hi3536c配置内核支持USB摄像头

linux内核版本&#xff1a;linux-3.18.20 配置步骤 进入Device Drivers 选择Multimedia support&#xff0c;并进入 选择Media USB Adapters&#xff0c;并进入 如下图&#xff0c;选择这几项&#xff1a; 保存退出&#xff0c;重新编译内核下载 内核更新后&#xff0c…