私はアプリケーションで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);
ただし、以下に示すように、プレビューは暗い画像としてのみ表示されます。
ここで違いを確認してください:
そして、私が2番目のパラメータとして渡す必要がある値は何ですか?
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 6);
ドキュメントで提案されているように、6を維持しました。
たとえば、露出値(EV)のステップが0.333の場合、「6」は+2 EVの露出補正を意味します。 -3は-1 EVの露出補正を意味します。
ただし、明るさには影響しません。
ここにあります:
以下にコードを追加します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;
}
}
_
あなたはこれを試すことができます
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);
}
CONTROL_AE_LOCKはオフにする必要があります。ドキュメントを誤って解釈しました。おそらくドキュメント自体が少し混乱しています。
このコントロールは、Android.control.aeMode!= OFFの場合にのみ有効になることに注意してください。このコントロールは、Android.control.aeLock == trueの場合でも有効になります。
つまり、AEロックがオンの場合、露出補正はロックされた露出に適用され、撮影時の瞬間的な露出には適用されません。
繰り返しのリクエストでも露出はロックされているので役に立ちません。
AEロックを外すと動作するはずです。
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で指定された範囲内にあるかどうかを確認することをお勧めします。
まず、自動露出をロックしないでください。露出補正を調整する場合は必要ありません。
次に、新しいキャプチャ要求でCameraCaptureSession.setRepeatingRequestを呼び出しましたか?