Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

画像を解析する

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

実装

画像を処理するには、画像解析が行われるエグゼキュータと ImageAnalysis.Analyzer パラメータを setAnalyzer() メソッドに渡します。

このトピックのコードサンプルは、これを行う方法に加えて、画像解析ユースケースとプレビュー ユースケースを 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 について詳しくは、以下の参考情報をご確認ください。

コードラボ

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

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