はじめに
AndroidStudioでcameraXをチュートリアルの通りに実装すると色が自動で補正されます。これはAWB(オートホワイトバランス, Auto White Balance)というcameraXの標準機能が原因です。しかし、私は自動色補正をされないようなアプリを実装する必要がありました。公式のページのみではAWBを切る方法が良くわからなかったため、メモ代わりに残して置きます。
アプリ実装中に参考にしたサイト
↓cameraXの実装
https://qiita.com/iwatake2222/items/c0ebe6d84afdef57aab3
↓公式のAWBとかについて書いてあるページ
https://developer.android.com/reference/android/hardware/camera2/CaptureRequest
環境
targetAPI : 31
使用端末 : ASUS_Z01KDA
Androidバージョン : 8.0.0
実装
アプリ自体は参考にしたサイトの1つ目に紹介したアプリとほぼ同じです。同様に実装を行っている方の場合、startCamera()
を以下のように書き換えてみてください。
private void startCamera() {
final ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
Context context = this;
cameraProviderFuture.addListener(new Runnable() {
@SuppressLint("UnsafeOptInUsageError")
@Override
public void run() {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
preview = new Preview.Builder().build();
//↓ここから
ImageAnalysis.Builder builder = new ImageAnalysis.Builder();
Camera2Interop.Extender extender = new Camera2Interop.Extender(builder);
//↓ここでAWBを切る
extender.setCaptureRequestOption(CaptureRequest.CONTROL_AWB_LOCK,true);
imageAnalysis = builder.build();
//↑ここまで
imageAnalysis.setAnalyzer(cameraExecutor, new MyImageAnalyzer());
CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build();
cameraProvider.unbindAll();
camera = cameraProvider.bindToLifecycle((LifecycleOwner)context, cameraSelector, preview, imageAnalysis);
preview.setSurfaceProvider(previewView.createSurfaceProvider(camera.getCameraInfo()));
} catch(Exception e) {
Log.e(TAG, "[startCamera] Use case binding failed", e);
}
}
}, ContextCompat.getMainExecutor(this));
}
cameraXから直接AWBを切ることはできず、camera2を使用する必要があります。そのため、Camera2Interop.Extender
オブジェクトを使用して、ImageAnalysis
オブジェクトを拡張します。今回はAWBの設定のみを行いましたが、Camera2Interop.Extender
を使用することで、AEやAF、カメラのフレームレートや解像度などを細かく設定することができると思います。
このプログラムで実装したアプリを実機で実行した場合、一番初めにカメラが起動した際にWBが決定され、その値に固定されるようです。
もしかしたらマニフェスト等も設定する必要があるかもしれませんが、やったかどうかすら忘れました。参考にならずごめんなさい…
おわりに
今回は、AWBの切り方について書きましたが、この方法を用いればAEやAFを切ることが可能だと思います。しかし、AWBの設定はマニュアルで行っているわけではなく、カメラの起動時に決定される値が固定されてしまいます。ゆくゆくはアプリのほうからマニュアルで設定できるようにしたいです。