画像解析

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

実装

画像を処理するには、画像解析が行われるエグゼキュータと ImageAnalysis.Analyzer パラメータを setAnalyzer() メソッドに渡します。登録できるアナライザはいつでも 1 つのみです。新しいアナライザを登録すると、既存のアナライザが置き換えられます。

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

画像解析は、ブロッキング モードと非ブロッキング モードの 2 つのモードで動作します。ブロッキング モードを有効にするには、STRATEGY_BLOCK_PRODUCERsetBackpressureStrategy() を呼び出します。 このモードでは、エグゼキュータはカメラから逐次的にフレームを受け取ります。つまり、analyze() メソッドの処理に現在のフレームレートでの 1 つのフレームのレイテンシより長い時間がかかる場合、メソッドが結果を返すまで新しいフレームのパイプラインへの入力がブロックされるので、フレームが最新でなくなる可能性があります。

非ブロッキング モードを有効にするには、STRATEGY_KEEP_ONLY_LATESTsetBackpressureStrategy() を呼び出します。 このモードでは、エグゼキュータは、カメラから analyze() メソッドが呼び出された時点における最新の使用可能なフレームを受け取ります。メソッドの処理に現在のフレームレートでの 1 つのフレームのレイテンシより長い時間がかかる場合、一部のフレームをスキップすることにより、analyze() は次にデータを受け取ったときにカメラ パイプラインから最新の使用可能なフレームを取得します。

analyze() から戻る前に、image.close() を呼び出して画像参照を閉じます。これにより、それ以上画像の生成がブロックされる(それによりプレビューが遅くなる)ことを防ぎ、画像がドロップされる可能性を少なくします。メソッドは、解析メソッドの終了後は画像参照を渡さず、解析を完了するかコピーを作成する必要があります。

Kotlin

val imageAnalysis = ImageAnalysis.Builder()
    .setTargetResolution(Size(1280, 720))
    .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
    .build()

imageAnalysis.setAnalyzer(executor, ImageAnalysis.Analyzer { image ->
    val rotationDegrees = image.imageInfo.rotationDegrees
    // insert your code here.
})

cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, imageAnalysis, preview)

Java

ImageAnalysis imageAnalysis =
    new ImageAnalysis.Builder()
        .setTargetResolution(new Size(1280, 720))
        .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
        .build();

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

cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, imageAnalysis, preview);

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

参考情報

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

Codelab

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

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