The Android Developer Challenge is back! Submit your idea before December 2.

画像を解析する

画像解析ユースケースは、画像処理、コンピュータ ビジョン、機械学習推論を実行するために、CPU からアクセス可能な画像をアプリに提供します。アプリには、各フレームで実行する解析メソッドを実装します。

実装

画像は、ImageProxy パラメータと回転パラメータを使用するメソッドを setAnalyzer() メソッドに渡すことで処理されます。

次のコードサンプルは、これを行う方法と、画像解析ユースケースおよびプレビュー ユースケースを LifecycleOwner にバインドする方法を示しています。プレビュー ユースケースの作成方法については、プレビューを実装するをご覧ください。

このメソッドから戻ると、画像の参照が終了します。そのため、このメソッドでは、解析メソッド以外に画像の参照を渡さず、解析を完了するかコピーを作成する必要があります。

画像解析は、ブロッキング モードと非ブロッキング モードの 2 つのモードで動作します。ブロッキング モードは ImageAnalysis.ImageReaderMode.ACQUIRE_NEXT_IMAGE で設定されます。このモードでは、アナライザはカメラからフレームを順番に受け取ります。つまり、現在のフレームレートで単一フレームの遅延時間より analyze メソッドの実行の方が長時間になる場合、メソッドが結果を返すまで新しいフレームはパイプラインに入ることをブロックされるため、フレームが現在のものではなくなる可能性があります。

非ブロッキング モードは、ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE で設定されます。このモードでは、アナライザは analyze メソッドが呼び出された時点で、最後の取得可能なフレームをカメラから受け取ります。現在のフレームレートで単一フレームの遅延時間よりメソッドの実行の方が長時間になる場合、一部のフレームがスキップされることにより、analyze は次にデータを受け取ったときに、カメラ パイプライン内の最後の取得可能なフレームを取得します。コールバック ハンドラで実行する解析メソッドの設定には、ImageAnalysisConfig.Builder.setCallbackHandler を使用できます。これにより、アナライザ関数の実行中にパイプラインの残りの部分を同時に実行できます。ハンドラを設定しなければ、解析メソッドはメインスレッドで実行されます。

Kotlin

    val imageAnalysisConfig = ImageAnalysisConfig.Builder()
        .setTargetResolution(Size(1280, 720))
        .setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE)
        .build()
    val imageAnalysis = ImageAnalysis(imageAnalysisConfig)

    imageAnalysis.setAnalyzer({ image: ImageProxy, rotationDegrees: Int ->
        // insert your code here.
    })

    CameraX.bindToLifecycle(this as LifecycleOwner, imageAnalysis, preview)
    

Java

    ImageAnalysisConfig config =
        new ImageAnalysisConfig.Builder()
            .setTargetResolution(new Size(1280, 720))
            .setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE)
            .build();

    ImageAnalysis imageAnalysis = new ImageAnalysis(config);

    imageAnalysis.setAnalyzer(
        new ImageAnalysis.Analyzer() {
            @Override
            public void analyze(ImageProxy image, int rotationDegrees) {
                // insert your code here.
            }
    });

    CameraX.bindToLifecycle((LifecycleOwner) this, imageAnalysis, preview);
    

CameraX は YUV_420_888 形式の画像を生成します。

参考情報

CameraX について詳しくは、以下の参考情報をご確認ください。

コードラボ

  • CameraX のスタートガイド
  • コードサンプル

  • CameraX の公式サンプルアプリ