Android Camera2 API - 设置 AE 区域不起作用

Man*_*ger 4 android android-camera android-camera2

在我的 Android Camera2 API 项目中,我想为我的曝光计算设置一个区域。不幸的是它不起作用。另一方面,焦点区域工作没有任何问题。

设备:三星 S7 / Nexus 5

1.) CONTROL_AF_MODE & CONTROL_AE_MODE 的初始值

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
Run Code Online (Sandbox Code Playgroud)

2.) 创建 MeteringRectangle 列表

meteringFocusRectangleList = new MeteringRectangle[]{new MeteringRectangle(0,0,500,500,1000)};
Run Code Online (Sandbox Code Playgroud)

3.) 检查设备是否支持并设置 CONTROL_AE_REGIONS(与 CONTROL_AF_REGIONS 相同)

if (camera2SupportHandler.cameraCharacteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AE) > 0) {
      camera2SupportHandler.mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, meteringFocusRectangleList);
}
Run Code Online (Sandbox Code Playgroud)

4.) 告诉相机开始曝光控制

camera2SupportHandler.mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_START);
Run Code Online (Sandbox Code Playgroud)

CONTROL_AE_STATE 始终在 CONTROL_AE_STATE_SEARCHING 中,但不使用配置的区域...

Man*_*ger 6

经过长时间的测试和开发,我找到了答案。

  1. 坐标系 - Camera 1 API VS Camera 2 API

红色 = CAM1;绿色 = CAM2;如下图所示,蓝色矩形是 Cam1 可能的对焦/曝光区域的坐标。使用Cam2 API,首先要查询高度和宽度的最大值。请在此处找到更多信息。

在此处输入图片说明

  1. CONTROL_AF_MODE 和 CONTROL_AE_MODE 的初始值:参见上面的问题。

  2. 设置 CONTROL_AE_REGIONS:参见上面的问题。

  3. 设置 CONTROL_AE_PRECAPTURE_TRIGGER。

// 这是告诉相机开始AE控制的方法

                CaptureRequest captureRequest = camera2SupportHandler.mPreviewRequestBuilder.build();
              camera2SupportHandler.mCaptureSession.setRepeatingRequest(captureRequest, captureCallbackListener, camera2SupportHandler.mBackgroundHandler);
                camera2SupportHandler.mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
                camera2SupportHandler.mCaptureSession.capture(captureRequest, captureCallbackListener, camera2SupportHandler.mBackgroundHandler);
Run Code Online (Sandbox Code Playgroud)
  1. ''captureCallbackListener'' 提供 AE 控制的反馈(当然也用于 AF 控制)

所以这个配置适用于大多数安卓手机。不幸的是,它不适用于三星 S6/7。出于这个原因,我测试了他们的相机 SDK,可以在这里找到。

经过深入调查,我发现了配置字段“SCaptureRequest.METERING_MODE”。通过将其设置为“SCaptureRequest.METERING_MODE_MANUAL”的值,AE 区域也适用于三星手机。

我会尽快在github上添加一个例子。