返回专辑
·Johan·3 分钟阅读

曝光:前端的隐变量

CAP_PROP_AUTO_EXPOSURE 开着时亮度是自由变量;ORB、LK、NCC 都假设光度稳定,锁曝光常是第一步修复。

曝光:前端的隐变量

1. 跟踪不稳时先看曝光曲线

室内 AGV 视觉里程计偶发断轨,ORB 匹配内点率从八成掉到四成,内参和外参都查过,IMU 时间同步也正常——最后拉曝光日志才发现,自动曝光在一帧内跳了约三成的亮度。汉明距离分布整段漂移,Lucas-Kanade 光流违反亮度恒定假设,归一化互相关模板匹配同样失锁。根因不是算法参数,而是 曝光作为隐变量未被约束:亮度成了自由变量,所有假设光度稳定的下游模块一起失效。

这和惯性单元零偏漂移类似——你看不到它,但它改写了观测。图像校正节点只做去畸变和极线校正,不锁自动曝光;相机信息发布也不替你做曝光管理。调试视觉链路时,曝光曲线应和 IMU 陀螺仪一样被常规记录。

2. 开题场景:为什么锁不住就全崩

特征描述子对局部梯度敏感。亮度跳变时,同一物理角点的描述子向量距离变大,比率测试通过率下降,回环候选被误拒。光度视觉里程计直接假设 ,曝光变化等价于在该等式里加了一个未知乘子。检测网络在训练时固定了伽马和曝光分布,部署端自动曝光开启会造成域偏移——置信度阈值形同虚设,表现为「同一模型换班次误检率不同」。

帧率属性与曝光互斥:长曝光降低最大帧率、增加运动模糊。标定与运行必须使用 同一组曝光参数;过曝饱和会让亚像素角点精化失效,直方图里饱和像素占比应低于百分之一作为健全性检查。

3. OpenCV 能控什么

通用串口相机可用视频捕获接口锁手动曝光;语义因驱动而异,必须回读确认是否真正生效:

python
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, 0.25)  # 手动/自动,驱动相关
cap.set(cv2.CAP_PROP_EXPOSURE, -6)
cap.set(cv2.CAP_PROP_GAIN, 0)
actual = cap.get(cv2.CAP_PROP_EXPOSURE)  # 回读验证

产线巴斯勒、海康等工业相机走 GenICam 节点:锁曝光时间、增益、关闭自动白平衡。OpenCV 只是薄封装,设置无效时换厂商 SDK 取图再包装成矩阵。视频采集层与 GenICam 的属性行为差异大,跨平台不能假设数值含义一致。

4. 时间戳、高动态与卷帘快门

帧时间戳取 曝光中点 更合理;自动曝光变化时有效延迟跟着变,与惯性单元融合时要在元数据标注。卷帘快门场景下曝光中点与读出起始差一行延迟,多传感器融合须区分快门类型。高动态范围多帧合成增加运动伪影——高动态场景优先全局快门加合理曝光策略,不是后处理能全部补救。单曝光饱和导致亮区特征全丢,暗区噪声放大。

5. 产线标准操作

开机等待自动曝光稳定再标定——冷启动前几秒曝光还在爬升。把曝光、增益、白平衡三件套写进启动配置,启动日志回读有效值。现场跟踪不稳:先拉曝光曲线与内点率的相关性,再动随机采样一致性阈值。标定图过曝会损角点检测;我会查直方图饱和比例。自动曝光还改有效伽马——产线策略是锁曝光,必要时在图像信号处理器里固定伽马。

6. 验收

  • 帧间平均亮度标准差与匹配内点率的相关性
  • 锁曝光前后轨迹长度对比
  • 直方图饱和像素占比低于百分之一
  • 标定与运行曝光一致,角点亚像素残差无异常尖峰
  • 启动摘要打印有效曝光/增益/白平衡,可审计

曝光三件套在可控环境尽量固定。自动曝光开着时,后端再精的算法也是在噪声上作画——先把传感器状态锁进契约,再谈算法调参。

← 全部文章

johan's blog