眼睛纵横比(EAR)

在讨论EAR之前,先看看68个人脸特征点: 

人脸特征点检测本身的算法是很复杂的,dlib中给出了相关的实现。

每只眼睛由6个(x,y)坐标表示,从眼睛的左角开始,然后围绕该区域的其余部分顺时针显示:

基于这个描述,我们应该抓住重点:这些坐标的宽度高度之间有一个关系。

Soukupová和Čech在其2016年的论文“使用面部标志实时眼睛眨眼检测”的工作,我们可以推导出反映这种关系的方程,称为眼睛纵横比(EAR):

其中p1,...,p6是2D面部地标位置。

这个方程的分子是计算垂直眼睛标志之间的距离,而分母是计算水平眼睛标志之间的距离,因为只有组水平点,但是两组垂直点,所以进行加权分母。

为什么这个方程如此有趣?

我们将会发现,眼睛的长宽比在眼睛张开的时候大致是恒定的,但是在发生眨眼时会迅速下降到零。

使用这个简单的方程,我们可以避免使用图像处理技术简单地依靠眼睛地标距比例来确定一个人是否眨眼。

为了更清楚地说明,看下面的图:

底部图中绘出了眼纵横比随时间的视频剪辑的曲线图。正如我们所看到的,眼睛纵横比是恒定的,然后迅速下降到接近零,然后再增加,表明一个单一的眨眼已经发生。

代码实现

# -*- coding: utf-8 -*-
# import the necessary packages
from scipy.spatial import distance as dist
from imutils.video import FileVideoStream
from imutils.video import VideoStream
from imutils import face_utils
import numpy as np
import argparse
import imutils
import time
import dlib
import cv2def eye_aspect_ratio(eye):# 计算两个集合之间的欧几里得距离# 垂直眼标志(X,Y)坐标A = dist.euclidean(eye[1], eye[5])B = dist.euclidean(eye[2], eye[4])# 计算水平之间的欧几里得距离# 水平眼标志(X,Y)坐标C = dist.euclidean(eye[0], eye[3])# 眼睛长宽比的计算ear = (A + B) / (2.0 * C)# 返回眼镜的长宽比return ear# 定义两个常数
# 眼睛长宽比
# 闪烁阈值
EYE_AR_THRESH = 0.2
EYE_AR_CONSEC_FRAMES = 3
# 初始化帧计数器和眨眼总数
COUNTER = 0
TOTAL = 0# 初始化DLIB的人脸检测器(HOG),然后创建面部标志物预测
print("[INFO] loading facial landmark predictor...")
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')# 分别获取左右眼面部标志的索引
(lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"]
(rStart, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"]cap = cv2.VideoCapture(1)# 从视频流循环帧
while True:ret, frame = cap.read()gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 检测灰度帧中的人脸rects = detector(gray, 0)# 人脸检测循环for rect in rects:# 确定脸部区域的面部标志,然后将面部标志(x,y)坐标转换为数字阵列shape = predictor(gray, rect)shape = face_utils.shape_to_np(shape)# 提取左眼和右眼坐标,然后使用坐标计算双眼的眼睛长宽比leftEye = shape[lStart:lEnd]rightEye = shape[rStart:rEnd]leftEAR = eye_aspect_ratio(leftEye)rightEAR = eye_aspect_ratio(rightEye)# 双眼平均长宽比ear = (leftEAR + rightEAR) / 2.0# 计算左眼和右眼的标志点并绘制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)# 在图片中标注人脸,并显示left = rect.left()top = rect.top()right = rect.right()bottom = rect.bottom()cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 3)    '''第一步检查眼睛纵横比是否低于我们的眨眼阈值,如果是,我们递增指示正在发生眨眼的连续帧数。否则,我们将处理眼高宽比不低于眨眼阈值的情况,我们对其进行检查,看看是否有足够数量的连续帧包含低于我们预先定义的阈值的眨眼率。如果检查通过,我们增加总的闪烁次数。然后我们重新设置连续闪烁次数 COUNTER。'''if ear < EYE_AR_THRESH:COUNTER += 1else:# 如果眼睛闭合足够数量,那么眨眼总数增加if COUNTER >= EYE_AR_CONSEC_FRAMES:TOTAL += 1# 重置眼帧计数器COUNTER = 0for (x, y) in shape:cv2.circle(frame, (x, y), 1, (0, 0, 255), -1)cv2.putText(frame, "COUNTER: {}".format(COUNTER), (150, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)    cv2.putText(frame, "Blinks: {}".format(TOTAL), (10, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.putText(frame, "EAR: {:.2f}".format(ear), (300, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.imshow("Frame", frame)print(len(rects))   # if the `q` key was pressed, break from the loopif cv2.waitKey(1) & 0xFF == ord('q'):break# do a bit of cleanup
cv2.destroyAllWindows()

效果

dlib 基于摄像流检测眨眼次数相关推荐

  1. 活体检测眨眼、张嘴、点头、摇头动作一网打尽:人脸面部活体检测系统【含Python源码+PyqtUI界面+原理详解】

    基本功能演示 摘要:活体检测是用于判断捕捉到的人脸是真实人脸,还是伪造的人脸攻击的一种技术手段.本文详细介绍了其实现的技术原理,同时给出完整的Python实现代码,并且通过PyQT实现了UI界面,更方 ...

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

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

  3. 基于Python,dlib实现人脸关键点检测

    @代码实现及安装过程 基于Python,dlib实现人脸关键点检测 dilb 在做人脸检测人脸识别方面用到比较多的.face_recognition就是基于dlib实现的. 这篇文章将使用Python ...

  4. 【自动驾驶】基于面部Fatigue检测的技术报告

    [自动驾驶]基于面部Fatigue检测的技术报告 文章目录 [自动驾驶]基于面部Fatigue检测的技术报告 关于疲劳驾驶检测研究主要有哪几个方向 基于面部的疲劳检测研究的发展现状 共搜集43篇论文 ...

  5. 基于yolov8的检测分割跟踪软件系统(含Pyqt界面,附下载链接和演示视频,集成四种多目标跟踪算法,模型已训好)

    1.前言 本文重点介绍了基于YOLOv8目标检测分割跟踪系统的代码实现,用于智能检测物体种类并记录和保存结果,对各种物体检测结果可视化,提高目标识别的便捷性和准确性.数据集采用COCO,即可针对COC ...

  6. matlab谐波电流测量,基于MATLAB谐波电流检测仿真研究

    随着电力电子器件的广泛应用,系统电流发生畸变,电网中的谐波污染日益严重,影响了供电质量并且造成了电能的浪费,所以电网中的谐波问题的解决备受关注.本文基于瞬时无功功率理论,设计了电网谐波电流实时检测方法 ...

  7. 新华三与中国移动完成IPv6随流检测互通测试

    据悉,中国移动联合新华三等ICT企业完成随流检测互通测试,此测试的顺利收官,表明中国移动主导提出的SRv6/G-SRv6随流检测DOH(Destination Options Header)技术标准, ...

  8. 多视图CAD检测系统乳腺X线摄影基于案例的检测性能优化

    多视图CAD检测系统乳腺X线摄影基于案例的检测性能优化 介绍 通常乳腺肿块的检测基于双视图乳腺摄影,医生在阅片是会将所有可用视图的信息组合在一起,他们比较MLO和CC视图,寻找不对称性并评估相对于先前 ...

  9. 高精度随流检测技术助力金融行业实现智能运维

    导言 随着金融行业智慧网点的出现,以语音和视频为主要载体的各种新型无人智慧终端开始在网点普及.新的业务模式对网络提出了更高的要求.一方面语音和视频业务对丢包.时延和抖动非常敏感,丢包率高.时延大会导致 ...

最新文章

  1. 从电影《蝴蝶效应》中学习回溯算法的核心思想
  2. pandas使用dropna函数删除dataframe中列非缺失值的个数小于某一比例阈值的数据列
  3. 积跬步以至千里_积跬步以至千里,聚小利终成大户
  4. jieba详细使用说明
  5. 不同版本gene ID比较
  6. Java-虚拟机-终结方法finalize
  7. CentOS 6.3 上网慢问题
  8. Maven 清理 .lastUpdated 文件
  9. 10款网站后台管理系统模板_bootstrap网站后台模板_html后台模板下载(五)
  10. mysql.exe下载_mysql8 windows 下载安装
  11. Linux安装命令_rpm
  12. IP地址与DNS的作用,什么是IP地址与DNS【详细】
  13. 用户界面、交互体验设计优秀的产品
  14. 用户太多:互联网巨头之惑
  15. 肯定得想办法牵线搭桥
  16. Notification和NotificationManagerService原理解析
  17. 使用html2canvas和jspdf把网页保存pdf并下载
  18. MySQl 实现 FULL JOIN
  19. Elasticsearch(ES)的基本使用
  20. python discuz_python3实现discuz论坛数据库批量图文发帖搭建DZ插件模板网站附件源码下载...

热门文章

  1. 胖胖智能电子鞋柜功能介绍
  2. Android 实验二 火星探测车拍摄照片展示应用实现
  3. CSS边框设置以及内外边距的使用
  4. 当前服务器在线人数,显示当前在线人数
  5. MOOG穆格伺服阀G761-3005B
  6. 基于jQuery仿迅雷影音官网幻灯片特效
  7. 成功是一件很容易的事
  8. 2069;【例2.12 】糖果游戏(信奥一本通)
  9. 学习小学五年级的知识——怎么将分数化为小数
  10. 新构造运动名词解释_新构造运动与新构造