web-dev-qa-db-ja.com

Android Camera2輝度を上げる

私はアプリケーションでAndroid camera2を使用して連続画像を撮影しています。ここで、camera2を使用すると、元のカメラと比較して画像プレビューの明るさが非常に暗くなります。 this が表示されますその答えでは同様の要件はありません。

推奨されているように、camera2の明るさを設定しようとしました here

このコントロールは、Android.control.aeMode!= OFFの場合にのみ有効になることに注意してください。このコントロールは、Android.control.aeLock == trueの場合でも有効になります。

captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
            captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
            captureRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);
            captureRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 6);

ただし、以下に示すように、プレビューは暗い画像としてのみ表示されます。

ここで違いを確認してください:

元のカメラ: enter image description here

Camera2の使用: enter image description here

そして、私が2番目のパラメータとして渡す必要がある値は何ですか?

captureRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 6);

ドキュメントで提案されているように、6を維持しました。

たとえば、露出値(EV)のステップが0.333の場合、「6」は+2 EVの露出補正を意味します。 -3は-1 EVの露出補正を意味します。

ただし、明るさには影響しません。

18
Shylendra Madda

ここにあります:

以下にコードを追加しますonConfigured()およびunlockFocus()

_captureRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,getRange());
_

上記のコードを使用すると、より良いプレビューが得られます。ただし、キャプチャした画像はそのまま残ります。 より良い画像を得るために、以下の同じコードを使用しますcaptureStillPicture()

_captureBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, getRange());
_

getRange is:

_    private Range<Integer> getRange() {
    CameraCharacteristics chars = null;
    try {
        chars = mCameraManager.getCameraCharacteristics(mCameraId);
        Range<Integer>[] ranges = chars.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
        Range<Integer> result = null;
        for (Range<Integer> range : ranges) {
            int upper = range.getUpper();
            // 10 - min range upper for my needs
            if (upper >= 10) {
                if (result == null || upper < result.getUpper().intValue()) {
                    result = range;
                }
            }
        }
        if (result == null) {
            result = ranges[0];
        }
        return result;
    } catch (CameraAccessException e) {
        e.printStackTrace();
        return null;
    }
}
_
9
Ronak Thakkar

あなたはこれを試すことができます

public void setBrightness(int value) {
    int brightness = (int) (minCompensationRange + (maxCompensationRange - minCompensationRange) * (value / 100f));
    previewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, brightness);
    applySettings();
 }

private void applySettings() {
    captureSession.setRepeatingRequest(previewRequestBuilder.build(), null, null);
}
1
Jayesh

CONTROL_AE_LOCKはオフにする必要があります。ドキュメントを誤って解釈しました。おそらくドキュメント自体が少し混乱しています。

このコントロールは、Android.control.aeMode!= OFFの場合にのみ有効になることに注意してください。このコントロールは、Android.control.aeLock == trueの場合でも有効になります。

つまり、AEロックがオンの場合、露出補正はロックされた露出に適用され、撮影時の瞬間的な露出には適用されません。

繰り返しのリクエストでも露出はロックされているので役に立ちません。

AEロックを外すと動作するはずです。

1
yumoji

CONTROL_AE_EXPOSURE_COMPENSATIONの設定中、ドキュメントで定義されている2番目のパラメーターはCameraCharacteristics.CONTROL_AE_COMPENSATION_STEPに関連しています。

調整はステップ数として測定され、ステップサイズはAndroid.control.aeCompensationStepによって定義され、許容範囲はAndroid.control.aeCompensationRangeによって定義されます。

+ 2EVの例の6の値は、stepが0.333の場合にのみ正しく、これは単なる例です。

次のコードは、+ 2EVに使用される露出補正値を提供します

CameraManager manager = (CameraManager)this.getSystemService(Context.CAMERA_SERVICE);
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
double exposureCompensationSteps = characteristics.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP).doubleValue();
int exposureCompensation = (int)( 2.0 / exposureCompensationSteps );

また、値がCameraCharacteristics.CONTROL_AE_COMPENSATION_RANGEで指定された範囲内にあるかどうかを確認することをお勧めします。

0
Bhoju

まず、自動露出をロックしないでください。露出補正を調整する場合は必要ありません。

次に、新しいキャプチャ要求でCameraCaptureSession.setRepeatingRequestを呼び出しましたか?

0
Eddy Talvala