【今更だけどandroid.hardware.Cameraを使う】Camera.Parametersの設定値 フォーカスモード

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

android.hardware.Cameraを使うことで、Android端末にあるカメラデバイスにアクセスして使うことができます。
android.hardware.Cameraは、現在では非推奨となっていますがOpenCV等ではまだまだ使われています。

Android端末に実装されているカメラデバイスは固有の性能があります。
そのため、ある端末では出来るのに別の端末では出来ないということが多々あります。
今回はCamera.Parametersのフォーカスモードに関連する設定値を説明します。
下記の実装はすべて前回までに作ったクラスを修正しています。

フォーカスモード

カメラデバイスにはフォーカスモードが実装されているものがあります。
このフォーカスモードは被写体との距離で使い分ける必要があります。
Camera.Parameters内にあるフォーカスモードに関連するデータのキーは下記のとおりです。
focus-mode-valuesカメラデバイスがサポートしているフォーカスモードリストのキーです。
focus-modeカメラデバイスに現在設定されているフォーカスモードのキーです。

カメラデバイスがサポートしているフォーカスモード

カメラデバイスがサポートしているフォーカスモードはList getSupportedFocusModes()で取得することができます。
フォーカスモードは下記のCamera.Parametersで定義された定数で表されます。
String FOCUS_MODE_AUTOCamera#autoFocusを使用したタイミングでフォーカスが実行されます。
String FOCUS_MODE_MACRO近接用のフォーカスモードです。このモードではCamera#autoFocusを使うことでフォーカスが実行されます。
String FOCUS_MODE_INFINITYフォーカスが無限に設定されます。このモードではCamera#autoFocusを使わない様にしましょう。
String FOCUS_MODE_CONTINUOUS_PICTURE写真撮影用のコンティニュアスフォーカスモードです。継続してフォーカスを合わせようとします。
String FOCUS_MODE_CONTINUOUS_VIDEOビデオ撮影用のコンティニュアスフォーカスモードです。ビデオ撮影に最適なスムーズなフォーカスが継続して行われます。
String FOCUS_MODE_EDOFEDOF(拡張被写界深度)を行うことで全体にフォーカスが合うようになります。このモードではCamera#autoFocusを使わない様にしましょう。
String FOCUS_MODE_FIXEDフォーカスを固定化するモードです。このモードではCamera#autoFocusを使わない様にしましょう。


    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        List<String> supportedFocusModes = parameters.getSupportedFocusModes();
        for (int i = 0; i < supportedFocusModes.size(); i++) {
            Log.d(TAG, "SupportedFocusModes: " + supportedFocusModes.get(i));
        }
        mCamera.setParameters(parameters);
    }


フォーカスモードの取得と変更

フォーカスモードはString getFocusMode()で現在の値が取得できます。
また、void setFocusMode(String value)を使ってフォーカスモードを変更することができます。


    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        List<String> supportedFocusModes = parameters.getSupportedFocusModes();
        for (int i = 0; i < supportedFocusModes.size(); i++) {
            Log.d(TAG, "SupportedFocusModes: " + supportedFocusModes.get(i));
        }
        Log.d(TAG, "FocusMode: " + parameters.getFocusMode());
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
        mCamera.setParameters(parameters);
    }


フォーカスモードの注意点

フォーカスモードの設定値は下記の条件で例外が発生するので注意が必要です。
  1. Camera.Parameters#getSupportedFocusModesで取得した値以外の値を設定した状態でCamera#setParametersを使用すると例外が発生します。
  2. Camera.Parameters#removeで”focus-mode”を削除した状態でCamera#setParametersを使用すると例外が発生します。
  3. カメラプレビューが開始された状態でフォーカスモードを変更すると即時に反映されます。