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])