在 Python 中使用 cv2 进行嗜睡检测

news2024/11/25 23:13:16

48571e30ff6c816d85cff4b965928499.png

大家好,在这个博客中,我们将构建一个嗜睡检测应用程序,它将检测视频中的人是否变得昏昏欲睡。

这是一个非常有趣且简单的项目,代码甚至不到 80 行,让我们开始吧

看看最终输出

注意——你不会在这里听到警报声,因为它是 GIF,你可以在博客上查看视频:

https://machinelearningprojects.net/drowsiness-detection/

44180a5da1ddb86d8b9f432fbcb3f0aa.gif

嗜睡检测代码

from imutils import face_utils
import dlib
import cv2
from pygame import mixer

thres = 6
mixer.init()
sound = mixer.Sound('alarm.wav')
dlist = []
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
cap = cv2.VideoCapture(0)

def dist(a,b):
    x1,y1 = a
    x2,y2 = b
    return ((x1-x2)**2 + (y1-y2)**2)**0.5
 
while True:
    # Getting out image by webcam 
    _, image = cap.read()
    # Converting the image to gray scale
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        
    # Get faces into webcam's image
    rects = detector(gray, 0)
    
    # For each detected face, find the landmark.
    for (i, rect) in enumerate(rects):
        # Make the prediction and transfom it to numpy array
        shape = predictor(gray, rect)
        shape = face_utils.shape_to_np(shape)
    
        # Draw on our image, all the finded cordinate points (x,y) 
        for (x, y) in shape:
            cv2.circle(image, (x, y), 2, (0, 255, 0), -1)
        
        le_38 = shape[37]
        le_39 = shape[38]
        le_41 = shape[40]
        le_42 = shape[41]
        re_44 = shape[43]
        re_45 = shape[44]
        re_47 = shape[46]
        re_48 = shape[47]
        
        dlist.append((dist(le_38,le_42)+dist(le_39,le_41)+dist(re_44,re_48)+dist(re_45,re_47))/4<thres)
        if len(dlist)>10:dlist.pop(0)
        # Drowsiness detected
        if sum(dlist)>=4:
            try:
                sound.play()
            except:
                pass
        else:
            try:
                sound.stop()
            except:
                pass
        
    # Show the image
    cv2.imshow("Output", image)
    
    if cv2.waitKey(5) & 0xFF == 27:
        break
cv2.destroyAllWindows()
cap.release()
  • 第 1-4 行:导入所需的库。

  • 第 6 行:设置阈值(将在前面的代码中看到)。

  • 第 8-9 行:使用 pygame 模块创建警报声音,以便在应用程序中进一步使用它。

  • 第 11 行:我们将在前面使用的空列表。

  • 第 13 行:使用 dlib 人脸检测器。

  • 第 14 行:使用 dlib 地标检测器检测眼点。

  • 第 16 行:初始化 cap 对象以便稍后使用 Webcam。

  • 第 18-21 行:一个简单的距离函数,用于计算两个坐标之间的距离。

  • 第 25 行:从网络摄像头读取图像。

  • 第 27 行:将它们转换为灰度。

  • 第 30 行:检测人脸。

  • 第 33 行:开始遍历这些面部。

  • 第 35-36 行:获取 68 个面部特征并将它们转换为 NumPy 数组。

  • 第 39–40 行:画出所有的地标。

  • 第 42-50 行:提取所需的眼睛标志。

  • 对于左眼,我们将提取38、39、42 和 41。

  • 对于右眼,我们将提取44、45、48 和 47。

  • 在阅读进一步的步骤之前,请阅读下面的算法。

e4bd48c3c541bb51f5647f1fb6bd8ec2.jpeg
  • 第 54 行:该行负责保持 dlist=10 的大小。

  • 删除是从前面完成的,添加是在最后完成的。

  • 这就像一个队列系统。

  • 第 57–66 行:当 dlist 中至少有 4 个 True 时播放警报。当它们小于 4 时停止。

  • 第 69 行:显示图像。

  • 第 71–72 行:当用户按下ESC键时停止应用程序。

  • 第 74–75 行:关闭所有 cv2 窗口并释放网络摄像头。

用于检测嗜睡的算法:

  • 求 38-42、39-41、44-48 和 45-47 地标之间的距离,并求这 4 个地标的平均值。

  • 如果这个平均值大于我们最初定义的 thres,则在我们的 dlist 中追加/添加一个 True。

  • 如果我们的 dlist 包含 4 个或更多 Trues,则意味着在连续 4 帧中,检测到睡意,因此播放警报。

  • 我们保留了大于等于4,因为如果我们不这样做,即使我们眨眼,我们的程序也会发出警报,这是误报。

输出:

177bfc6d3bcb44a317cc5e30d66ae7ed.gif

注意——你不会在这里听到警报声,因为它是 GIF,你可以在博客上查看视频:https://machinelearningprojects.net/drowsiness-detection/

要下载源代码,请访问博客 — https://machinelearningprojects.net/drowsiness-detection/

执行嗜睡检测的其他想法:

  • 第一种方法是我们在上面执行的方法。

  • 第二种方法是在人脸图像上训练神经网络。

  • 第三种方法是在眼睛图像上训练神经网络。

这就是你可以使用 cv2和 dlib 在 python 中执行嗜睡检测的方法。

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

2d1815dd728d037e58eff3cf184a6019.jpeg

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

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

相关文章

Stm32旧版库函数12——定时器的使用\time1

#include "stm32f10x_lib.h" #include "usart.h" #include "delay.h" #include "sys_config.h" #include <math.h> //Keil library #define uchar unsigned char #define uint unsigned int //通用定时器中断初始…

SpringCloud(6)— RabbitMQ(消息队列)

SpringCloud&#xff08;6&#xff09;— RabbitMQ(消息队列) 一 初识MQ 1.同步通信与异步通信 1.同步通信的问题 同步调用的优点在于时效性高&#xff0c;可以立即得到结果 微服务之间基于Feign的调用属于同步方式&#xff0c;存在一些问题 耦合性&#xff1a;业务较多时&a…

硅片检测半导体运动台控制器的设计

多自由度精密运动平台是半导体行业中硅片制造和检测过程里至关重要的问题&#xff0c;采用直线电机和音圈电机等先进驱动方式的精密运动平台相对传统滚珠丝杠旋转电机运动的运动平台&#xff0c;具有精度高、响应快、寿命长、免维护和结构简单等诸多优点&#xff0c;优势十分明…

为什么感觉现在很少有黑客了?

有一个词语&#xff0c;人人不是它&#xff0c;却人人都提及它&#xff0c;他就是&#xff1a;黑客&#xff01; 黑客&#xff0c;这个我们从小就接触的工种&#xff0c;总是衣服全身黑衣、眼戴墨镜、冷酷无情、超级厉害的形象&#xff0c;关键是&#xff0c;只要应用崩了/数据…

一颗芯片是怎样诞生的

目录 从沙子到单晶硅 单晶硅切片 电路实现 芯片的封装 芯片属于半导体。半导体是介于导体和绝缘体之间的一类物质&#xff0c;元素周期表中硅、锗、硒、硼的单质都属于半导体。这些单质通过掺杂其他元素生成的一些化合物&#xff0c;也属于半导体的范畴。 P型半导体是在单…

Linux安装phpstudy(无联网版)

下载install.sh Centos安装脚本&#xff0c;直接在浏览器打开https://notdocker.xp.cn/install.sh下载install.sh #官方安装命令 yum install -y wget && wget -O install.sh https://notdocker.xp.cn/install.sh && sh install.sh #命令解析 yum install -y …

AI作画,AIGC领域新的引爆点

AI作画火爆&#xff0c;一帧秒创再创惊喜 2022年渐近尾声&#xff0c;这一年小事不断&#xff0c;大事不少。当今这个时代&#xff0c;似乎注定就是一个见证历史和颠覆观念的时代。AIGC领域在人工智能、元宇宙概念兴起的背景之下&#xff0c;在今年迎来一个火爆增长。 其中的…

Github每日精选(第76期):在 Mac 状态栏上显示进程流量的监视器ITraffic-monitor-for-mac

ITraffic-monitor-for-mac ITraffic-monitor-for-mac 在 Mac 状态栏上显示进程流量的监视器&#xff0c;在windows我们的流量可以通过电脑管家或者360进行显示&#xff0c;在进行网络编程的时候&#xff0c;这个确实帮了不少忙&#xff0c;但是咱Mac下&#xff0c;显示网络状况…

oracle的trunc函数改为hive的函数

trunc函数可以截取oracle的日期 select trunc(sysdate,yyyy) from dual;--返回当年第一天 select trunc(sysdate,mm) from dual; --返回当月第一天 select trunc(sysdate,dd) from dual;--返回当前年月日 select trunc(sysdate,d) from dual; --返回当前星期的第一天(星期日) …

怎么把电脑硬盘文件恢复回来?跟着我这么做

电脑的硬盘数据丢失了&#xff0c;用了很多方法都没有办法找回来&#xff0c;电脑文件还能找回来吗&#xff1f;硬盘文件恢复要怎么操作&#xff1f;这时候就要寻求第三方数据恢复软件来恢复数据了。下面有详细的操作步骤&#xff0c;简单几步就可以找回你消失的硬盘数据&#…

leetcode90子集II-回溯-Java

说明&#xff1a; 问题描述来源leetcode 题解1&#xff1a; /*** author xin麒* date 2022/12/15 11:18* 给你一个整数数组 nums &#xff0c;其中可能包含重复元素&#xff0c;请你返回该数组所有可能的子集&#xff08;幂集&#xff09;。* 解集 不能 包含重复的子集。返回…

DPDK介绍

一、什么是DPDK&#xff1f; DPDK 全称是数据平面开发套件 (Data Plane Development Kit)&#xff0c;由 6WIND,Intel 等多家公司开发&#xff0c;主要基于 Linux 系统运行&#xff0c;用于快速数据包处理的函数库与驱动集合&#xff0c;可以极大提高数据处理性能和吞吐量&…

DGIOT边缘主机功能——6USB串口替代普通dtu/网关的设备接入

[小 迪 导读]&#xff1a; dgiot边缘主机自带6个USB口、2个RS232串口以及2个网口&#xff0c;可用组态对边缘主机上的USB口、串口和网口等上的外设进行可视化管理&#xff0c;包括如下功能&#xff1a; 通过6个USB口外接USB转485转换器模拟6个485转以太网/无线的网关/dtu2个RS…

JavaWeb——在线音乐播放器

文章目录效果演示1. 创建SpringBoot项目2. 数据库设计3. 配置数据库和xml4. 登录模块设计4.1 创建User类4.2 创建对应的Mapper和Controller5. 实现登录5.1 登录的请求和响应设计5.2 请求实现5.3 响应实现5.31 设置统一的响应体类工具类5.32 创建常量工具类5.33 优化后完整代码6…

纳米源表测试软件更新,新增太阳能电池测试、双通道脉冲扫描

源表在电测行业中应用十分广泛&#xff0c;尤其是在需求高精度的半导体、纳米器件和材料、太阳能电池、印刷电子技术等领域有着举足轻重的地位&#xff1b;而源表软件则可以实现源表的远程控制&#xff0c;通过在软件控制源表进行配置或者测量&#xff0c;也可以对测量的数据和…

大学生游戏静态HTML网页设计 (HTML+CSS+JS仿英雄联盟网站15页)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

2.5.9 使用 systemd 管理 MySQL 服务器实例

2.5.9 使用 systemd 管理 MySQL 服务器实例systemd 概述为 MySQL 配置 systemd使用 systemd 配置多个 MySQL 实例从 mysqld_safe 迁移到 systemd如果在以下 Linux 平台上使用 RPM 或 Debian 软件包安装 MySQL &#xff0c;则服务器启动和关闭由 systemd 管理&#xff1a; RPM …

时间序列-预测-模型-2020:Informer【比Transformer更有效的长时间序列预测】【在对性能影响不大的前提下降低复杂度】

摘要 时序预测这个领域的工作与很多其他领域类似,我们可以按“深度学习”方法的引入作为分界线。在此之前的方法是传统的时序建模方法,比如移动平均、自回归、以及结合差分的ARIMA模型等,有着悠久的历史以及基于理论基础的可解释性。但是,这类方法一般要求时间序列是平稳的…

视频转文字怎么弄?建议收藏这些方法

小伙伴们在闲暇之余&#xff0c;会不会通过一些网课的学习&#xff0c;来提高自己呢&#xff1f;有时我们网课学习来不及做笔记&#xff0c;但是重复观看又比较麻烦&#xff0c;这时我们就可以通过将视频转换成文字&#xff0c;这样就能够清楚明了的知道视频的讲解内容了。那你…

springcloud整合Hystrix

作用 1、服务降级 触发情况&#xff1a;程序运行异常、超时、服务熔断触发服务降级、线程池/信号量打满也会触发服务降级 2、服务熔断 直接拒绝访问&#xff0c;即使有正确的访问也会短路 3、服务限流 排队有序进行 构建服务 1、建module provider-hystrix-payment8001 2、改…