Android [Camera 源码] 3A 模式和状态转换(3A Modes and State) Google官方文档(五)

Google源码网地址链接:https://source.android.com/devices/camera

该Google Camera的文档为系列文章,文章列表:

overview

Camera3

HAL Subsystem

Metadata and Controls

3A Modes and State

Output and Cropping

Errors and Streams

Request Creation

External USB Cameras

Multi-Camera Support

Motion Tracking

Session Parameters

Single Producer,Multiple Consumer

Version Support

 

3A 模式和状态转换


虽然实际的 3A 算法取决于 HAL 实现,但高级状态机的说明由 HAL 接口定义,以支持 HAL 设备和框架就 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 值的触发条目的请求,都会被视为独立的触发事件。

在顶层,3A 由 ANDROID_CONTROL_MODE 设置控制。该设置选项包括关闭 3A (ANDROID_CONTROL_MODE_OFF)、正常自动 (AUTO) 模式 (ANDROID_CONTROL_MODE_AUTO),以及使用取景模式设置 (ANDROID_CONTROL_USE_SCENE_MODE):

  • 在 OFF 模式下,单个的自动对焦 (AF)、自动曝光 (AE) 和自动白平衡 (AWB) 模式都会有效地关闭,且任何拍摄控件都不会被 3A 例程覆盖。
  • 在 AUTO 模式下,AF、AE 和 AWB 模式都会运行各自的独立算法,且具有自己的模式、状态和触发元数据条目,具体如下一节所示。
  • 在 USE_SCENE_MODE 下,必须使用 ANDROID_CONTROL_SCENE_MODE 条目的值来确定 3A 例程的行为。在除 FACE_PRIORITY 以外的 SCENE_MODE 下,HAL 必须将 ANDROID_CONTROL_AE/AWB/AF_MODE 的值替换为它倾向于让所选的 SCENE_MODE 使用的模式。例如,HAL 可能倾向于在 SCENE_MODE_NIGHT 下使用 CONTINUOUS_FOCUS AF 模式。当必须忽略这些取景模式下的场景时,用户可随意选择 AE/AWB/AF_MODE。
  • 对于 SCENE_MODE_FACE_PRIORITY,AE/AWB/AFMODE 控件的工作方式与在 ANDROID_CONTROL_MODE_AUTO 模式下相同,但 3A 例程必须偏向测光,并对焦到场景中任何已检测到的人脸上。

自动对焦设置与结果条目


 

自动曝光设置与结果条目


自动白平衡设置和结果条目


一般状态机转换说明


在 AF、AE 和 AWB 模式之间进行切换一律会将算法状态重置为 INACTIVE 状态。同样,如果 CONTROL_MODE == USE_SCENE_MODE,在 CONTROL_MODE 和 CONTROL_SCENE_MODE 之间进行切换也会将所有算法状态重置为 INACTIVE 状态。

下表列出了各模式的情况。

AF 状态机


AE 和 AWB 状态机


AE 和 AWB 状态机大致上相同,但 AE 具有额外的 FLASH_REQUIRED 和 PRECAPTURE 状态。因此,对于 AWB 状态机,应忽略下表中这两个状态对应的行。

 

启用手动控制


配置设备 3A 块以实现直接应用控制的过程还涉及到多个控件。

用于 3A 控制的 HAL 模式的运作方式为:对于每个请求,HAL 都会检查 3A 控制字段的状态。如果启用了任何 3A 例程,则该例程会覆盖与该例程相关的控制变量,然后这些覆盖值会在该拍摄的结果元数据中提供。例如,如果在请求中启用自动曝光,则 HAL 应覆盖请求的曝光、增益和帧时长字段(还可能包括闪光灯字段,具体取决于 AE 模式)。相关控件如下:

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将屏幕上的触摸坐标转换为适合于自动对焦的坐标,您需要进行以下步骤: 1. 获取相机设备的特征对象 您可以使用`CameraManager.getCameraCharacteristics()`方法获取相机设备的特征对象。这个特征对象包含了相机的各种设置和功能,如自动对焦模式、焦距范围等。 2. 获取自动对焦模式 通过特征对象可以获取相机支持的自动对焦模式。您可以使用`CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES`键来获取相机支持的自动对焦模式列表。 3. 设置自动对焦模式 在创建相机会话后,您可以使用`CaptureRequest.CONTROL_AF_MODE`键设置自动对焦模式。在设置自动对焦模式时,您可以参考相机设备的特征对象,选择相机支持的自动对焦模式。 4. 将屏幕坐标转换为相对于图像的坐标 要将屏幕坐标转换为相对于图像的坐标,您可以使用以下代码: ```java // 获取屏幕坐标 float x = touchEvent.getX(); float y = touchEvent.getY(); // 获取相机设备的特征对象 CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId); // 获取相机的传感器尺寸 Rect sensorRect = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); // 将屏幕坐标转换为相对于图像的坐标 float imageX = (x / viewWidth) * (float) sensorRect.width(); float imageY = (y / viewHeight) * (float) sensorRect.height(); ``` 在这段代码中,`touchEvent`是触摸事件对象,`viewWidth`和`viewHeight`是当前视图的宽度和高度。`sensorRect`是相机传感器的尺寸,可以使用`CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE`键获取。 5. 创建自动对焦请求 创建自动对焦请求时,您需要设置`CaptureRequest.CONTROL_AF_TRIGGER`键为`CameraMetadata.CONTROL_AF_TRIGGER_START`。这将启动自动对焦过程。在自动对焦完成后,相机会自动发送一个回调事件。 ```java // 创建自动对焦请求 CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO); builder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START); builder.set(CaptureRequest.CONTROL_AF_REGIONS, new MeteringRectangle[]{focusArea}); // 发送自动对焦请求 cameraCaptureSession.setRepeatingRequest(builder.build(), captureCallback, null); ``` 在这段代码中,`focusArea`是一个`MeteringRectangle`对象,表示自动对焦区域。您可以使用`CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE`键获取相机传感器的尺寸,并将其转换为适合于自动对焦的矩形区域。 6. 处理自动对焦回调事件 当自动对焦完成后,相机会自动发送一个回调事件。您可以在回调事件中获取自动对焦的结果,并根据需要更新自动对焦区域。 ```java private CameraCaptureSession.CaptureCallback captureCallback = new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) { super.onCaptureCompleted(session, request, result); // 获取自动对焦的结果 Integer afState = result.get(CaptureResult.CONTROL_AF_STATE); if (afState == null) { return; } // 更新自动对焦区域 if (afState == CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED || afState == CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED) { // 自动对焦成功 } else if (afState == CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN) { // 自动对焦正在进行 } } }; ``` 在这段代码中,`afState`是自动对焦的状态。如果`afState`等于`CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED`或`CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED`,则表示自动对焦已完成。如果`afState`等于`CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN`,则表示自动对焦正在进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值