Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

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 eksekutor yang menjalankan analisis gambar dan parameter ImageAnalysis.Analyzer ke metode setAnalyzer().

Contoh kode dalam topik ini menunjukkan cara melakukannya, serta cara menggabungkan kasus penggunaan analisis gambar dan pratinjau ke LifecycleOwner. Untuk membaca tentang pembuatan kasus penggunaan pratinjau, lihat Menerapkan 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. Ini berarti bahwa, jika metode analyze() membutuhkan waktu yang lebih lama dari 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 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 framerate saat ini, beberapa frame mungkin dilewati sehingga saat analyze() menerima data nantinya, metode tersebut akan menampilkan frame terakhir dalam pipeline kamera.

Sebelum kembali dari analyze(), tutup referensi gambar dengan memanggil image.close() 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 tambahan

Untuk mempelajari CameraX lebih lanjut, lihat referensi tambahan berikut.

Codelab

  • Memulai CameraX
  • Contoh kode

  • Contoh aplikasi CameraX resmi