【今更だけど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-metering-areasカメラデバイスがサポートしている最大測光エリア数のキーです。
metering-areasカメラデバイスに現在設定されている測光エリアリストのキーです。

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

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


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


測光エリアの取得と変更

測光エリアはList getMeteringAreas()で現在の値が取得できます。
また、void setMeteringAreas(List meteringAreas)を使って測光エリアを変更することができます。


    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        Log.d(TAG, "MaxNumMeteringAreas: " + parameters.getMaxNumMeteringAreas());
        List<Camera.Area> meteringAreas = parameters.getMeteringAreas();
        if(meteringAreas == null) {
            if(parameters.getMaxNumMeteringAreas() > 0) {
                meteringAreas = new ArrayList<>();
                meteringAreas.add(new Camera.Area(new Rect(-1000,-1000,-900,-900) , 1000));
            }
        }
        parameters.setMeteringAreas(meteringAreas);
        mCamera.setParameters(parameters);
    }


測光エリアの注意点

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