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

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

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

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

フォーカスエリア

カメラデバイスにフォーカスエリアを設定することができます。
フォーカスエリアはCamera.Areaを使い矩形領域と重みで指定することができます。
矩形領域はRectで表され、プレビュー左上(-1000,-1000)・右下(1000,1000)の座標で表されます。
重みはint型の整数値で表され、1〜1000の範囲で設定できます。また、重みが大きい程、強くフォーカスに反映されます。
Camera.Parameters内にあるフォーカスエリアに関連するデータのキーは下記のとおりです。
max-num-focus-areasカメラデバイスがサポートしている最大フォーカスエリア数のキーです。
focus-areasカメラデバイスに現在設定されているフォーカスエリアリストのキーです。

カメラデバイスがサポートしている最大フォーカスエリア数

カメラデバイスがサポートしている最大フォーカスエリア数はint getMaxNumFocusAreas()で取得することができます。
最大フォーカスエリア数が1以上の場合はフォーカスエリアの設定が可能で、最大数に応じた数のフォーカスエリアを設定することができます。
フォーカスエリアを複数設定する場合、下記のようにフォーカスに反映されます。
  • 重みが同じフォーカスエリアが複数ある場合は狭いエリアがフォーカスに反映されます。
  • フォーカスエリアとフォーカスエリアが重なる部分は重みが加算されフォーカスに反映されます。


    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        Log.d(TAG, "MaxNumFocusAreas: " + parameters.getMaxNumFocusAreas());
        mCamera.setParameters(parameters);
    }


フォーカスエリアの取得と変更

フォーカスエリアはList getFocusAreas()で現在の値が取得できます。
また、void setFocusAreas(List focusAreas)を使ってフォーカスエリアを変更することができます。


    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        Log.d(TAG, "MaxNumFocusAreas: " + parameters.getMaxNumFocusAreas());
        List<Camera.Area> focusAreas = parameters.getFocusAreas();
        if(focusAreas == null && parameters.getMaxNumFocusAreas() > 1){
            focusAreas = new ArrayList<>();
            Camera.Area area = new Camera.Area(new Rect(-1000,-1000,-900,-900) , 1);
            focusAreas.add(area);
        }
        parameters.setFocusAreas(focusAreas);
        mCamera.setParameters(parameters);
    }


フォーカスエリアの注意点

フォーカスエリアの設定値は下記の条件で例外が発生するので注意が必要です。
  1. Camera.Parameters#getMaxNumFocusAreasで取得した以上の数のフォーカスエリアを設定した状態でCamera#setParametersを使用すると例外が発生します。
  2. 縦横が0のフォーカスエリアを設定した状態でCamera#setParametersを使用すると例外が発生します。
  3. 左上(-1000,-1000)・右下(1000,1000)以外の矩型領域のフォーカスエリアを設定した状態でCamera#setParametersを使用すると例外が発生します。
  4. 重みが1〜1000以外のフォーカスエリアを設定した状態でCamera#setParametersを使用すると例外が発生します。
  5. Camera.Parameters#removeで”focus-areas”を削除した状態でCamera#setParametersを使用すると例外が発生します。
  6. カメラプレビューが開始された状態でフォーカスエリアを変更すると即時に反映されます。
  7. フォーカスエリアの設定はフォーカスモードがFOCUS_MODE_AUTO・FOCUS_MODE_MACRO・FOCUS_MODE_CONTINUOUS_VIDEO・FOCUS_MODE_CONTINUOUS_PICTUREの時に有効です。
  8. Camera.Parameters#setFocusAreasにnullを設定するとフォーカスは完全にカメラデバイスに任されることになります。