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篇](https://link.juejin.cn?target=https%3A%2F%2Fzhuanlan.zhihu.com%2Fp%2F36116026 "https://zhuanlan.zhihu.com/p/36116026") \[2\][Understanding Auto Exposure Control](https://link.juejin.cn?target=https%3A%2F%2Fzhuanlan.zhihu.com%2Fp%2F100369527 "https://zhuanlan.zhihu.com/p/100369527")

相关推荐
风铃喵游9 分钟前
构建引擎: 打造小程序编译器
前端·小程序·架构
筏.k1 小时前
C++ 网络编程(14) asio多线程模型IOThreadPool
网络·c++·架构
星辰大海的精灵2 小时前
如何确保全球数据管道中的跨时区数据完整性和一致性
java·后端·架构
鹏程十八少2 小时前
6.Android 设计模式 五个核心之三:观察者模式 在项目中的实战
架构
数据智能老司机2 小时前
Linux内核编程——Linux设备模型
linux·架构·操作系统
yyds4672 小时前
滑动窗口协议
前端·架构
DemonAvenger3 小时前
Go结构体内存布局优化与字段排序技巧
性能优化·架构·go
Codebee11 小时前
实战AI增强注解驱动:OneCode语义工程的智能升级
架构
ai小鬼头10 天前
AIStarter开发者熊哥分享|低成本部署AI项目的实战经验
后端·算法·架构
美狐美颜sdk10 天前
如何在直播SDK中实现高性能面具贴纸渲染?底层架构与优化方案详解
架构