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将眨眼次数进行显示

  1. import cv2
  2. import numpy as np
  3. import argparse
  4. import time
  5. import dlib
  6. from scipy.spatial import distance as dist
  7. from collections import OrderedDict
  8.  
  9. def shape_to_array(shape, dtype='int'):
  10. coords = np.zeros((shape.num_parts, 2), dtype=dtype)
  11. for i in range(shape.num_parts):
  12. coords[i] = (shape.part(i).x, shape.part(i).y)
  13.  
  14. return coords
  15.  
  16. def accu_angle_eye(eye):
  17. A = dist.euclidean(eye[1], eye[5])
  18. B = dist.euclidean(eye[2], eye[4])
  19. # 计算距离,水平的
  20. C = dist.euclidean(eye[0], eye[3])
  21. aspect_ratio = (A + B) / (2.0 *C)
  22.  
  23. return aspect_ratio
  24.  
  25. # 第一步:使用OrderedDict构造脸部特征序号的有序字典
  26. FACE_LANDMAKE_64_IDEX = OrderedDict([
  27. ("mouth", (48, 68)),
  28. ("right_eyebrow", (17, 22)),
  29. ("left_eyebrow", (22, 27)),
  30. ("right_eye", (36, 42)),
  31. ("left_eye", (42, 48)),
  32. ("nose", (27, 36)),
  33. ("jaw", (0, 17))
  34. ])
  35. # EAR的阈值
  36. BlINK_THRESH = 0.3
  37. # 眨眼帧数的阈值
  38. BLINK_TRUE = 3
  39. # 低于阈值的次数
  40. count_blink = 0
  41. # 眨眼次数
  42. Total = 0
  43. # 第二步:使用argparse构造变量参数
  44. ap = argparse.ArgumentParser()
  45. ap.add_argument('-p', '--shape-predictor', default='shape_predictor_68_face_landmarks.dat',
  46. help='the weight to predictor')
  47. ap.add_argument('-v', '--video', default='test.mp4',
  48. help='the video to read')
  49. args = vars(ap.parse_args())
  50.  
  51. # 第三步:使用dlib.get_frontal_face_detector() 获得脸部位置检测器
  52. detector = dlib.get_frontal_face_detector()
  53. # 第四步:使用dlib.shape_predictor获得脸部特征检测器
  54. predictor = dlib.shape_predictor(args['shape_predictor'])
  55.  
  56. vs = cv2.VideoCapture(args['video'])
  57. time.sleep(1)
  58.  
  59. (lstart, lend) = FACE_LANDMAKE_64_IDEX['left_eye']
  60. (rstart, rend) = FACE_LANDMAKE_64_IDEX['right_eye']
  61.  
  62. while True:
  63. # 第五步:进行循环,读取图片,并对图片做维度扩大,并进灰度化
  64. frame = vs.read()[1]
  65. (h, w) = frame.shape[:2]
  66. width = 1200
  67. r = width / float(w)
  68. dim = (width, int(r*h))
  69. frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)
  70. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  71. # 第六步:使用detector(gray, 0)获得脸部位置信息
  72. rects = detector(gray, 0)
  73. # 第七步:循环脸部位置信息,使用predictor(gray, rect)获得脸部特征位置的信息
  74. for rect in rects:
  75. shape = predictor(gray, rect)
  76. # 第八步:将脸部特征信息转换为数组array的格式
  77. shape = shape_to_array(shape)
  78. # 第九步:根据字典,获得左眼和右眼的位置信息
  79. leftEye = shape[lstart:lend]
  80. rightEye = shape[rstart:rend]
  81.  
  82. # 第十步:使用cv2.convexHull获得凸包位置,使用drawContours画出轮廓位置进行画图操作
  83. leftContours = cv2.convexHull(leftEye)
  84. rightContours = cv2.convexHull(rightEye)
  85. cv2.drawContours(frame, [leftContours], -1, (0, 255, 0), 1)
  86. cv2.drawContours(frame, [rightContours], -1, (0, 255, 0), 1)
  87. # 第十一步:计算左右眼的EAR值,获得其平均值
  88. leftScore = accu_angle_eye(leftEye)
  89. rightScore = accu_angle_eye(rightEye)
  90. meanScore = (leftScore + rightScore) / 2.0
  91. #第十二步:循环,满足条件,眨眼次数+1
  92. if meanScore < BlINK_THRESH:
  93. count_blink += 1
  94. else:
  95. if count_blink >= BLINK_TRUE:
  96. Total += 1
  97.  
  98. count_blink = 0
  99. # 第十三步:进行画图,使用cv2.putText展示眨眼次数
  100. cv2.putText(frame, 'Blinks: {}'.format(Total), (10, 30),
  101. cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 1)
  102. cv2.putText(frame, 'EAR {:.2f}'.format(meanScore), (300, 30),
  103. cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 1)
  104. cv2.imshow('frame', frame)
  105. if cv2.waitKey(10) & 0xff == 27:
  106. break
  107.  
  108. vs.release()
  109. 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#]TopSelf

    新建一个批处理,用于启动 TopSelf 服务 @echo off Service.exe install net start Service 或者简化成 @echo off Service.exe ...

  2. Ubuntu 搭建 Zerotier One MOON 根目录服务器

    原文转摘:http://www.congan.wang/archives/947 博主倒腾了一天,总算搞定了,主要是受到各种搭建教程的错误引导,导致关键过程错误.官网的MOON搭建教程:https:/ ...

  3. [UE4]制作视野图标

    一.在PhotoShop中新建一个64px*64px,背景色为透明的文档 二.填充“图层1”为白色 三.添加蒙版图层,并将前景色设置为黑色 四.将“图层1”选择45°,并往上拖放至如图位置 五.选择渐 ...

  4. [UE4]Cast to OverlaySlot、Set Vertical Alignment、Get Slot,解决Child Widget垂直居中对齐问题

  5. SP8093 JZPGYZ - Sevenk Love Oimaster(SAM)

    /* 打模板题啊 每个串影响到的集合直接枚举跳parent处理即可 */ #include<cstdio> #include<algorithm> #include<cs ...

  6. PowerDesigner 概念数据模型(CDM) 说明

        ref: https://blog.csdn.net/tianlesoftware/article/details/6871179 关于PowerDesigner的说明参考: PowerDes ...

  7. 在mvc中动态加载菜单

    最近做了一个项目, 要在客户端动态的显示菜单,也就是这些菜单是保存在数据库中的, 在客户端动态加载菜单,这样做的好处很明显,就是菜单很容易修改,直接在后台进行维护,再也不会直接在前面的 视图页面中进行 ...

  8. [Unity算法]弧度和角度

    参考链接: https://zhidao.baidu.com/question/576596182.html 1.弧度和角度的转换 2.sin函数 3.cos函数 4.tan函数 5.特殊的三角函数值 ...

  9. ASP.NET WebApi 图片上传

    以下是代码的实现过程: Html页面表单布局: <form id="UpPicture" enctype="multipart/form-data" ac ...

  10. python ftp文件夹文件递归上传推送