1. 自动曝光
我们所看到的物体,其实是这个物体上反射出来的光并进入我们眼睛并在我们眼中成像。同理,相机要拍出照片,也需要接收这个反射光。相比下人眼是可以通过瞳孔自动调节进光量的,而相机需要依赖我们专门的模块去控制相机进光量,通过对拍摄画面环境光的测量,调整相机参数使得画面正确曝光,进而采集的图像亮度合适,避免过曝或过暗。
AE(Auto Exposure)即自动曝光,自动曝光的是为了使感光器件获得合适的曝光量,曝光量是指光线强度乘以光线到达sensor所作用的时间,曝光量以E表示,单位勒克斯(Lux)。
曝光强度的控制要素可以简化理解为如下:
曝光强度 = 曝光时间 * 光圈大小 * ISO感光度
其中,ISO包含了sensor的增益(模拟增益和数字增益)和数字ISP数字增益,数字增益的调节容易引入量化噪声。
相机AE过程是可以看作一个伺服系统,主要调控对象一般是光圈、sensor积分时间、sensor增益、ISP数字增益这四个参数。下图简单示意了相机自动曝光过程,本质上就是一基于负反馈的闭环控制系统,如下图所示,

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

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

同时当计算出正确参数后,一般并不会让其立刻在下一帧图像就生效。这是因为如果增益变化较大,图像就会产生闪烁。通常人们更喜欢画面平滑过渡,因此每帧图像的增益变化不宜过大。需要通过平滑方法,使其缓慢地向新参数过渡。用数学公式描述就是:
其中,代表当前的亮度,
为上一次亮度,target为目标亮度,s为调节率。
2. Camera2自动曝光
2.1 Camera2 AE测光CaptureRequest请求
(1) AE支持的模式
CONTROL_AE_MODE
用于设置自动测光模式。
CONTROL_AE_MODE | 说明 |
---|---|
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) Camera2采集前测光
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初始状态 |
(3) Camera2曝光补偿
CONTROL_AE_EXPOSURE_COMPENSATION
设置曝光补偿调节图像亮度。
- 补偿值依赖:
- CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE
- CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP
其中Range为空时表示不支持。
- 曝光值(Ev)范围:
。
- 只有在android.control.aeMode != OFF时才生效。
- 修改曝光补偿后,AE算法可能需要重新收敛,多帧后才能完成曝光补偿动作
(4) Camera2曝光锁定
CONTROL_AE_LOCK
用于标识是否将AE参数锁定在参数上。
- 需要读取CameraCharacteristics.CONTROL_AE_LOCK_AVAILABLE判断是否支持。
- 该动作不能锁住曝光补偿CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION。
- 该动作不能锁住Flash。
- AE Lock后,AE preCapture trigger START/CANCEL是没有效果的。
(5) Camera2自动测光区域
CONTROL_AE_REGIONS
用于标识自动曝光一串区域列表。
- android.control.maxRegionsAe为0代表不支持。
- 测光区域有权重参数,权重必须在[0,1000]以内,而且代表的是这个区域中每个像素的权重。
更大权重的mertring area比较小的区域有更多影响。 - android.scaler.cropRegion区域外的设置会无效。
- 当预览画面与cropRegion比例不一致时,AE regions需要按照裁剪后的区域重新计算。
- 从API 30开始activeArraySize坐标系代表zoom缩放后的区域,而不是缩放前原始的区域,意味着相同的AE regions在不同缩放比例下代表不同大小的区域。
(6) Camera2手动测光灵敏度
SENSOR_SENSITIVITY
用于标识ISO/灵敏度。
- 通过CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE 进行范围查询。
- 只有在CaptureRequest.CONTROL_AE_MODE 或者 CaptureRequest.CONTROL_MODE为OFF时才有效。
(7) Camera2手动测光时长
SENSOR_EXPOSURE_TIME
用于标识快门/曝光时间。
- 通过 CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE查询范围。
- 只有在CaptureRequest.CONTROL_AE_MODE 或者 CaptureRequest.CONTROL_MODE为OFF时才有效。
2.2 Camera2 AE状态
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来触发 |
参考文献:
[1]3A+ISP之AE篇
[2]Understanding Auto Exposure Control
喜欢本文的话,帮忙点个赞吧
网友评论