openCV人脸疲劳检测
时间: 2024-12-26 21:16:29 浏览: 5
### 如何使用 OpenCV 实现人脸疲劳检测
#### 1. 初始化环境与加载资源
为了实现人脸疲劳检测功能,首先需要安装必要的 Python 库,如 `cv2` 和 `dlib`。这些库提供了图像处理以及面部特征点检测的能力。
```bash
pip install opencv-python-headless dlib numpy imutils
```
接着下载预先训练好的形状预测器文件(通常为 `.dat` 文件),用于精确地标记面部的关键位置。
#### 2. 获取并预处理视频流中的每一帧
利用摄像头或其他方式捕获实时视频流,并逐帧读取:
```python
import cv2
from scipy.spatial import distance as dist
from imutils import face_utils
import dlib
import numpy as np
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
# 调整每帧图片大小至固定宽度以便标准化处理
frame = imutils.resize(frame, width=1200)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 将彩色图转成灰度图以简化运算[^3]
detector = dlib.get_frontal_face_detector() # 创建一个人脸探测器对象
predictor_path = "shape_predictor_68_face_landmarks.dat"
predictor = dlib.shape_predictor(predictor_path) # 加载面部标志点预测模型
faces = detector(gray, 0) # 检测当前帧内所有人脸的位置信息
```
#### 3. 提取眼部区域并计算 EAR 值
对于每一个被识别出来的人脸,在其基础上进一步定位眼睛的具体范围,并据此计算双眼各自的耳部比例(EAR),即 Eye Aspect Ratio:
```python
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 = (A + B) / (2.0 * C)
return ear
for rect in faces:
shape = predictor(gray, rect)
shape = face_utils.shape_to_np(shape) # 把DLib获取的结果转化为NumPy数组形式
leftEye = shape[lStart:lEnd]
rightEye = shape[rStart:rEnd]
leftEAR = eye_aspect_ratio(leftEye)
rightEAR = eye_aspect_ratio(rightEye)
ear = (leftEAR + rightEAR) / 2.0 # 计算两个眼睛的平均EAR值作为最终指标[^4]
```
这里假设已经定义好了变量 `lStart`, `lEnd`, `rStart`, `rEnd` 来指示左右眼对应的 facial landmark index。
#### 4. 判断是否存在疲劳状况
设定阈值来决定何时认为驾驶员处于疲倦状态。当连续多帧内的 EAR 数值低于此临界点时,则触发警报机制。
```python
EYE_AR_THRESH = 0.3 # 设定EAR阈值
EYE_AR_CONSEC_FRAMES = 48 # 定义多少帧持续低EAR才视为一次打瞌睡事件
COUNTER = 0
TOTAL = 0
if ear < EYE_AR_THRESH:
COUNTER += 1
if COUNTER >= EYE_AR_CONSEC_FRAMES:
TOTAL += 1
else:
COUNTER = 0
cv2.putText(frame, f"Blinks:{TOTAL}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
cv2.putText(frame, f"EAR: {ear:.2f}", (300, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)[^2]
```
最后展示结果并将窗口保持打开直到用户主动关闭程序为止。
```python
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
```
阅读全文