perclos

WierwiIIe驾驶模拟器上的实验结果证明,眼睛的闭合时间一定程度地反映疲劳, 如图 所示。



在此基础上, 卡内基梅隆研究所经过反复实验和论证,提出了度量疲劳/瞌睡的物理量 PERCLOS (Percentage of EyeIid CIosure over the PupiI, over Time, 简称PERCLOS) 其定义为单位时间内 (一般取1 分钟或者 30 秒) 眼睛闭合一定比例 (70%或80%) 所占的时间, 满足下式时就认为发生
了瞌睡:


PERCLOS的测量的参数是指在单位时间内眼睛闭合程度超过某一闭值(70%、80%)的时间占总时间的
百分比。PERCLOS方法的常用标准如下:


P7O:指眼睑遮住瞳孔的面积超过70%就计为眼睛闭合,统计在一定时间内眼睛闭合时所占的时间比例。
P80:指眼睑遮住瞳孔的面积超过80%就计为眼睛闭合,统计在一定时间内眼睛闭合时所占的时间比例。
EM:指眼睑遮住瞳孔的面积超过一半就计为眼睛闭合,统计在一定时间内眼睛闭合时所占的时间比例。


so, 可以表示如下:

 


美国联邦公路管理局 (FHWA) 和美国国家公路交通安全管理局 (NHTSA) 在实验室中模拟驾驶, 完成了九种疲劳检测指标的比较。结果证明, 这些方法都能在不同程度上预测驾驶疲劳, 而 PERCLOS 与驾驶疲劳的相关性最好 。由PERCLOS 的定义可知, 如何从视频序列中准确无误地提取到眼睛睁开的程度最为重要。
NHTSA 的 PERCLOS 检测计算睁闭眼是建立在一种特殊的摄像头找眼睛的基础上, 设备比较复杂。



### 使用 Dlib 实现 Perclos 方法进行眼部状态检测 #### 人脸检测与特征点定位 为了实现 Perclos 算法,首先需要加载预训练的人脸检测模型并读取图像或视频流。接着对获取到的数据执行灰度转换以便简化后续处理流程[^3]。 ```python import cv2 import dlib detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat') def detect_faces(gray_frame): faces = detector(gray_frame, 0) return [(face.left(), face.top(), face.right(), face.bottom()) for face in faces] cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) detected_faces = detect_faces(gray) ``` #### 提取眼部区域 一旦获得了面部位置信息之后就可以进一步精确定位眼睛所在的具体坐标范围,并裁剪出相应子图用于下一步骤中的分析工作[^1]。 ```python from imutils import face_utils import numpy as np (lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"] (rStart, rEnd) = face_utils.FACIAL_LANDMARks_IDXS["right_eye"] for rect in detected_faces: shape = predictor(gray, dlib.rectangle(*rect)) shape = face_utils.shape_to_np(shape) leftEye = shape[lStart:lEnd] rightEye = shape[rStart:rEnd] leftEyeHull = cv2.convexHull(leftEye) rightEyeHull = cv2.convexHull(rightEye) eye_img_left = gray[min(leftEye[:,1]):max(leftEye[:,1]), min(leftEye[:,0]):max(leftEye[:,0])] eye_img_right = gray[min(rightEye[:,1]):max(rightEye[:,1]), min(rightEye[:,0]):max(rightEye[:,0])] ``` #### 计算眼睑闭合程度 通过对比瞳孔可见部分的比例来评估眼睛开合情况,进而得出 PERCLOS 值作为衡量司机是否感到疲倦的重要指标之一[^2]。 ```python def calculate_perclos(eye_image): _, thresh = cv2.threshold(eye_image, 70, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2:] area = sum([cv2.contourArea(cnt) for cnt in contours]) perclos_value = area / (eye_image.size * 255.) return perclos_value left_eye_ratio = calculate_perclos(eye_img_left) right_eye_ratio = calculate_perclos(eye_img_right) average_eye_closure = (left_eye_ratio + right_eye_ratio)/2. print(f'Average Eye Closure Ratio: {average_eye_closure}') if average_eye_closure >= THRESHOLD_VALUE: print("Driver may be feeling sleepy.") else: print("Driver appears alert.") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值