簡體   English   中英

Android 相機按需自動對焦

[英]Android Camera AutoFocus on Demand

內置的攝像機應用程序(如 HTC EVO 上的應用程序)似乎僅在預覽圖像更改時調用camera.autoFocus() 如果您保持相機穩定,則不會發生camera.autoFocus()
我想在camera.startPreview()處於活動狀態時復制此行為,如下面的初始預覽設置代碼所示:

camera = camera.open();
Camera.Parameters parameters = camera.getParameters();
List<String> focusModes = parameters.getSupportedFocusModes();
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO))
{
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
}
camera.setParameters(parameters);
camera.setPreviewDisplay(holder);
camera.startPreview();

我為autoFocus()找到的所有示例似乎每 500 毫秒到 2000 毫秒調用一次,或者在拍攝照片或開始錄制之前的那一刻調用一次。
EVO 攝像機應用程序似乎使用傳感器或算法來觸發autoFocus() 然而,這個autoFocus()觸發器完成后它工作得非常好。 有沒有人知道如何在需要時按需觸發autoFocus() ,例如當相機靠近或遠離拍攝對象或稍微平移時? 謝謝你,格里

Android 自 API 9 級(姜餅)以來引入了連續自動對焦 它比定期調用 Camera.autoFocus 效果更好。

我在我的一個應用程序中遇到了同樣的問題。

我的解決方案是使用傳感器偵聽器並在用戶將設備搖動到某個閾值時進行自動對焦。 這是代碼。

public void setCameraFocus(AutoFocusCallback autoFocus){
if (mCamera.getParameters().getFocusMode().equals(mCamera.getParameters().FOCUS_MODE_AUTO) ||
        mCamera.getParameters().getFocusMode().equals(mCamera.getParameters().FOCUS_MODE_MACRO)){
    mCamera.autoFocus(autoFocus);
}

}

自動對焦的回調:

// this is the autofocus call back
private AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback(){

    public void onAutoFocus(boolean autoFocusSuccess, Camera arg1) {
        //Wait.oneSec();
        mAutoFocus = true;
    }};

以及調用焦點的方式。

public void onSensorChanged(SensorEvent event) {

if (mInvalidate == true){
    mView.invalidate();
    mInvalidate = false;
}
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
if (!mInitialized){
    mLastX = x;
    mLastY = y;
    mLastZ = z;
    mInitialized = true;
}
float deltaX  = Math.abs(mLastX - x);
float deltaY = Math.abs(mLastY - y);
float deltaZ = Math.abs(mLastZ - z);

if (deltaX > .5 && mAutoFocus){ //AUTOFOCUS (while it is not autofocusing)
    mAutoFocus = false;
    mPreview.setCameraFocus(myAutoFocusCallback);
}
if (deltaY > .5 && mAutoFocus){ //AUTOFOCUS (while it is not autofocusing)
    mAutoFocus = false;
    mPreview.setCameraFocus(myAutoFocusCallback);
}
if (deltaZ > .5 && mAutoFocus){ //AUTOFOCUS (while it is not autofocusing) */
    mAutoFocus = false;
    mPreview.setCameraFocus(myAutoFocusCallback);
}

mLastX = x;
mLastY = y;
mLastZ = z;

}

你可以在這里看到完整的項目: http://adblogcat.com/a-camera-preview-with-a-bounding-box-like-google-goggles/

很可能使用更簡單的技術調用重新對焦,如果您在相機視圖中有一個白框 flash(來自代碼,而不是真實框),它將迅速調用重新對焦。 我擁有 EVO 4G,之前的一張海報是正確的,自從 Gingerbread 更新以來,它確實不斷地重新聚焦,而無需更改它所看到的內容。

拍照時,您可以設置此項

應用程序可以在這種模式下調用autoFocus(AutoFocusCallback) 如果自動對焦在掃描過程中,焦點回調將在完成后返回。 如果自動對焦未掃描,則焦點回調將立即返回 boolean 指示焦點是否清晰。 然后應用程序可以決定是要立即拍照還是將對焦模式更改為自動,並運行完整的自動對焦周期。

我會使用 SensorEventListener。 您需要做的就是監聽傳感器事件並在手機方向改變足夠的閾值后觸發自動對焦。

http://developer.android.com/reference/android/hardware/SensorEventListener.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM