引言

本文章实现的疲劳驾驶功能比较单一,仅对眼部进行一个眨眼阈值的检测,并没有对人脸其它部位(瞌睡会点头、嘴部微张等)进行检测,需要在疲劳驾驶这个方向上深究的hxd可以自己对代码进行迭代更新。

这篇文章会很啰嗦,想看代码的hxd可以跳到后边去看。。。

仅供参考— 因为Github上已经有开源的项目了

需要用到的环境及配置文件

python3.8
dlib
opencv

定位人脸关键点模型(注:进入页面后拖到最下边,下载 shape_predictor_68_face_landmarks.dat.bz2 这个文件)

本次项目实现的理论来源–论文

dlib人脸关键点模型有问题的可以参考这篇文章,再不会可以给我留言,有问必答。

实现思路

1、获取到人脸,计算机摄像头获取到的图像是一张大画布,人脸在上边显得很小,这时候按照传统的方法需要写一些回归算法来定位到人脸,而dlib的内置函数会帮我们解决这一问题。

2、获取到人脸关键点,在上边的基础上,定位到人脸之后,再利用我们上述说到的68个关键点模型对关键点进行定位


利用68个关键点模型获取到人脸的关键点坐标后,仔细观察可以看到左眼坐标是(42-48),右眼坐标是(36-42) ,得到关键点坐标之后就可以开撸了

3、最后参考上边的论文算法基础对本项目进行最后的实现,简单说一下这篇论文算法的核心思想。

这篇论文提到了两个关键的参数,EAR(眨眼最小阈值)、ratio(连续眨眼的最小连续帧)。

这里解释一下这个ratio,因为计算读取视频其实就是将视频分为一帧一帧的来播放,这里你可以理解为PPT放映,就是当闭眼超过多少帧之后,判定为瞌睡疲劳驾驶。

代码实现

import cv2
import dlib
import pygame
import time
from scipy.spatial import distance
from collections import OrderedDict
from imutils import face_utils# 读取音乐
pygame.mixer.init()
pygame.mixer.music.load('../img/audio.mp3')# 加载dlib人脸分类器
detection = dlib.get_frontal_face_detector()
# 读取68点模型文件
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')# 开摄像头
video_capture = cv2.VideoCapture(0)
time.sleep(2)# 求er值
def calculate_EAR(eye):# 计算眼睛之间的距离,利用scipy  distance 计算上眼皮和下眼皮之间欧氏距离A = distance.euclidean(eye[1], eye[5])B = distance.euclidean(eye[2], eye[4])C = distance.euclidean(eye[0], eye[3])ear_aspect_ratio = (A + B) / (2.0 * C)return ear_aspect_ratio# 眨眼最小阈值  触发报警的眼睛纵横比的最小阈值
eyes_blink = 0.3
# 眼睛比率低于触发警报阈值的最小连续帧
eyes_ratio = 50
# 眨眼次数检测
count = 0
SHAPE_68_INDEX = OrderedDict([("left_eye", (42, 48)),("right_eye", (36, 42))
])
# 拿坐标
(lstart,lend) = SHAPE_68_INDEX['left_eye']
(rstart,rend) = SHAPE_68_INDEX['right_eye']while (True):# 读取每个帧并将其翻转,然后转换为灰度ret, frame = video_capture.read()frame = cv2.flip(frame,1)gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 利用模型文件对脸型上的68个点进行定位寻找faces = detection(gray,0)for face in faces:shape = predictor(gray, face)shape = face_utils.shape_to_np(shape)# 左右眼坐标leftEye = shape[lstart:lend]rightEye = shape[rstart:rend]# 调用参数计算上眼皮和下眼皮的距离leftEyeDistance = calculate_EAR(leftEye)rightEyeDistance = calculate_EAR(rightEye)# 计算均值ER = (leftEyeDistance+rightEyeDistance) / 2# 利用cv2.convexhull 寻找图像凸包(凸包就是:打比方一个五角星,每一个尖点相连)leftEyeHull = cv2.convexHull(leftEye)rightEyeHull = cv2.convexHull(rightEye)# 将眼睛画线cv2.drawContours(frame, [leftEyeHull], -1, (0, 255, 0), 1)cv2.drawContours(frame, [rightEyeHull], -1, (0, 255, 0), 1)# 眨眼检测if (ER < eyes_blink):count += 1if count >= eyes_ratio:pygame.mixer.music.play(-1)# 因为编码格式原因,中文显示不了cv2.putText(frame, "you are tired", (150, 200), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 0, 255), 2)else:pygame.mixer.music.stop()count = 0cv2.imshow('Video', frame)if(cv2.waitKey(1) & 0xFF == ord('q')):breakvideo_capture.release()
cv2.destroyAllWindows()

总结

为了方便大家看得更清晰一点,我加了很多注释,还有什么问题欢迎大家点赞留言

python + dlib 实现简单疲劳驾驶检测相关推荐

  1. Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测

    点击查看:Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测 文件大小:80M 操作系统:Windows10旗舰版 开发工具:Python3.8.OpenCV4.5.dlib 开发语言:.py ...

  2. Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!

    文件大小:80M 操作系统:Windows10旗舰版 开发工具:Python3.8.OpenCV4.5.dlib 开发语言:.py 简要概述: 疲劳检测 原理 因为人在疲倦时大概会产生两种状态: 眨眼 ...

  3. python疲劳检测代码_【君奉天|开发日记】疲劳驾驶检测

    我之前写的关于DuerOS开发日记: 今天看了2017百度世界大会上李彦宏董事长介绍了百度的疲劳驾驶检测,正好我之前阿德里安·罗斯布鲁克的文章中介绍了利用Facial landmarks + drow ...

  4. 基于YOLOv5的疲劳驾驶检测系统(Python+清新界面+数据集)

    摘要:基于YOLOv5的疲劳驾驶检测系统使用深度学习技术检测常见驾驶图片.视频和实时视频中的疲劳行为,识别其闭眼.打哈欠等结果并记录和保存,以防止交通事故发生.本文详细介绍疲劳驾驶检测系统实现原理的同 ...

  5. 毕设 深度学习疲劳驾驶检测 opencv python

    文章目录 0 前言 1 课题背景 2 实现目标 3 当前市面上疲劳驾驶检测的方法 4 相关数据集 5 基于头部姿态的驾驶疲劳检测 5.1 如何确定疲劳状态 5.2 算法步骤 5.3 打瞌睡判断 6 基 ...

  6. 基于MATLAB人脸检测的汽车疲劳驾驶检测

    课题介绍 疲劳驾驶导致汽车交通事故逐年增加,为了提升驾车的安全性,需对驾驶员疲劳状态实时监测并及时提醒. 为了提高疲劳驾驶判断效率及准确率,本文运用Viola-Jones 框架特征矩阵进行人脸预判断: ...

  7. 疲劳驾驶检测系统的研究

    MATLAB疲劳驾驶检测系统 摘要:随着我国生活水平的提高,在交通方面有了质的飞跃,其中汽车保有量更是与日俱增.但是,随之而来的交通事故也源源不 断.据统计,我国交通事故死亡人数己连续10多年居世界第 ...

  8. 基于脑电功率的疲劳驾驶检测研究_kaic

    基于脑电功率的疲劳驾驶检测研究 摘  要 在道路交通安全领域,疲劳驾驶是一种常见的交通安全隐患.现有数据统计,全球每年有大约21%的重大交通事故与疲劳驾驶有关,疲劳驾驶成为了诱发交通事故的主要原因之一 ...

  9. Python实现一个简单的目标检测

    Python实现一个简单的目标检测 相关介绍 实验环境 基本思路 代码实现 输出结果 相关介绍 选择性搜索(Select Search)算法属于候选区域算法,用分割不同区域的办法来识别潜在的物体.在分 ...

最新文章

  1. linux下 为自己编写的程序 添加tab自动补全 功能
  2. LA 3353 最优巴士线路设计
  3. Android studio官网资料
  4. CRM Fiori页面返回的元数据解析
  5. 93. Restore IP Addresses 1
  6. mysql占用内存吗_mysql占多少内存
  7. python post上传大文件分片上传_基于七牛 用python实现分片上传 创建文件报错701...
  8. 500 cannot be cast to javax.xml.registry.infomodel
  9. 吴恩达CNN卷积神经网络第2周作业ResNets
  10. PDMS管道设计基础到精通视频教程
  11. 近40年码龄,从通宵写代码到三思而后行——专访云风
  12. 基于 GARCH-CoVaR 方法的中国 A 股行业 关联网络风险溢出动态研究
  13. 服务器系统含5用户是什么意思,你好,想问下,我现在用的是T1商贸宝批发零售版5用户的,现在服务器是用WIN7,32位的系统,如果我的服务器升级为WIN10系统可不可以用?...
  14. 【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法
  15. 机器人设计必备的软件有哪些
  16. 各种输入方法总结(C++)
  17. 安卓开发SlidingDrawer实现抽屉效果
  18. 科研项目管理系统 — 出人才、出成果、出效益
  19. 关于实现3D立体旋转效果的轮播视图
  20. 大厂小厂都在用的RAID软件磁盘阵列技术,必须学起来!

热门文章

  1. 概率论之 几个难的分布题型汇总(泊松,指数,正态)
  2. Axure rp9的使用——动态面板
  3. java人点灯问题_JAVA学习,写的一个点灯小游戏
  4. JPEG最优压缩参数试验【光影魔术手VS Image Optimizer】
  5. webpack5.x 各种开发常见配置大汇总 loader plugin devServer proxy babel 懒加载
  6. Starforce(几家欢喜几家愁)
  7. H.264/MPEG-4:高质量视频数据流传播的视频多媒体数字信号编解码器(Video CODEC For High Quality Video Str
  8. 【飞桨PaddleSpeech语音技术课程】— 语音识别-Deepspeech2
  9. 水晶报表导出到Excel
  10. 【C语言】中文符号(句号,问号,感叹号)作为标识符进行分行处理