Menganalisis gambar

Kasus penggunaan analisis gambar memberi aplikasi Anda gambar yang dapat diakses CPU sebagai tempat untuk menjalankan pemrosesan gambar, computer vision, atau inferensi machine learning. Aplikasi ini mengimplementasikan metode Analyzer yang dijalankan di setiap frame.

Implementasi

Gambar diproses dengan meneruskan metode yang mengambil parameter ImageProxy dan parameter rotasi ke metode setAnalyzer().

Contoh kode berikut menunjukkan cara melakukannya, serta cara menggabungkan kasus penggunaan analisis gambar dan pratinjau ke LifecycleOwner. Untuk membaca tentang membuat kasus penggunaan pratinjau, lihat Menerapkan pratinjau.

Setelah kembali dari metode ini, referensi gambar ditutup. Oleh karena itu, metode itu harus menyelesaikan analisis atau membuat salinan, bukannya meneruskan referensi gambar di luar metode analisis.

Analisis gambar berjalan dalam dua mode: pemblokiran dan non-pemblokiran. Mode pemblokiran ditetapkan menggunakan ImageAnalysis.ImageReaderMode.ACQUIRE_NEXT_IMAGE. Dalam mode ini, Analyzer menerima frame dari kamera secara berurutan; artinya, jika metode analyze membutuhkan waktu lebih lama daripada latensi frame tunggal dalam framerate saat ini, maka frame mungkin tidak lagi yang terbaru karena frame baru diblokir agar tidak memasuki pipeline sampai metode tersebut kembali.

Mode non-pemblokiran ditetapkan menggunakan ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE. Dalam mode ini, Analyzer menerima frame terakhir yang tersedia dari kamera pada saat metode analyze dipanggil. Jika metode ini membutuhkan waktu lebih lama daripada latensi untuk frame tunggal dalam framerate saat ini, beberapa frame mungkin akan dilewati sehingga saat berikutnya analyze menerima data, ia akan mendapatkan frame terakhir yang tersedia di pipeline kamera. Anda dapat menetapkan metode analyze yang akan dijalankan di pengendali callback menggunakan ImageAnalysisConfig.Builder.setCallbackHandler, yang memungkinkan pipeline lainnya berjalan bersamaan selagi fungsi analyzer berjalan. Jika Anda tidak menetapkan pengendali, metode analisis akan berjalan di thread utama.

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 menghasilkan gambar dalam format YUV_420_888.

Referensi lainnya

Untuk mempelajari CameraX lebih lanjut, lihat referensi tambahan berikut.

Codelab

  • Memulai CameraX
  • Contoh kode

  • Contoh aplikasi CameraX resmi