android camera系统3A模式及其状态转换(一)

虽然HAL层负责实现3A算法,但HAL interface定义了一个高层次的状态机描述,允许HAL层设备和framework层交流3A当前状态和3A事件的触发情况。

当设备被打开时,所有3A状态都应该是STATE_INACTIVE。码流配置不需重置3A。例如,需要通过调用configure()来修改固定焦点。

要触发3A行为,需要为下一个请求简单地设置相关触发器实体,以引导触发器的启动。例如,启动自动聚焦的触发器需要在一个请求中将ANDROID_CONTROL_AF_TRIGGER设置为ANDROID_CONTROL_AF_TRIGGER_START。停止自动聚焦需要将ANDROID_CONTROL_AF_TRIGGER设置为ANDROID_CONTRL_AF_TRIGGER_CANCEL。否则,实体不存在或者被设置为ANDROID_CONTROL_AF_TRIGGER_IDLE。每个请求对触发器设置一个非IDLE的值,都会引发一个独立的触发器事件。

在顶层,通过设置ANDROID_CONTROL_MODE控制3A。可以选择没有3AANDROID_CONTROL_MODE_OFF),自动模式(ANDROID_CONTROL_MODE_AUTO)和场景模式(ANDROID_CONTROL_USE_SCENE_MODE)。

·        OFF模式下,自动聚焦(AF),自动曝光(AE)和自动白平衡(AEB)模式都被关闭。3A事例不会重置捕获控制中的任何设置。

·        AUTO模式下,AFAEAWB模式运行各自的独立算法,它们有自己的模式,状态和触发器元数据实体,如下段描述。

·        USE_SCENE_MODE模式下,ANDROID_CONTROL_SCENE_MODE的值决定3A事例的行为。在除了FACE_PRIORITYSCENE_MODE中,HAL层必须将ANDROID_CONTROL_AE/AWB/AF_MODE的值重置为更适合被选择的SCENE_MODE的模式。例如,HAL层喜欢在SCENE_MODE_NIGHT场景中使用AFCONTINUOUS_FOCUS模式。当这些场景模式被忽略时,将使用用户对AE/AWB/AF_MODE的选择。

·        SCENE_MODE_FACE_PRIORITY的场景,AE/AWB/AFMODE工作在ANDROID_CONTROL_MODE_AUTO模式下。但是3A算法需要侧重对场景中检测出来的脸进行测光和聚焦。

 

1.        Auto-focus settings and result entries

Main metadata entries:
ANDROID_CONTROL_AF_MODE
:控制当前自动聚焦模式的选择。通过framework层在请求中设置。
AF_MODE_OFF
AF关闭;framework/app直接控制镜头的位置。
AF_MODE_AUTO
Single-sweep自动聚焦。只有AF被触发,镜头才会移动。

AF_MODE_MACROSingle-sweep微距自动聚焦。只有AF被触发,镜头才会移动。

AF_MODE_CONTINUOUS_VIDEO:平滑的持续聚焦,用于视频录制。触发则立即在当前位置锁住焦点。取消而继续持续聚焦。

AF_MODE_CONTINUOUS_PICTURE:快速持续聚焦,用于静态图片的ZSL捕获。一旦达到扫描目标,触发则立即锁住焦点。取消而继续持续聚焦。

AF_MODE_EDOF:高级的景深聚焦。没有自动聚焦的浏览,触发和取消没有意义。通过HAL层控制图像的聚集。

ANDROID_CONTROL_AF_STATE:描述当前AF算法状态的动态元数据,HAL层在结果的元数据中报告该信息。

AF_STATE_INACTIVE:不做聚焦,或者算法被重置。镜头不移动。这个状态总是用于MODE_OFF或者MODE_EDOF。当设备刚被打开时,必须处于这个状态。

AF_STATE_PASSIVE_SCAN:一个持续聚焦的算法正在做扫描。镜头正在移动中。

AF_STATE_PASSIVE_FOCUSED:一个持续聚焦的算法认为已经聚焦成功。镜头不在移动。HAL层会自动地离开这个状态。

AF_STATE_PASSIVE_UNFOCUSED:一个持续聚焦的算法认为聚焦失败。镜头不在移动。HAL层会自动地离开这个状态。

AF_STATE_ACTIVE_SCAN:用户触发的扫描正在进行中。

AF_STATE_FOCUSED_LOCKEDAF算法认为聚焦结束。镜头不再移动。

AF_STATE_NOT_FOCUSED_LOCKEDAF算法没能完成聚焦。镜头不再移动。

ANDROID_CONTROL_AFTRIGGER:控制启动自动聚集扫描,其意义由所选择的模式和状态决定。Framework层在请求中设置该值。

AF_TRIGGER_IDLE:没有触发器。

AF_TRIGGER_START:触发AF扫描。其作用取决于模式和状态。

AF_TRIGGER_CANCEL:停止当前的AF扫描,重置算法到默认状态。

其他元数据实体:

ANDROID_CONTROL_AF_REGIONS:控制视角区域的选择,用于检测好的聚焦点。用于所有可进行聚焦扫描的AF模式。Framework层在请求中设置该值。

 

2.        Auto-exposure settings and result entries

Main metadata entries:
ANDROID_CONTROL_AE_MODE
:控制当前自动曝光模式的选择。Framework层在请求中设置该值。

AE_MODE_OFF:关闭自动曝光;用户控制曝光,增益,帧周期和闪光灯。

AE_MODE_ON:标准的自动聚焦,闪光灯关闭。用户设置闪光灯启动或者手电筒模式。

AE_MODE_ON_AUTO_FLASH:标准自动曝光,开启闪光灯。HAL层精确控制捕获前和捕获静态图片时闪光。用户可控制闪光灯关闭。

AE_MODE_ON_ALWAYS_FLASH:标准自动曝光,拍照时闪光灯一直开启。HAL层精确控制捕获前闪光。用户可控制闪光灯关闭。

AE_MODE_ON_AUTO_FLASH_REDEYE:标准自动曝光。HAL层精确控制预闪和捕获静态图片时闪光。在前面捕获序列的最后一帧启动一次闪光灯,以减少后面图片中的红眼现象。用户可控制闪光灯关闭。

ANDROID_CONTROL_AE_STATE:描述当前AE算法状态的动态元数据,HAL层在结果的元数据中报告该信息。

AE_STATE_INACTIVE:模式切换后AE初始状态。当设备刚打开时,AE必须处于这个状态。

AE_STATE_SEARCHINGAE没有达到曝光目标,正在调整曝光参数。

AE_STATE_CONVERGEDAE已经找到当前场景的正确的曝光值,曝光参数不再改变。HAL层会自动离开这个状态,寻找更好的解决方案。

AE_STATE_LOCKED:使用AE_LOCK已经锁住了AE。曝光值不再改变。

AE_STATE_FLASH_REQUIREDHAL层已经曝光成功,但为了获取更亮的图片,需要开启闪光灯。用于ZSL模式。

AE_STATE_PRECAPTUREHAL在捕获序列中间进行控制。根据AE模式,这种模式采用启动闪光灯测光或者瞬间开启关闭闪光灯预防红眼。

ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER:在捕获一张高质量图像之前,控制启动一个测光序列。Framework层在请求中设置该值。

PRECAPTURE_TRIGGER_IDLE:没有触发器。

PRECAPTURE_TRIGGER_START:启动一个捕获序列。HAL层使用后续的请求为获取高分辨率图像决定理想的曝光/白平衡。

Additional metadata entries:
ANDROID_CONTROL_AE_LOCK
:控制锁住AE当前的值。

ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION:控制调整AE算法目标亮度点。

ANDROID_CONTROL_AE_TARGET_FPS_RANGE:控制选择AE算法的目标帧率区间。AE事例不能使用这个区间之外的帧率值。

ANDROID_CONTROL_AE_REGIONS:控制视角区域的选择,用于检测好的曝光值。用于所有除了OOFAE模式。

 

3.        Auto-whitebalance settings and resultentries

Main metadata entries:
ANDROID_CONTROL_AWB_MODE
:控制当前白平衡模式的选择。

AWB_MODE_OFF:关闭自动白平衡。用户控制颜色矩阵。

AWB_MODE_AUTO:使能自动白平衡;3A控制颜色转换,可能会使用比简单矩阵更复杂的转换。

AWB_MODE_INCANDESCENT:用于室内白zhi灯的白平衡设置,色温大概2700K

AWB_MODE_FLUORESCENT:用于荧光灯的白平衡设置,色温大概5000K

AWB_MODE_WARM_FLUORESCENT:用于荧光灯的白平衡设置,色温大概3000K

AWB_MODE_DAYLIGHT:用于晴天的白平衡设置,色温大概5500K

AWB_MODE_CLOUDY_DAYLIGHT:用于阴天的白平衡设置,色温大概6500K

AWB_MODE_TWILIGHT:用于日出/日落的白平衡设置,色温大概15000K

AWB_MODE_SHADE:用于阴影处的白平衡设置,色温大概7500K

ANDROID_CONTROL_AWB_STATE:描述当前AWB算法状态的动态元数据,HAL层在结果的元数据中报告该信息。

AWB_STATE_INACTIVE:切换模式后AWB的初始状态。当设备刚打开时,AWB必须处于这个状态。

AWB_STATE_SEARCHINGAWB没有收敛到目标值,在改变颜色调整参数。

AWB_STATE_CONVERGEDAWB为当前场景已经找到了理想的颜色调整值,这些参数不再改变。HAL层会自动离开该状态去寻找更好的解决方案。

AWB_STATE_LOCKED:使用AWB_LOCK锁住了AWB。颜色调整值不再改变。

Additional metadata entries:
ANDROID_CONTROL_AWB_LOCK
:控制锁住当前AWB的值。

ANDROID_CONTROL_AWB_REGIONS:控制视角区域的选择,用于检测好的颜色平衡值。只用于自动白平衡模式。

 

4.        General state machine transition notes

在切换AFAEAWB的不同模式是总会将算法的状态重置为INACTIVE。同样地,在CONTROL_MODECONTROL_SCENE_MODECONTROL_MODE == USE_SCENE_MODE)之间切换时,也需要将算法的状态重置为INACTIVE

 

(未完待续)

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Camera2 API中,自动对焦的坐标是从[-1000, 1000]的范围内进行定义的,其中(0, 0)表示图像的中心。 如果您需要将屏幕上的触摸坐标转换为适合于自动对焦的坐标,可以使用以下代码: ```java private MeteringRectangle[] getFocusAreaRect(float x, float y) { int areaSize = 200; int left = clamp((int) x - areaSize / 2, 0, mTextureView.getWidth() - areaSize); int top = clamp((int) y - areaSize / 2, 0, mTextureView.getHeight() - areaSize); RectF rectF = new RectF(left, top, left + areaSize, top + areaSize); return new MeteringRectangle[]{new MeteringRectangle(rectF, 1000)}; } private int clamp(int value, int min, int max) { return Math.max(min, Math.min(max, value)); } ``` 这个方法将返回一个MeteringRectangle数组,其中包含一个矩形区域,该区域是在屏幕上给定的x和y坐标周围的一个固定大小。在这个例子中,我们使用了一个200x200像素的矩形区域。您可以根据需要更改这个值。 接下来,您可以将这个MeteringRectangle数组传递给CameraCaptureSession的setRepeatingRequest方法,就可以开始自动对焦了。 ```java RectF rectF = new RectF(left, top, left + areaSize, top + areaSize); MeteringRectangle[] meteringRectangle = new MeteringRectangle[]{new MeteringRectangle(rectF, 1000)}; CameraCaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); builder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START); builder.set(CaptureRequest.CONTROL_AE_REGIONS, meteringRectangle); builder.set(CaptureRequest.CONTROL_AF_REGIONS, meteringRectangle); cameraCaptureSession.setRepeatingRequest(builder.build(), null, backgroundHandler); ``` 这个代码片段将启动自动对焦。请注意,我们使用了CONTROL_AF_TRIGGER_START触发器来开始自动对焦。在对焦完成后,您可以使用相同的代码将触发器设置为CONTROL_AF_TRIGGER_CANCEL,以停止自动对焦。 希望这可以帮助您解决您的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值