本讲是android camera专题系列的第32讲,我们介绍android camera2 api专题的ae自动曝光第2部分。
更多资源:
资源 | 描述 |
---|---|
在线课程 | |
知识星球 | 星球名称:深入浅出android camera 星球id: 17296815 |
极客笔记圈 |
曝光补偿(ev)
capturerequest#control_ae_exposure_compensation调节ae算法的目标亮度
- 是否支持:读取cameracharacteristics#control_ae_compensation_range,为空或者[0,0]表示不支持调整曝光补偿
-
ev的计算:0ev表示不做曝光补偿,1ev表示提升1倍图像亮度, -1ev表示消减一半图像亮度,在android中需要读取cameracharacteristics#control_ae_compensation_step来计算ev:
-
ev range为[min.exposure compensation * aecompensationstep, max.exposure compensation * aecompensationstep],要求
- full和limited设备ev range必须包含[-2, 2]
-
legacy设备没要求
-
只有在android.control.aemode != off时才生效
-
修改曝光补偿后,如果ae没有lock住,ae算法需要重新收敛,可能需要多帧才能完成曝光补偿动作
ae lock
capturerequest#control_ae_lock标识是否将ae参数锁定在参数上
- 是否支持:需要读取cameracharacteristics#control_ae_lock_available,支持manual_sensor和burst_capture的设备必须要支持ae lock
-
该动作不能锁住flash,当ae模式为on_auto_flash / on_always_flash / on_auto_flash_redeye,ae lock后flash仍然可能打闪
- on_auto_flash / on_auto_flash_redeye:在暗环境下会打闪
- on_always_flash:总是会打闪,因为ae参数锁定了,所以可能会过曝
- 该动作不能锁住曝光补偿(capturerequest#control_ae_exposure_compensation),设置曝光补偿仍然生效
-
ae lock后,做ae precapture trigger start/cancel是没有效果的
-
在自动ae和手动ae间切换时,如果避免flicker现象,建议操作步骤如下
- 设置ae模式为on
- lock ae
- 从captureresult中等待ae lock成功
- 将曝光参数(曝光时间,sensitivity)从captureresult中获取出来,设置给手动ae的capturerequest
- 提交手动ae的capturerequest
- 然后随意更改手动曝光参数
ae状态转换
ae状态转换-off
ae状态转换-on
ae状态转换-on 两个相邻captureresults多个状态切换
ae测光区域
capturerequest#control_ae_regions设置ae的测光区域
- 判断是否支持:读取cameracharacteristics#control_max_regions_ae
- hardware level为full的设备必须支持(> 0)
- 设置的值为meteringrectangle(int x, int y, int width, int height, int meteringweight)
- 当支持设置多个测光区域是,每个测光区域的权重范围是[0, 1000],权重越大的区域对测光结果影响越大,权重为0表示忽略对应的测光区域
- 坐标系
- 不支持畸变矫正的设备(distortion_correction_mode)
- left, top = [0, 0], right bottom = [activearraysize.width – 1, activearraysize.height – 1]
- 支持畸变矫正的设备(distortion_correction_mode)
- off
- left, top = [0, 0], right bottom = [precorrectionactivearraysize.width – 1, precorrectionactivearraysize.height – 1]
- not-off
- left, top = [0, 0], right bottom = [activearraysize.width – 1, activearraysize.height – 1]
- 当android.sensor.pixelmode 设置为camerametadata.sensor_pixel_mode_maximum_resolution时,需要参考activearraysizemaximumresolution / precorrectionactivearraysizemaximumresolution
- 不支持畸变矫正的设备(distortion_correction_mode)
- 受crop region的限制
- raw转换为yuv后,设置的crop region才会生效,也就是crop region不是在raw域生效的
- 只有在crop region区域内的测光区域才能生效,crop region是由zoom决定的
- >= api level 30
- 如果通过zoomratio来进行zoom,相同的aeregions在不同的zoomratio下面代表不同的区域(可以理解为使用zoomratio时,hal会自动计算crop region和ae regions填到captureresult里面)
- 如果通过crop region来进行zoom,相同的aeregions在不同的crop regions下面还是代表相同的区域
- 举例
- aeregion的计算的坐标系为[0,0,2000,1500],放大2倍的情况下,想将左上角1/4的区域设置为测光区域
- 如果通过zoomratio设置为2来实现,需要将aeregion设置为[0,0,1000,750]
- 如果通过zoomratio设置为1,crop region设置为[500, 375, 1500, 1125]来实现,需要将aeregion设置为[500, 375,1000,750]
帧率控制
capturerequest#control_ae_target_fps_range设置帧率,ae算法计算曝光时间时会受到该值的影响,最大曝光时间不能超过最小帧率对应的曝光时间
- 只对ae自动模式有用,ae手动模式不受该值的影响
- 可以设置哪些range
- 从cameracharacteristics#control_ae_available_target_fps_ranges获取支持的列表
- 录像时选定恒定帧率,也即range的最小值等于最大值
- 该列表不包含高帧率的range,录制高帧率时也是通过设置capturerequest#control_ae_target_fps_range来控制帧率