在别人的代码上修改得到的,源代码好像不太准确,主要的原理就是用dlib工具找到68个人脸关键点,然后计算点之间的欧氏距离,具体得看你想要实现什么功能
我主要检测眼睛上的点和嘴巴上的点,当眼睛上的某几个点之间的距离小于设置的阈值几帧后,判断为打盹,也就是疲劳驾驶,有时候人瞌睡的时候也会打哈欠,所以也检测了嘴巴的点,但没有做优化,嘴巴部分还可以更进一步优化的,不过太花时间了,就先不做了,思路知道就行,果然搞这个最后都变成了调参。
# -*- coding: utf-8 -*-
#导入工具包
from scipy.spatial import distance as dist
from collections import OrderedDict
import numpy as np
import argparse
import time
import dlib #人脸识别相关
import cv2
FACIAL_LANDMARKS_68_IDXS = 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))
])
# http://vision.fe.uni-lj.si/cvww2016/proceedings/papers/05.pdf
def eye_aspect_ratio(eye):
# 计算距离,竖直的
A = dist.euc