2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AndroidStudioのcameraXでAWBを切りたいとき

Last updated at Posted at 2023-04-12

はじめに

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の設定はマニュアルで行っているわけではなく、カメラの起動時に決定される値が固定されてしまいます。ゆくゆくはアプリのほうからマニュアルで設定できるようにしたいです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?