【今更だけどandroid.hardware.Cameraを使う】Camera.Parametersの設定値 アンチバンディング

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

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

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

アンチバンディング

振動する光源下(ブラウン管テレビや蛍光灯など)で撮影した写真にはバンディングと呼ばれる線が入ることがあります。
カメラデバイスにはバンディングを抑制するためにアンチバンディングと呼ばれる機能があります。
Camera.Parameters内にあるアンチバンディングに関連するデータのキーは下記のとおりです。
antibanding-valuesカメラデバイスがサポートしているアンチバンディングリストのキーです。
antibandingカメラデバイスに現在設定されているアンチバンディングのキーです。

カメラデバイスがサポートしているアンチバンディング

カメラデバイスがサポートしているアンチバンディングはList getSupportedAntibanding()で取得することができます。
アンチバンディングは下記のCamera.Parametersで定義された定数で表されます。
String ANTIBANDING_OFFアンチバンディング機能をオフにします。
String ANTIBANDING_50HZアンチバンディング機能の商用電源周波数が50HZの時に使用するモード
String ANTIBANDING_60HZアンチバンディング機能の商用電源周波数が60HZの時に使用するモード
String ANTIBANDING_AUTOアンチバンディング機能の対応周波数を自動で切り替えるモード


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


アンチバンディングの取得と変更

アンチバンディングはString getAntibanding()で現在の値が取得できます。
また、void setAntibanding(String antibanding)を使ってアンチバンディングを変更することができます。


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

        Log.d(TAG, "Antibanding: " + parameters.getAntibanding());
        parameters.setAntibanding(Camera.Parameters.ANTIBANDING_OFF);
        mCamera.setParameters(parameters);
    }


アンチバンディングの注意点

アンチバンディングの設定値は一定の条件で例外が発生するので注意が必要です。
  1. Camera.Parameters#getSupportedAntibandingで取得した値以外の値を設定した状態でCamera#setParametersを使用するとデフォルトが適用されるようです。
  2. Camera.Parameters#removeで”antibanding”を削除した状態でCamera#setParametersを使用するとデフォルトが適用されるようです。
  3. カメラプレビューが開始された状態でサムネイルサイズを変更すると即時に反映されます。