2017-10-19 236 views
1

在我的android相機應用程序中,我使用了camera2 api。應用程序不顯示相機的預覽,並且我已經以某種方式實現了它,當用戶界面上的按鈕被按下時,它會拍攝一張圖像。但問題在於自動對焦和自動曝光。簡單地說,我需要相機始終專注於視圖的中間。所以建立請求時,我添加以下屬性:Android Camera2:自動對焦和曝光

captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO); 
captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); 
captureBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_AUTO); 
captureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START); 
captureBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_START); 

但問題仍然是圖像不聚焦。

我有幾個問題:

我需要實現內部CameraCaptureSession.CaptureCallback的方法一些檢查?

我還注意到onImageAvailableImageReader.OnImageAvailableListener所調用,onCaptureProgressed的方法CameraCaptureSession.CaptureCallback沒有被觸發。

我在這裏失蹤的是什麼?我是否需要實現一個線程才能等待攝像機聚焦,然後按下拍攝按鈕時纔會開始。

請注意,此應用程序沒有相機預覽。

回答

2

您只發送一個捕捉請求嗎?或者你是否在後臺運行重複請求,然後僅在按下按鈕時發出高分辨率捕獲?

前者不會真正起作用 - 您必須有一系列請求才能讓自動曝光,聚焦和白平衡算法收斂到良好的值。單個捕獲將不​​會被適當計量或集中。

請看看Camera2Basic樣品;如果您僅使用SurfaceTexture替換該示例中的TextureView(給它一個隨機紋理ID並且不要調用updateTexImage),那麼您可以不預覽。但它正確實現了聚焦和預捕獲觸發,這對您來說至關重要。首先,觸發器只能在一個請求中設置,然後您需要觀看捕獲結果,以便了解曝光/聚焦狀態何時更改爲FOCUSED或CONVERGED。

我也建議CONTINUOUS_PICTURE對焦模式,而不是AUTO;它很可能讓你更快地聚焦圖像。

+0

是的,我正在運行一個捕獲請求。如果我在後臺運行重複請求,這意味着相機總是正確的?就像我們在拍照時看預覽一樣。所以,如果我理解正確,如果應用程序是這樣做的,從長遠來看,它會消耗大量的功率? – KTB

+0

如果有的話,它會像一個單一的請求,但在拍照之前,它會嘗試着重點? – KTB

+0

如果您願意,您可以在用戶點擊快門按鈕時打開相機,但這樣會有明顯的延遲。開機需要約1秒,將測光/對焦聚焦幾百毫秒,然後您可以拍攝照片。如果你想使用閃光燈,你仍然需要運行一個重複請求,直到自動對焦好,然後啓動預捕獲序列。 –

相關問題