2017-02-17 129 views
1

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

设备:三星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,但不使用配置的地区...

回答

1

后发展我找到了答案。

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

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

enter image description here

  • 为CONTROL_AF_MODE & CONTROL_AE_MODE初始值:参见上面的问题。

  • 设置CONTROL_AE_REGIONS:请参阅上面的问题。

  • 设置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); 
    
  • 的 '' captureCallbackListener '' 给出AE控制的反馈(的当然也适用于自动对焦控制)
  • 所以这个配置适用于大多数Android手机。不幸的是,它不适用于三星S6/7。基于这个原因,我测试了他们的Camera SDK,可以找到它here

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

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

    +0

    您是否找到了任何可以在不使用三星SDK的情况下工作的方法? –

    +0

    不幸的不是。 –

    +0

    谢谢。要使用三星SDK,我猜你需要重写所有内容(比如如果你想同时支持Camera a Camera2 API)? –

    1

    最近我有同样的问题,并最终找到了一个解决方案,帮助我。

    我所需要做的就是从活动传感器矩形的边缘步进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在捕获结果元数据中返回时,摄像机设备将忽略裁剪区域之外的部分,并仅输出相交矩形作为结果元数据中的测量区域。如果该区域完全位于裁剪区域之外,它将被忽略,并且不会在结果元数据中报告。