python通过计算机视觉识别驾驶员眼部特征实现判断驾驶员是否疲劳,写出代码
时间: 2024-02-03 13:04:11 浏览: 71
基于Python的驾驶员面部特征的疲劳检测系统源码
以下是通过OpenCV和dlib库进行人脸和眼部关键点检测,以及判断驾驶员是否疲劳的Python代码示例:
```python
import cv2
import dlib
# 加载人脸检测器和眼部检测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# 定义常量
EYE_AR_THRESH = 0.23 # 眼睛长宽比阈值
EYE_AR_CONSEC_FRAMES = 15 # 连续帧数
# 初始化变量
COUNTER = 0 # 当前连续帧数
TOTAL = 0 # 检测到的总帧数
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
# 读取视频流
ret, frame = cap.read()
# 灰度化
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 人脸检测
rects = detector(gray, 0)
# 遍历检测到的人脸
for rect in rects:
# 检测眼部
shape = predictor(gray, rect)
left_eye = shape.part(36:42)
right_eye = shape.part(42:48)
# 计算眼睛长宽比
left_eye_aspect_ratio = (left_eye[4].y - left_eye[1].y) / (left_eye[4].x - left_eye[0].x + 1e-6)
right_eye_aspect_ratio = (right_eye[4].y - right_eye[1].y) / (right_eye[4].x - right_eye[0].x + 1e-6)
# 计算平均眼睛长宽比
ear = (left_eye_aspect_ratio + right_eye_aspect_ratio) / 2.0
# 绘制眼部框和关键点
left_eye_hull = cv2.convexHull(left_eye)
right_eye_hull = cv2.convexHull(right_eye)
cv2.drawContours(frame, [left_eye_hull], -1, (0, 255, 0), 1)
cv2.drawContours(frame, [right_eye_hull], -1, (0, 255, 0), 1)
for i in range(36, 48):
cv2.circle(frame, (shape.part(i).x, shape.part(i).y), 2, (0, 0, 255), -1)
# 判断疲劳
if ear < EYE_AR_THRESH:
COUNTER += 1
if COUNTER >= EYE_AR_CONSEC_FRAMES:
cv2.putText(frame, "Fatigue Detected!", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
else:
COUNTER = 0
# 绘制眼睛长宽比
cv2.putText(frame, "EAR: {:.2f}".format(ear), (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
# 绘制检测到的总帧数
TOTAL += 1
cv2.putText(frame, "Total Frames: {}".format(TOTAL), (10, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
# 显示视频流
cv2.imshow("Frame", frame)
# 按q键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头
cap.release()
# 关闭窗口
cv2.destroyAllWindows()
```
在代码中,首先加载人脸检测器和眼部检测器。然后打开摄像头,不断读取视频流进行处理。对于每一帧,首先进行人脸检测,然后使用眼部检测器检测眼部,并计算眼睛长宽比。如果眼睛长宽比小于阈值,则认为驾驶员疲劳,连续帧数加1,否则连续帧数清零。如果连续帧数大于等于设定的连续帧数阈值,则认为驾驶员疲劳,显示提示信息。最后,将眼睛长宽比和检测到的总帧数绘制在视频流上,并显示出来。
阅读全文