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 analyze() 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, 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)
    .setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)
    .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)
        .setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)
        .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);

Secara default, CameraX menyetel gambar dalam format OUTPUT_IMAGE_FORMAT_YUV_420_888.

Aplikasi dapat memeriksa ruang warna ImageProxy yang diteruskan oleh CameraX dengan fungsi ImageProxy::getFormat(). Jika ImageFormat.YUV_420_888 ditampilkan, gambar akan berada dalam ruang warna YUV. Jika PixelFormat.RGBA_8888 ditampilkan, gambar akan berada dalam ruang warna RGBA.

Format output YUV tersedia untuk semua versi camera-core. Format output RGBA tersedia untuk camera-core:1.1.0-alpha09 dan versi yang lebih baru, khusus kasus penggunaan Analisis Gambar.

Jika menyetel format output RGBA, CameraX akan mengonversi gambar secara internal dari ruang YUV ke RGBA dan menyimpan bit gambar dalam ByteBuffer bidang pertama ImageProxy (2 bidang lainnya tidak digunakan) dengan urutan berikut:

ImageProxy.getPlanes[0].buffer[0]: alpha
ImageProxy.getPlanes[0].buffer[1]: red
ImageProxy.getPlanes[0].buffer[2]: green
ImageProxy.getPlanes[0].buffer[3]: blue
...

Konversi warna adalah langkah tambahan untuk format output YUV, dan waktu konversi adalah bagian dari total waktu analisis gambar. Aplikasi akan memiliki lebih sedikit waktu pemrosesan per frame saat melakukan analisis real-time. Anda harus menggunakannya saat aplikasi memerlukan output RGBA.

Referensi tambahan

Untuk mempelajari CameraX lebih lanjut, lihat referensi tambahan berikut.

Codelab

  • Mulai Menggunakan CameraX
  • Contoh kode

  • Aplikasi contoh CameraX resmi