当前位置:首页>文章 > 

项目实战 疲劳检测

项目实战 疲劳检测

项目实战 疲劳检测

本文核心词:教程,图像处理,人脸检测,python,opencv,关键点检测,疲劳检测

我们在上次已经讲过人脸的关键点定位,用到了Dlib的库,这次我们将其用于疲劳检测。

代码实现

1、导入工具包

view plaincopy to clipboardprint?

from scipy.spatial import distance as dist

import numpy as np

import dlib

import CV2

接下来老样子。

2、对脸上的部位进行定义

在关键点定位的官方文档中,提取68个关键点来表示脸上的部位。其中:

第1个点到第17个点:脸颊;

第18个点到第22个点:右边眉毛;

第23个点到第27个点:左边眉毛;

第28个点到第36个点:鼻子;

第37个点到第42个点:右眼;

第43个点到第48个点:左眼;

第49个点到第68个点:嘴巴。

如下图所示:

view plaincopy to clipboardprint?

FACIAL_LANDMARKS_68_IDXS = dict([

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

])

3、EAR(eye aspect ratio)计算函数

在论文:Real-Time Eye Blink Detection using Facial Landmarks中,EAR的概念被提出。

在包含着人眼的图片中画出六个点,如图所示:

当人眨眼时,这六个点的距离会发生变化,则可以用这六个点的一些距离关系来判断是否有眨眼行为。

定义EAR函数:

view plaincopy to clipboardprint?

def eye_aspect_ratio(eye):

# 计算距离,竖直的

A = dist.euclidean(eye[1], eye[5])

B = dist.euclidean(eye[2], eye[4])

# 计算距离,水平的

C = dist.euclidean(eye[0], eye[3])

# ear值

ear = (A + B) / (2.0 * C)

return ear

5、设置判断参数

如果EAR小于0.3,则判断为闭眼,如果视频中有连续三帧以上都有闭眼,则判断为眨眼行为

view plaincopy to clipboardprint?

# 设置判断参数

EYE_AR_THRESH = 0.3# ear小于0.3判断为闭眼

EYE_AR_CONSEC_FRAMES = 3# 连续三帧ear都小于0.3判断为眨眼

# 初始化计数器

COUNTER = 0

TOTAL = 0

6、加载dlib库中的人脸检测与关键点定位

view plaincopy to clipboardprint?

detector = dlib.get_frontal_face_detector()

predictor = dlib.shape_predictor(shape_predictor_68_face_landmarks.dat)

7、分别取两个眼睛区域

view plaincopy to clipboardprint?

(lStart, lEnd) = FACIAL_LANDMARKS_68_IDXS[left_eye]

(rStart, rEnd) = FACIAL_LANDMARKS_68_IDXS[right_eye]

8、读取视频

view plaincopy to clipboardprint?

vs = CV2.VideoCapture(test.mp4)

9、对每一帧图片进行操作,实现功能

·读取一帧图片并做预处理操作;

·检测人脸;

·获取人脸上的关键点坐标;

·绘制眼睛区域;

·计算左右两眼的EAR值,取平均值得到总的EAR值;

·检查EAR值是否满足阈值,如果满足,眨眼次数加一;

·将总的眨眼次数写在视频中。

view plaincopy to clipboardprint?

# 遍历每一帧

while True:

# 预处理

frame = vs.read()[1]

if frame is None:

break

(h, w) = frame.shape[:2]

width=1200

r = width / float(w)

dim = (width, int(h * r))

frame = CV2.resize(frame, dim, interpolation=CV2.INTER_AREA)

gray = CV2.cvtColor(frame, CV2.COLOR_BGR2GRAY)

# 检测人脸

rects = detector(gray, 0)

# 遍历每一个检测到的人脸

for rect in rects:

# 获取坐标

shape = predictor(gray, rect)

shape = shape_to_np(shape)

# 分别计算ear值

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)

# 检查是否满足阈值

if earEYE_AR_THRESH:

COUNTER += 1

else:

# 如果连续几帧都是闭眼的,总数算一次

if COUNTER = EYE_AR_CONSEC_FRAMES:

TOTAL += 1

# 重置

COUNTER = 0

# 显示

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)

key = CV2.waitKey(10)0xFF

if key == 27:

break

vs.release()

CV2.destroyAllWindows()

我们可以看最终效果。

OpenVINO技术交流群QQ223824636

申请时备注:B站

好啦,以上就是项目实战 疲劳检测全部内容,都看到这里了还不收藏一下??搜索(教程,图像处理,人脸检测,python,opencv,关键点检测,疲劳检测)还能找到更多精彩内容。