web-dev-qa-db-ja.com

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 Camcorderアプリは、autoFocus()をトリガーするためにセンサーまたはアルゴリズムを使用しているようです。ただし、このautoFocus()トリガーは実行され、非常にうまく機能します。カメラを被写体から近づけたり遠ざけたり、わずかにパンしたりする場合など、必要に応じてautoFocus()をオンデマンドでトリガーする方法を知っている人はいますか?ありがとう、ジェリー

30
GerryL

Androidは、APIレベル9(Gingerbread)以降、 連続オートフォーカス を導入しています。 Camera.autoFocusを定期的に呼び出すよりもうまく機能します。

23
arsalank2

私のアプリケーションのいずれかで同じ問題が発生しました。

私の解決策は、センサーリスナーを使用し、ユーザーがデバイスをあるしきい値まで振ったときにオートフォーカスを行うことでした。コードは次のとおりです。

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/

19
Juan Acevedo

写真を撮るために、 this を設定できます。

アプリケーションは、このモードでautoFocus(AutoFocusCallback)を呼び出すことができます。オートフォーカスがスキャンの途中にある場合、フォーカスコールバックは完了すると戻ります。オートフォーカスがスキャンしていない場合、フォーカスコールバックは、フォーカスがシャープかどうかを示すブール値ですぐに戻ります。アプリは、すぐに写真を撮るか、フォーカスモードを自動に変更するかを決定し、完全なオートフォーカスサイクルを実行できます。

2
Santosh

カメラビュー内に白いボックスフラッシュがある場合(実際のボックスではなくコードから)、簡単な手法でリフォーカスを呼び出すことは非常に可能です。私はEVO 4Gを所有しており、以前のポスターの1つは正しいです。Gingerbreadのアップデート以降、見ているものを変更する必要なく、継続的にリフォーカスします。

2
Speedytech7

sensorEventListenerを使用します。必要なことは、センサーイベントをリッスンし、電話の向きが十分なしきい値によって変更されたらオートフォーカスを起動することだけです。

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

0
Renard