Camera2总结二:AE自动测光

1. 自动曝光概念

我们所看到的物体,其实是这个物体上反射出来的光并进入我们眼睛并在我们眼中成像,不是物体本身。同理,相机要拍出照片,也需要接收这个反射光。相比下人眼是可以通过瞳孔自动调节进光量的,而相机自身做不到,所以需要依赖我们去控制相机进光量。如果光进入多了,照片会过曝,反之光进入少了,照片会欠曝,这个时候,我们就需要先测光了,通过测量光线的明暗,使相机实现正确曝光。

AE(Auto Exposure)即自动曝光,自动曝光的是为了使感光器件获得合适的曝光量,曝光量是指光线强度乘以光线到达sensor所作用的时间,曝光量以E表示,单位勒克斯(Lux)。自动曝光对相机的采集画面至关重要,也是相机采集的重要流程之一。

曝光强度的控制要素可以简化理解为如下:

曝光强度 = 曝光时间 * 光圈大小 * ISO感光度

其中,ISO包含了sensor的增益(模拟增益和数字增益)和数字ISP数字增益,sensor增益主要是控制ADC采样增益,数字增益的调节容易引入量化噪声。

相机AE过程是可以看作一个伺服系统,主要调控对象一般是光圈、sensor积分时间、sensor增益、ISP数字增益这四个参数。下图简单示意了相机自动曝光过程,本质上就是一基于负反馈的闭环控制系统,如下图所示,

自动曝光流程:

  • 首先通过测光,统计当前画面亮度。常用测光方法有:平均测光、中央点测光、多点测光、局部测光、分区式测光、ROI等。
  • 根据统计到的亮度计算是否落在目标值范围,如果超出,触发AE算法根据差异采取光圈/快门/增益优先之一的策略,对上面提到三要素按照查表的步长对相机进行迭代控制。
  • 待调控后继续统计新的图像亮度,继续重复开始步骤,直到收敛到目标区间内。

sensor的曝光时间和增益通常是非连续的,依赖从sensor 寄存器中直接读取,因此,很可能调控输出的值与AE算法输出的目标参数并不相同。如下图,是彩图优曝光时间策略,按照步长进行调节收敛,

同时当计算出正确参数后,一般并不会让其立刻在下一帧图像就生效。这是因为如果增益变化较大,图像就会产生闪烁。通常人们更喜欢画面平滑过渡,因此每帧图像的增益变化不宜过大。需要通过平滑方法,使其缓慢地向新参数过渡。用数学公式描述就是:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> g ( n ) = ( 1 − s ) ∗ g ( n − 1 ) + s ∗ t a r g e t g(n)= (1-s) * g(n-1) +s * target </math>g(n)=(1−s)∗g(n−1)+s∗target

其中, <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( n ) g(n) </math>g(n)代表当前的亮度, <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( n − 1 ) g(n-1) </math>g(n−1)为上一次亮度,target为目标亮度,s为调节率。

2. Camera2自动曝光

2.1 Camera2支持的测光模式: CONTROL_AE_AVAILABLE_MODES
CONTROL_AE_AVAILABLE_MODES 说明
CONTROL_AE_MODE_OFF 手动曝光,通过CaptureRequest.SENSOR_EXPOSURE_TIME, CaptureRequest.SENSOR_SENSITIVITY, CaptureRequest.SENSOR_FRAME_DURATION控制曝光
CONTROL_AE_MODE_ON 自动曝光模式,手动参数会被覆盖
CONTROL_AE_MODE_ON_AUTO_FLASH 自动曝光模式,暗环境下会控制闪光灯打闪
CONTROL_AE_MODE_ON_ALWAYS_FLASH 自动曝光模式,闪光灯常开
CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE 自动曝光模式,消除红眼
CCONTROL_AE_MODE_ON_EXTERNAL_FLASHF 通知Camera外部闪光灯已经打开
2.2 Camera2测光模式下AE算法当前帧的状态: CaptureResult.CONTROL_AE_STATE
CONTROL_AE_STATE 说明
CONTROL_AE_STATE_INACTIVE AE算法未激活状态,每次切换AE模式/CONTROL_MODE/CONTROL_SCENE_MODE时,AE状态都会重置到CONTROL_AE_STATE_INACTIVE,CaptureResult中不一定能看到这种状态
CONTROL_AE_STATE_SEARCHING AE算法正在调整曝光参数收敛过程中,CaptureResult中不一定能看到这种状态
CONTROL_AE_STATE_CONVERGED AE算法收敛完成
CONTROL_AE_STATE_LOCKED 当前的AE参数被锁住了,由CONTROL_AE_LOCK来控制的
CONTROL_AE_STATE_FLASH_REQUIRED AE算法已收敛,拍照时最好打开闪光灯以获得更好的图像亮度
CONTROL_AE_STATE_PRECAPTURE AE算法进入precapture状态,可以将CONTROL_AE_PRECAPTURE_TRIGGER设置为START来触发
2.3 Camera2测光模式下CaptureRequest

(1) Camera2采集前测光: CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER CONTROL_AE_PRECAPTURE_TRIGGER用于拍照前触发一次测光行为。

CONTROL_AE_STATE 说明
CONTROL_AE_PRECAPTURE_TRIGGER_IDLE 没有触发AE preCapture
CONTROL_AE_PRECAPTURE_TRIGGER_START 触发AE preCapture测光操作
CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL 取消AE preCapture测光,回到AE初始状态

(2) Camera2曝光补偿: CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION

CONTROL_AE_EXPOSURE_COMPENSATION用于调节AE算法的目标亮度。

  1. 补偿值依赖CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE以及CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP,其中Range为空时表示不支持。
  2. 曝光值(Ev)范围 = <math xmlns="http://www.w3.org/1998/Math/MathML"> R a n g e ∗ S t e p Range * Step </math>Range∗Step。
  3. 只有在android.control.aeMode != OFF时才生效。
  4. 修改曝光补偿后,AE算法可能需要重新收敛,多帧后才能完成曝光补偿动作

(3) Camera2曝光锁定: CaptureRequest.CONTROL_AE_LOCK

CONTROL_AE_LOCK用于标识是否将AE参数锁定在参数上。

  1. 需要读取(CameraCharacteristics#CONTROL_AE_LOCK_AVAILABLE)判断是否支持。
  2. 该动作不能锁住曝光补偿(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION)。
  3. 该动作不能锁住Flash。

(4) Camera2曝光锁定: CaptureRequest.CONTROL_AE_REGIONS

CONTROL_AE_REGIONS用于标识自动曝光一串区域列表。

1.android.control.maxRegionsAe为0代表不支持。 2. 测光区域有权重参数,权重必须在[0,1000]以内,而且代表的是这个区域中每个像素的权重。 更大权重的mertring area比较小的区域有更多影响。

(5) Camera2曝光锁定: CaptureRequest.SENSOR_SENSITIVITY

SENSOR_SENSITIVITY用于标识ISO/灵敏度。

  1. 通过 CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE 进行范围查询。 只有在 CaptureRequest.CONTROL_AE_MODE orCaptureRequest.CONTROL_MODE为OFF时才有效。

(6) Camera2曝光锁定: CaptureRequest.SENSOR_EXPOSURE_TIME

SENSOR_EXPOSURE_TIME用于标识快门/曝光时间。

  1. 只有在CaptureRequest#CONTROL_AE_MODE or CaptureRequest#CONTROL_MODE为OFF时才有效。 通过 CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE查询范围。 只有在 CaptureRequest.CONTROL_AE_MODE orCaptureRequest.CONTROL_MODE为OFF时才有效。

参考文献:

[1]3A+ISP之AE篇

[2]Understanding Auto Exposure Control

相关推荐
弥琉撒到我41 分钟前
微服务swagger解析部署使用全流程
java·微服务·架构·swagger
_.Switch7 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
韩楚风8 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
_.Switch13 小时前
Python机器学习:自然语言处理、计算机视觉与强化学习
python·机器学习·计算机视觉·自然语言处理·架构·tensorflow·scikit-learn
feng_xiaoshi18 小时前
【云原生】云原生架构的反模式
云原生·架构
架构师吕师傅19 小时前
性能优化实战(三):缓存为王-面向缓存的设计
后端·微服务·架构
团儿.21 小时前
解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署
数据库·mysql·架构·mysql之mha架构
艾伦~耶格尔1 天前
Spring Boot 三层架构开发模式入门
java·spring boot·后端·架构·三层架构
_.Switch1 天前
Python机器学习框架介绍和入门案例:Scikit-learn、TensorFlow与Keras、PyTorch
python·机器学习·架构·tensorflow·keras·scikit-learn
神一样的老师2 天前
构建5G-TSN测试平台:架构与挑战
5g·架构