1.dist.eculidean(A, B) # 求出A和B点的欧式距离

参数说明:A,B表示位置信息

2.dlib.get_frontal_face_detector()表示脸部位置检测器

3.dlib.shape_predictor(args['shape_predictor]) 表示脸部特征位置检测器

参数说明:args['shape_predictor'] 表示位置信息

4.Orderdict([('mouth', (23, 30))])  # 构造有序的字典
参数说明:'mouth'表示字典的键,(23, 30) 表示字典的值

使用人脸检测可以获得人脸框的位置信息,再使用人脸框的关键点检测,检测出各个人脸部分的位置

眨眼检测:主要是通过检测脸部6个点,即 A = dist.euclidean(eye[2], eye[4]), 即眼部的2号点与4号点的欧式距离

B = dist.euclidean(eye[1], eye[5]) C = dist.euclidean(eye[0], eye[3])  # 即1号点与5号点的位置, 0号点与3号点的欧式距离

EAR = (A + B) / 2 * C, 分别计算左眼和右眼的评分求平均作为最终的评分,如果小于阈值,则加1,如果连续3次都小于阈值,则表示进行了一次眨眼活动

代码:

第一步:使用OrderedDict() 构建有序的脸部位置序号字典

第二步:使用argparse构造出可以传入的参数

第三步:使用dlib.get_frontal_face_detector()获得脸部位置检测器

第四步:使用dlib.shape_predictor构造脸部特征检测器

第五步:进入循环,读取图片,对图片维度进行扩大,方便进行脸部特征检测,同时进行灰度化,为了脸部特征检测做准备

第六步:使用detector(gray, 0) 进行脸部位置检测

第七步:循环脸部位置,使用predictor(gray, rect)获得脸部特征的位置信息

第八步:将脸部特征的位置信息转换为数组的形式

第九步:根据字典的序号,获得左眼和右眼的位置array

第十步:使用cv2.convexHull构造左右眼的凸包,并使用cv2.drawContours完成画图操作

第十一步:构造函数计算左右眼的EAR值,使用平均值作为最终的EAR

第十二步:循环,满足条件的,眨眼次数+1

第十三步:进行画图操作,同时使用cv2.putText将眨眼次数进行显示

import cv2
import numpy as np
import argparse
import time
import dlib
from scipy.spatial import distance as dist
from collections import OrderedDict def shape_to_array(shape, dtype='int'):
coords = np.zeros((shape.num_parts, 2), dtype=dtype)
for i in range(shape.num_parts):
coords[i] = (shape.part(i).x, shape.part(i).y) return coords def accu_angle_eye(eye):
A = dist.euclidean(eye[1], eye[5])
B = dist.euclidean(eye[2], eye[4])
# 计算距离,水平的
C = dist.euclidean(eye[0], eye[3])
aspect_ratio = (A + B) / (2.0 *C) return aspect_ratio # 第一步:使用OrderedDict构造脸部特征序号的有序字典
FACE_LANDMAKE_64_IDEX = OrderedDict([
("mouth", (48, 68)),
("right_eyebrow", (17, 22)),
("left_eyebrow", (22, 27)),
("right_eye", (36, 42)),
("left_eye", (42, 48)),
("nose", (27, 36)),
("jaw", (0, 17))
])
# EAR的阈值
BlINK_THRESH = 0.3
# 眨眼帧数的阈值
BLINK_TRUE = 3
# 低于阈值的次数
count_blink = 0
# 眨眼次数
Total = 0
# 第二步:使用argparse构造变量参数
ap = argparse.ArgumentParser()
ap.add_argument('-p', '--shape-predictor', default='shape_predictor_68_face_landmarks.dat',
help='the weight to predictor')
ap.add_argument('-v', '--video', default='test.mp4',
help='the video to read')
args = vars(ap.parse_args()) # 第三步:使用dlib.get_frontal_face_detector() 获得脸部位置检测器
detector = dlib.get_frontal_face_detector()
# 第四步:使用dlib.shape_predictor获得脸部特征检测器
predictor = dlib.shape_predictor(args['shape_predictor']) vs = cv2.VideoCapture(args['video'])
time.sleep(1) (lstart, lend) = FACE_LANDMAKE_64_IDEX['left_eye']
(rstart, rend) = FACE_LANDMAKE_64_IDEX['right_eye'] while True:
# 第五步:进行循环,读取图片,并对图片做维度扩大,并进灰度化
frame = vs.read()[1]
(h, w) = frame.shape[:2]
width = 1200
r = width / float(w)
dim = (width, int(r*h))
frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 第六步:使用detector(gray, 0)获得脸部位置信息
rects = detector(gray, 0)
# 第七步:循环脸部位置信息,使用predictor(gray, rect)获得脸部特征位置的信息
for rect in rects:
shape = predictor(gray, rect)
# 第八步:将脸部特征信息转换为数组array的格式
shape = shape_to_array(shape)
# 第九步:根据字典,获得左眼和右眼的位置信息
leftEye = shape[lstart:lend]
rightEye = shape[rstart:rend] # 第十步:使用cv2.convexHull获得凸包位置,使用drawContours画出轮廓位置进行画图操作
leftContours = cv2.convexHull(leftEye)
rightContours = cv2.convexHull(rightEye)
cv2.drawContours(frame, [leftContours], -1, (0, 255, 0), 1)
cv2.drawContours(frame, [rightContours], -1, (0, 255, 0), 1)
# 第十一步:计算左右眼的EAR值,获得其平均值
leftScore = accu_angle_eye(leftEye)
rightScore = accu_angle_eye(rightEye)
meanScore = (leftScore + rightScore) / 2.0
#第十二步:循环,满足条件,眨眼次数+1
if meanScore < BlINK_THRESH:
count_blink += 1
else:
if count_blink >= BLINK_TRUE:
Total += 1 count_blink = 0
# 第十三步:进行画图,使用cv2.putText展示眨眼次数
cv2.putText(frame, 'Blinks: {}'.format(Total), (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 1)
cv2.putText(frame, 'EAR {:.2f}'.format(meanScore), (300, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 1)
cv2.imshow('frame', frame)
if cv2.waitKey(10) & 0xff == 27:
break vs.release()
cv2.destroyAllWindows()

效果图

机器学习进阶-疲劳检测(眨眼检测) 1.dist.eculidean(计算两个点的欧式距离) 2.dlib.get_frontal_face_detector(脸部位置检测器) 3.dlib.shape_predictor(脸部特征位置检测器) 4.Orderdict(构造有序的字典)的更多相关文章

  1. 机器学习进阶-人脸关键点检测 1.dlib.get_frontal_face_detector(构建人脸框位置检测器) 2.dlib.shape_predictor(绘制人脸关键点检测器) 3.cv2.convexHull(获得凸包位置信息)

    1.dlib.get_frontal_face_detector()  # 获得人脸框位置的检测器, detector(gray, 1) gray表示灰度图, 2.dlib.shape_predict ...

  2. 基于mindwave脑电波进行疲劳检测算法的设计(2)

    上文讲到的是保证硬件的接通.接下来是用C语言在它提供的API接口进行连接. 在网盘中下载MindSet Development Tools这个开发包.这个目录下MindSet Development ...

  3. 基于mindwave脑电波进行疲劳检测算法的设计(1)

    一.简介 脑波,又称之为脑电波,是人大脑发出的电波,非常的微弱,只能通过设备来检测.人的脑波在不同状态下,会不同,因此可以通过脑波来量化分析人的精神状态. 科学家讲脑电波分为四种,以下为详细解释 (1 ...

  4. 基于mindwave脑电波进行疲劳检测算法的设计(5)

    时隔两个多月了,前段时间在弄Socket,就没有弄这个了.现在好了,花了几天的时间,终于又完成了一小部分了.这一小节主要讲α,β,δ,θ等等波段之间的关系.废话不多说,直接给出这几天的成果. 上一次, ...

  5. dlib库检测人脸使用方法与简单的疲劳检测应用

    简介: dlib库是一个很经典的用于图像处理的开源库,shape_predictor_68_face_landmarks.dat是一个用于人脸68个关键点检测的dat模型库,使用这个模型库可以很方便地 ...

  6. 机器学习&恶意代码检测简介

    Malware detection 目录 可执行文件简介 检测方法概述 资源及参考文献 可执行文件简介 ELF(Executable Linkable Format) linux下的可执行文件格式,按 ...

  7. 【机器学习】异常检测算法(I)

    在给定的数据集,我们假设数据是正常的 ,现在需要知道新给的数据Xtest中不属于该组数据的几率p(X). 异常检测主要用来识别欺骗,例如通过之前的数据来识别新一次的数据是否存在异常,比如根据一个用户以 ...

  8. 机器学习进阶-项目实战-信用卡数字识别 1.cv2.findContour(找出轮廓) 2.cv2.boudingRect(轮廓外接矩阵位置) 3.cv2.threshold(图片二值化操作) 4.cv2.MORPH_TOPHAT(礼帽运算突出线条) 5.cv2.MORPH_CLOSE(闭运算图片内部膨胀) 6. cv2.resize(改变图像大小) 7.cv2.putText(在图片上放上文本)

    7. cv2.putText(img, text, loc, text_font, font_scale, color, linestick) # 参数说明:img表示输入图片,text表示需要填写的 ...

  9. 机器学习进阶-svm支持向量机

    支持向量机需要解决的问题:找出一条最好的决策边界将两种类型的点进行分开 这个时候我们需要考虑一个问题,在找到一条直线将两种点分开时,是否具有其他的约束条件,这里我们在满足找到一条决策边界时,同时使得距 ...

随机推荐

  1. C#应用jstree实现无限级节点的方法

    下载jstree.js下载地址: http://jstree.com/ 当前下载版本: jsTree 3.3.1 第一步:下载完成后引用js+css <link href="~/plu ...

  2. ES6基础一

    声明方式 var和let的区别 1,var用来声明全局变量,let用来声明局部变量:               2,var可以提升变量,let声明的变量不在变量提升:        const声明常 ...

  3. spring4.0之九:websocket简单应用

    Spring 4.0的一个最大更新是增加了websocket的支持.websocket提供了一个在web应用中的高效.双向的通讯,需要考虑到客户端(浏览器)和服务器之间的高频和低延时消息交换.一般的应 ...

  4. 1122 Hamiltonian Cycle (25 分)

    1122 Hamiltonian Cycle (25 分) The "Hamilton cycle problem" is to find a simple cycle that ...

  5. LAN

    一. 局域网(LAN) 是一个覆盖地理范围相对较小的高速容错数据网络,它包括工作站.个人计算机.打印机和其它设备.LAN 为计算机用户提供了资源共享的设备访问,如打印.文件交换.电子邮件交换等等. 局 ...

  6. andriod InputType.TYPE_NUMBER_FLAG_DECIMAL只能输入数字和小数点无效问题

    在java文件里edittext设置InputType.TYPE_NUMBER_FLAG_DECIMAL, 输入法能输入的是文本输入方式(数字.字母.符号等),和想要只能输入数字和小数点背道而驰. 在 ...

  7. GDB 调试 ---转 比较全的东东

    转自 程序人生:http://www.programlife.net/gdb-manual.html Linux 包含了一个叫gdb 的GNU 调试程序.gdb 是一个用来调试C和C++程序的强力调试 ...

  8. 00004 - CentOS 7下安装pptp服务端

    主要配置步骤 1. 安装前检查系统支持 a. 在安装之前查看系统是否支持PPTP modprobe ppp-compress-18 && echo success 应该输出:succe ...

  9. 00009 - cat、tail、head、tee、wc、sort文件操作和过滤

    绝大多数命令行工作是针对文件的.我们会在本节中讨论如何观察及过滤文件内容,使用一条命令从文件中提取所需信息,以及对文件的内容进行排序. cat.tail.head.tee:文件打印命令这些命令的语法基 ...

  10. echart-map

    1.非模块下引入地图: echarts.util.mapData.params.params.HK={ getGeoJson:function(callback){ $.getJSON('geoJso ...