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

文章目录

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

一、疲劳检测实现的思想

  • 了解以下几篇文章有助于了解疲劳检测的方法
    • 基于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()
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

个人博客搭建 | Hexo框架

文章目录 1.Hexo安装2.创建博客3.将博客通过GitHub来部署4.更换主题 1.Hexo安装 Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown&#xff08;或其他标记语言&#xff09;解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。搭建Hexo首先要…

基于vue框架的的大连金州红星社区物业管理系统dg6co(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;楼栋信息,住户,社区投诉,设备报修,报修完成,车位信息,缴费信息,房屋信息,维修工,保安,来访人员,缴费申诉,公共设备,设备类型,消防设备,公共场地 开题报告内容 基于Vue框架的大连金州红星社区物业管理系统的设计与实现开题报告 一、研究…

如果使用 Iptables 配置端口转发 ?

现实生活中&#xff0c;港口转发就像在一个大型公寓大楼里告诉送货司机该去哪里。通常情况下&#xff0c;该建筑群的正门是不对外开放的。但如果里面有人想要快递&#xff0c;他们可以告诉保安让司机进来&#xff0c;并指引他们到特定的公寓。 类似地&#xff0c;在计算机网络…

Android复杂问题分析工具bugreportz详解

文章目录 bugreportz详细介绍功能与作用使用方法生成详细报告检查进度bugreportz 的优势分析报告 如何分析1. 解压 ZIP 文件2. 分析主要文件2.1 bugreport.txt2.2 logcat.txt2.3 kernel.log / last_kmsg2.4 events.log2.5 traces.txt2.6 dumpstate_board.txt 3. 工具支持4. 重点…

Axure重要元件三——中继器添加数据

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 本节课&#xff1a;中继器添加数据 课程内容&#xff1a;添加数据项、自动添加序号、自动添加数据汇总 应用场景&#xff1a;表单数据的添加 案例展示&#xff1a; 步骤…

SpringColoud GateWay 核心组件

优质博文&#xff1a;IT-BLOG-CN 【1】Route路由&#xff1a; Gateway的基本构建模块&#xff0c;它由ID、目标URL、断言集合和过滤器集合组成。如果聚合断言结果为真&#xff0c;则匹配到该路由。 Route路由-动态路由实现原理&#xff1a; 配置变化Apollo 服务地址实例变化…

No.17 笔记 | XXE漏洞:XML外部实体注入攻击

1. XXE漏洞概览 XXE&#xff08;XML External Entity&#xff09;是一种允许攻击者干扰应用程序对XML输入处理的漏洞。 1.1 XXE漏洞比喻 想象XML解析器是一个听话的机器人&#xff0c;而XXE就是利用这个机器人的"过分听话"来获取不应该获取的信息。 1.2 XXE漏洞危…

vue综合指南(六)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vuet篇专栏内容:vue综合指南 目录 101、Vue 框架怎么实现对象和数组的监听&#xff1f; 102、Proxy 与 Object.d…

运营商DNS vs 公共DNS,IT运维的你选对了吗?

在IT运维中&#xff0c;选择运营商DNS还是公共DNS是一个需要综合考虑多方面因素的决策。 一、运营商DNS 优点 1. 速度与可用性&#xff1a; • 运营商DNS服务器通常部署在本地或邻近地区&#xff0c;因此能够提供较低的延迟和更快的解析速度。 • 运营商通常会投入大量资源来…

Java利用itextpdf实现pdf文件生成

前言 最近公司让写一个数据页面生成pdf的功能&#xff0c;找了一些市面代码感觉都太麻烦&#xff0c;就自己综合性整合了一个便捷的工具类&#xff0c;开发只需简单组装数据直接调用即可快速生成pdf文件。望大家一起学习&#xff01;&#xff01;&#xff01; 代码获取方式&am…

java游戏网站源码

题目&#xff1a;java游戏网站源码 编号B22A390 主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Mysql|大数据|SSM|SpringBoot|Vue|Jsp|MYSQL等)、学习资料、JAVA源码、技术咨询 文末联系获取 感兴趣可以先收藏起来&#xff0c;以防走丢&#xff0c;有任何选题、文档编…

初识C++--C++入门

一、命名空间 在c语言中存在着名字冲突的问题&#xff0c;即不能出现同名&#xff0c;会出现错误。而在c中变量、函数和后⾯要学到的类都是⼤量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作⽤域中&#xff0c;可能会导致很多冲突。为了解决这个问题&#xff0c…

十三、Python基础语法(字符串str-中)

一、切片 使用下标可以获得字符串中指定的一个字符&#xff0c;使用切片可以获取字符中多个字符。 字符串[start: end: step] start&#xff1a;开始位置的下标 end&#xff1a;结束位置的下标&#xff08;end对应的位置数据取不到&#xff09; step&#xff1a;步长&#…

要在 Git Bash 中使用 `tree` 命令,下载并手动安装 `tree`。

0、git bash 安装 git(安装,常用命令,分支操作,gitee,IDEA集成git,IDEA集成gitee,IDEA集成github,远程仓库操作) 1、下载并手动安装 tree 下载 tree.exe 从 tree for Windows 官方站点 下载 tree 的 Windows 可执行文件。tree for Window&#xff1a;https://gnuwin32.source…

FreeRTOS学习笔记1

结合汇编 ldr r3, pxCurrentTCB ldr r2 R3 value0x20000054,R2 value0x2002B950 pxCurrentTCB 020028950 pxTopOfStsck 0x2002B8FC 解释这些寄存器的值是怎么变化的 1. ldr r3, pxCurrentTCB 这一行指令将 全局变量 pxCurrentTCB 的地址加载到寄存器 r3 中。pxCu…

【论文精读】RELIEF: Reinforcement Learning Empowered Graph Feature Prompt Tuning

RELIEF: Reinforcement Learning Empowered Graph Feature Prompt Tuning 前言AbstractMotivationSolutionRELIEFIncorporating Feature Prompts as MDPAction SpaceState TransitionReward Function Policy Network ArchitectureDiscrete ActorContinuous ActorCritic Overall…

【C++】精妙的哈希算法

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 一、哈希结构1、哈希概念2、哈希函数3、哈希冲突3.1 闭散列3.2 开散列 4、完整代码 一、哈希结构 1、哈希概念 A…

C# WPF 仿 Android Toast 效果

转载请注明出处: https://blog.csdn.net/hx7013/article/details/142860084 主职Android, 最近需要写一些WPF的程序作为上位机&#xff0c;目前WPF的MessageBox过于臃肿&#xff0c;且想找一个内置的非阻塞的简单提示一直找不到&#xff0c;想到了Android的Toast所以写了这个扩…

低代码可视化-uniapp购物车页面-代码生成器

购物车页面是电子商务网站或应用程序中的一个关键功能页面&#xff0c;它允许用户查看、编辑和管理他们选择加入购物车的商品。下面通过低代码可视化实现一个uniapp购物车页面&#xff0c;把购物车整个事件都集成进去。实现完成后可以保存为页面模板。 收货地址选择 如果尚未…

yolov9目标检测/分割预测报错AttributeError: ‘list‘ object has no attribute ‘device‘常见汇总

这篇文章主要是对yolov9目标检测和目标分割预测测试时的报错&#xff0c;进行解决方案。 在说明解决方案前&#xff0c;严重投诉、吐槽一些博主发的一些文章&#xff0c;压根没用的解决方法&#xff0c;也不知道他们从哪里抄的&#xff0c;误人子弟、浪费时间。 我在解决前&…