1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| class EyeTracker: def __init__(self, model_path): self.model = self._load_model(model_path) self.history = [] self.history_size = 30 def track(self, face_landmarks, frame): """ 眼动追踪 输入:face_landmarks [68, 2] 输出:{ 'eye_closure': float, 'gaze_direction': [2], 'blink_detected': bool } 延迟:<10ms """ left_eye_roi = self._get_eye_roi(frame, face_landmarks, 'left') right_eye_roi = self._get_eye_roi(frame, face_landmarks, 'right') ear = self._calculate_ear(left_eye_roi, right_eye_roi) gaze = self._estimate_gaze(left_eye_roi, right_eye_roi) blink = self._detect_blink(ear) self.history.append({ 'ear': ear, 'gaze': gaze, 'blink': blink }) if len(self.history) > self.history_size: self.history.pop(0) return { 'eye_closure': ear, 'gaze_direction': gaze, 'blink_detected': blink }
|