【问题标题】:Android Camera2 API - Set AE-regions not workingAndroid Camera2 API - 设置 AE 区域不起作用
【发布时间】:2017-02-17 13:52:29
【问题描述】:

在我的 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);

2.) 创建 MeteringRectangle 列表

meteringFocusRectangleList = new MeteringRectangle[]{new MeteringRectangle(0,0,500,500,1000)};

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);
}

4.) 告诉相机启动曝光控制

camera2SupportHandler.mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_START);

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

【问题讨论】:

    标签: android android-camera android-camera2


    【解决方案1】:

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

    1. 坐标系 - 相机 1 API VS 相机 2 API

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

    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);
    
    1. “captureCallbackListener”提供 AE 控制的反馈(当然也用于 AF 控制)

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

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

    我会尽快向github 添加一个示例。

    【讨论】:

    • 你有没有找到任何方法让它在不使用三星 SDK 的情况下工作?
    • 很遗憾没有。
    • 谢谢。要使用三星 SDK,我想您需要重写所有内容(例如,如果您想同时支持 Camera 和 Camera2 API)?
    • 是的。我开发了一个标准的 CameraManger。使用 Camera API (Android),通过使用白名单,我可以在 Camera2 Android 和 Camera2 Samsung 之间切换。
    • 多么痛苦...感谢您抽出宝贵时间回答!三星是新的 IE -_-
    【解决方案2】:

    最近我遇到了同样的问题,终于找到了对我有帮助的解决方案。

    我需要做的就是从活动传感器矩形的边缘移动 1 个像素。在您的示例中,而不是这个矩形:

    meteringRectangleList = new MeteringRectangle[]{new MeteringRectangle(0,0,500,500,1000)};
    

    我会用这个:

    meteringRectangleList = new MeteringRectangle[]{new MeteringRectangle(1,1,500,500,1000)};
    

    它开始在三星和 Nexus 5 上发挥神奇作用! (请注意,如果您在那里使用最大值,您还应该从右/下边缘步进 1 个像素)

    看来很多厂商对documentation这部分的实现很差

    如果测光区域在捕获结果元数据中返回的使用的 android.scaler.cropRegion 之外,相机设备将忽略裁剪区域之外的部分,仅输出相交矩形作为结果元数据中的测光区域。如果该区域完全在裁剪区域之外,它将被忽略并且不会在结果元数据中报告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多