第31讲 AE自动曝光 Part 1 - Android Camera2 API

本讲是Android Camera专题系列的第31讲,我们介绍Android Camera2 API专题的AE自动曝光第1部分,AE自动曝光包括如下内容,第一部分。

更多资源:

资源 描述
在线课程 极客笔记在线课程
知识星球 星球名称:深入浅出Android Camera
星球ID: 17296815
Wechat 极客笔记圈

AE是什么

AE(Auto Exposure)/AEC(Auto Exposure Control)自动曝光

AE 算法的主要工作原理

  • 实时获取输入图像的统计信息并与设定目标亮度进行比较,而动态调节 sensor 的曝光时间和增益以及镜头光圈大小以达到实际亮度与设定目标亮度接近

AE是什么

AE是什么

Android中3A总开关

CaptureRequest#CONTROL_MODE

读取CameraCharacteristics#CONTROL_AVAILABLE_MODES来判断支持哪些Control Mode

CONTROL_MODE取值 描述
CONTROL_MODE_OFF Manual 3A,3A参数完全由App决定;为了快速响应从OFF切到AUTO模式,有可能3A算法还在运行,只是结果不会使用(依赖HAL的实现)
CONTROL_MODE_AUTO 3A参数是由3A算法计算出来,触发3A算法运算可以是App,也可能是HAL自动触发
CONTROL_MODE_USE_SCENE_MODE 3A参数由Scene Mode(比如ACTION,NIGHT, BEACH等)决定,但有一个例外:当Scene Mode为FACE_PRIORITY时,3A参数还是由3A算法决定
CONTROL_MODE_USE_EXTENDED_SCENE_MODE 3A参数由Extended Scene Mode决定,比如BOKEH。 API 30新增该Mode
CONTROL_MODE_OFF_KEEP_STATE 跟OFF模式类似,区别在于3A参数被锁定在上一个模式的最新值上

AE模式

CaptureRequest#CONTROL_AE_MODE

只有当CaptureRequest#CONTROL_MODE为AUTO时设置的值才生效

当前平台支持哪些值:读取CameraCharacteristics#CONTROL_AE_AVAILABLE_MODES

行为

  • 当设置为OFF模式时:AE算法不生效,通过CaptureRequest#SENSOR_EXPOSURE_TIME, CaptureRequest#SENSOR_SENSITIVITY, CaptureRequest#SENSOR_FRAME_DURATION控制曝光

  • 当设置为OFF模式时(CONTROL_AE_MODE_ON*):手动曝光参数不生效,会被AE算法的结果覆盖

  • 当选择带有FLASH的模式时:表示FLASH由AE来控制,CaptureRequest#FLASH_MODE设置的参数不生效

CONTROL_AE_MODE取值 描述
CONTROL_AE_MODE_OFF 手动曝光模式。 Hardware Level为FULL的CameraDevice必须支持;Hardware Level为LEGACY的CameraDevice不支持;Hardware Level为LIMITED的CameraDevice同时支持MANUAL_SENSOR capability也必须支持
CONTROL_AE_MODE_ON 自动曝光模式,所有设备必须支持
CONTROL_AE_MODE_ON_AUTO_FLASH 与ON模式类似。在暗环境下会控制闪光灯打闪
CONTROL_AE_MODE_ON_ALWAYS_FLASH 与ON模式类似,在拍照时(STILL_CAPTURE)一定会让闪光灯打闪
CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE 与ON_AUTO_FLASH类似,会自动消除红眼
CONTROL_AE_MODE_ON_EXTERNAL_FLASH 告诉Camera设备外部闪光灯(不受Camera系统控制)已经打开,需要快速进行重新测光。外部闪光灯关闭后,需要切到其他ON模式

AE状态

CaptureResult#CONTROL_AE_STATE表示AE算法当前帧的状态。

CONTROL_AE_MODE取值 描述
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来触发,打闪测光或消除红眼时需要

拍照前AE测光

CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER标识是否触发拍照前的测光动作:

  • 在Flash为不OFF时,需要在拍照前需要触发测光动作,用来估计场景亮度和最终打闪需要的闪光灯功率

  • 在Hardware Level为LEGACY的设备上,Camera HAL自己完成测光动作,不需要App参与,其他Hardware Level的设备都需要App参与

  • App只能在单个CaptureRequest中设置该参数,设置完后需要等待测光完成才能进行下一步动作(比如拍照)

  • 测光完成后,Camera HAL内部为了给接下来的拍照,曝光可能会把AE锁住,因此如果App接下来不拍照,需要主动让AE恢复正常流程

    • < API 23 : 设置CONTROL_AE_LOCK为TRUE后,再设置CONTROL_AE_LOCK为FALSE

    • >= API 23 : 设置为CONTROL_AE_PRECAPTURE_TRIGGER为CANCEL

  • 支持同时对AE和AF进行preCapture trigger

CONTROL_AE_PRECAPTURE_TRIGGER取值 描述
CONTROL_AE_PRECAPTURE_TRIGGER_IDLE 没有触发AE preCapture
CONTROL_AE_PRECAPTURE_TRIGGER_START 触发AE preCapture测光操作
CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL 取消AE preCapture测光,回到AE初始状态。如果AE preCapture测光已经完成,该动作会将AE状态切到初始状态

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

Android Camera2 API