Analisis 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 analisis yang dijalankan di setiap frame.

Implementasi

Gambar diproses dengan meneruskan eksekutor yang menjalankan analisis gambar dan parameter ImageAnalysis.Analyzer ke metode setAnalyzer() . Hanya satu penganalisis yang dapat didaftarkan kapan saja; mendaftarkan penganalisis baru akan menggantikan yang sudah ada.

Contoh kode dalam topik ini menunjukkan cara melakukannya, serta cara mengikat kasus penggunaan analisis gambar dan pratinjau ke LifecycleOwner. Untuk membaca cara membuat kasus penggunaan pratinjau, lihat Mengimplementasikan pratinjau.

Analisis gambar berjalan dalam dua mode: pemblokiran dan non-pemblokiran. Mode pemblokiran diaktifkan dengan memanggil setBackpressureStrategy() dengan STRATEGY_BLOCK_PRODUCER. Dalam mode ini, eksekutor menerima frame dari kamera secara berurutan. Artinya, jika metode analyze() membutuhkan waktu lebih lama dari latensi frame tunggal pada kecepatan frame saat ini, maka frame mungkin tidak lagi yang terbaru karena frame baru diblokir agar tidak memasuki pipeline hingga metode tersebut kembali.

Mode non-pemblokiran diaktifkan dengan memanggil setBackpressureStrategy() dengan STRATEGY_KEEP_ONLY_LATEST. Dalam mode ini, eksekutor menerima frame terakhir yang tersedia dari kamera pada saat metode analyze() dipanggil. Jika metode tersebut membutuhkan waktu lebih lama dari latensi frame tunggal pada kecepatan frame saat ini, sejumlah frame mungkin dilewati sehingga saat analyze() menerima data, metode tersebut akan mendapatkan frame terakhir yang tersedia dalam pipeline kamera.

Sebelum kembali dari analyze()image.close(), tutup referensi gambar dengan memanggil untuk menghindari pemblokiran produksi gambar berikutnya (yang menyebabkan pratinjau berhenti berfungsi) dan untuk menghindari kemungkinan penurunan gambar. Metode tersebut harus menyelesaikan analisis atau membuat salinan, bukan meneruskan referensi gambar di luar metode analisis.

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

Referensi lainnya

Untuk mempelajari CameraX lebih lanjut, lihat referensi tambahan berikut.

Codelab

  • Mulai Menggunakan CameraX
  • Contoh kode

  • Contoh aplikasi CameraX resmi