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算法的目标亮度。
- 补偿值依赖
CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE
以及CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP
,其中Range为空时表示不支持。 - 曝光值(Ev)范围 = <math xmlns="http://www.w3.org/1998/Math/MathML"> R a n g e ∗ S t e p Range * Step </math>Range∗Step。
- 只有在android.control.aeMode != OFF时才生效。
- 修改曝光补偿后,AE算法可能需要重新收敛,多帧后才能完成曝光补偿动作
(3) Camera2曝光锁定: CaptureRequest.CONTROL_AE_LOCK
CONTROL_AE_LOCK用于标识是否将AE参数锁定在参数上。
- 需要读取(
CameraCharacteristics#CONTROL_AE_LOCK_AVAILABLE
)判断是否支持。 - 该动作不能锁住曝光补偿(
CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION
)。 - 该动作不能锁住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/灵敏度。
- 通过
CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE
进行范围查询。 只有在CaptureRequest.CONTROL_AE_MODE
orCaptureRequest.CONTROL_MODE
为OFF时才有效。
(6) Camera2曝光锁定: CaptureRequest.SENSOR_EXPOSURE_TIME
SENSOR_EXPOSURE_TIME用于标识快门/曝光时间。
- 只有在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篇