当前位置:   article > 正文

大数据最新计算机视觉项目实战-驾驶员疲劳检测_计算机视觉疲劳检测,大数据开发面试题大全_疲劳检测 csdn

疲劳检测 csdn

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

(lStart, lEnd) = FACIAL_LANDMARKS_68_IDXS[“left_eye”]
(rStart, rEnd) = FACIAL_LANDMARKS_68_IDXS[“right_eye”]


然后我们通过关键点只取两个ROI区域,就是左眼区域和右眼区域。



  • 1
  • 2
  • 3
  • 4
  • 5

print(“[INFO] starting video stream thread…”)
vs = cv2.VideoCapture(args[“video”])


随后我们将视频读进来。



  • 1
  • 2
  • 3
  • 4
  • 5

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)


将视频的展示框放大一点,这里很关键就是如果视频的框框设置的太小的话,可能无法检测到人脸。然后我们就把宽设置成了1200,然后对长度也同比例就行resize操作。最后转换成灰度图。



  • 1
  • 2
  • 3
  • 4
  • 5

rects = detector(gray, 0)


这里面检测到人脸,将人脸框的四个坐标拿到手。注意就是必须要是对灰度图进行处理。



  • 1
  • 2
  • 3
  • 4
  • 5
for rect in rects:
	# 获取坐标
	shape = predictor(gray, rect)
	shape = shape_to_np(shape)
  • 1
  • 2
  • 3
  • 4

在这里进行人脸框遍历,然后检测68关键点。



  • 1
  • 2
  • 3
  • 4
  • 5

def shape_to_np(shape, dtype=“int”):
# 创建68*2
coords = np.zeros((shape.num_parts, 2), dtype=dtype)
# 遍历每一个关键点
# 得到坐标
for i in range(0, shape.num_parts):
coords[i] = (shape.part(i).x, shape.part(i).y)
return coords


这里就是提取关键点的坐标。



  • 1
  • 2
  • 3
  • 4
  • 5
	leftEye = shape[lStart:lEnd]
	rightEye = shape[rStart:rEnd]
	leftEAR = eye_aspect_ratio(leftEye)
	rightEAR = eye_aspect_ratio(rightEye)
  • 1
  • 2
  • 3
  • 4

然后我们把左眼和右眼分别求了一下EAR数值。这里的`eye_aspect_ratio`函数就是计算EAR数值的。



  • 1
  • 2
  • 3
  • 4
  • 5

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


其中`dist.euclidean`表示计算欧式距离,和公式中计算EAR数值一摸一样。



  • 1
  • 2
  • 3
  • 4
  • 5
	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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

然后对于左眼和右眼都进行了EAR求解然后求了一个平均值,然后根据凸包的概念,对眼睛区域进行了绘图。将左眼区域和右眼区域绘图出来。



  • 1
  • 2
  • 3
  • 4
  • 5
	if ear < EYE_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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

vs.release()
cv2.destroyAllWindows()


最后进行了一次阈值判断,如果EAR连续三帧都小于0.3,那么我们就把TOTAL加一,这样记录一次闭眼的过程。然后最后将EAR数值和TOTAL的数值展示在视频当中。最后完成整体的训练。


### 
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/773926
推荐阅读
相关标签