2017-02-17 66 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在捕獲結果元數據中返回時,攝像機設備將忽略裁剪區域之外的部分,並僅輸出相交矩形作爲結果元數據中的測量區域。如果該區域完全位於裁剪區域之外,它將被忽略,並且不會在結果元數據中報告。