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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
| class RobustEyeTracking: """ 鲁棒眼动追踪 多波长IR + 头部姿态融合 """ def __init__(self, use_multi_wavelength: bool = True, use_head_pose_fallback: bool = True): """ 初始化 Args: use_multi_wavelength: 使用多波长IR use_head_pose_fallback: 使用头部姿态回退 """ self.use_multi_wavelength = use_multi_wavelength self.use_head_pose_fallback = use_head_pose_fallback self.ir_wavelengths = [850, 940] if use_multi_wavelength else [940] self.glasses_detected = False self.glasses_type = None def detect_eyes(self, ir_image_940: np.ndarray, ir_image_850: np.ndarray = None) -> Dict: """ 检测眼睛 Args: ir_image_940: 940nm IR图像 ir_image_850: 850nm IR图像(可选) Returns: result: 检测结果 """ result = { 'eyes_detected': False, 'eye_positions': None, 'gaze_vector': None, 'method': None, 'confidence': 0.0 } self.glasses_detected = self._detect_glasses(ir_image_940) if self.glasses_detected: if self.use_multi_wavelength and ir_image_850 is not None: eyes = self._detect_with_850nm(ir_image_850) if eyes['detected']: result['eyes_detected'] = True result['eye_positions'] = eyes['positions'] result['method'] = '850nm_ir' result['confidence'] = 0.85 else: eyes = self._detect_with_940nm(ir_image_940) if eyes['detected']: result['eyes_detected'] = True result['eye_positions'] = eyes['positions'] result['gaze_vector'] = self._estimate_gaze(eyes['positions']) result['method'] = '940nm_ir' result['confidence'] = 0.95 if not result['eyes_detected'] and self.use_head_pose_fallback: gaze_estimate = self._estimate_gaze_from_head(ir_image_940) if gaze_estimate['valid']: result['gaze_vector'] = gaze_estimate['vector'] result['method'] = 'head_pose_fallback' result['confidence'] = 0.7 return result def _detect_glasses(self, ir_image: np.ndarray) -> bool: """检测是否佩戴墨镜""" mean_intensity = np.mean(ir_image) variance = np.var(ir_image) return variance < 100 and mean_intensity > 150 def _detect_with_940nm(self, image: np.ndarray) -> Dict: """使用940nm检测""" return { 'detected': True, 'positions': { 'left': (150, 100), 'right': (180, 100) } } def _detect_with_850nm(self, image: np.ndarray) -> Dict: """使用850nm检测""" return { 'detected': True, 'positions': { 'left': (152, 102), 'right': (182, 102) } } def _estimate_gaze(self, eye_positions: Dict) -> np.ndarray: """估计视线向量""" return np.array([0, 0, 1]) def _estimate_gaze_from_head(self, image: np.ndarray) -> Dict: """从头部姿态估计视线""" return { 'valid': True, 'vector': np.array([0, 0, 1]) }
class MultiWavelengthIRSystem: """ 多波长IR系统 硬件配置: - 850nm LED:穿透墨镜 - 940nm LED:正常场景 - 同步控制 """ def __init__(self): self.led_config = { '850nm': { 'power': 200, 'beam_angle': 30, 'penetration_glasses': 0.4 }, '940nm': { 'power': 150, 'beam_angle': 30, 'penetration_glasses': 0.1 } } self.sync_mode = 'alternating' def get_optimal_wavelength(self, glasses_detected: bool) -> int: """获取最优波长""" if glasses_detected: return 850 return 940
if __name__ == "__main__": tracker = RobustEyeTracking(use_multi_wavelength=True) ir_940 = np.random.randint(0, 255, (720, 1280), dtype=np.uint8) ir_850 = np.random.randint(0, 255, (720, 1280), dtype=np.uint8) result = tracker.detect_eyes(ir_940, ir_850) print("眼动追踪结果:") print(f" 眼睛检测: {result['eyes_detected']}") print(f" 使用方法: {result['method']}") print(f" 置信度: {result['confidence']:.2%}")
|