Raw Depth API memberikan data kedalaman untuk gambar kamera yang memiliki akurasi lebih tinggi daripada data Depth API penuh, tetapi tidak selalu mencakup setiap piksel. Gambar kedalaman mentah, bersama dengan gambar keyakinan yang cocok, juga dapat diproses lebih lanjut, sehingga aplikasi hanya menggunakan data kedalaman yang memiliki akurasi yang cukup untuk setiap kasus penggunaan.
Kompatibilitas perangkat
Raw Depth tersedia di semua perangkat yang mendukung Depth API. Raw Depth API, seperti Depth API lengkap, tidak memerlukan sensor kedalaman hardware yang didukung, seperti sensor waktu penerbangan (ToF). Namun, baik Raw Depth API maupun Depth API penuh memanfaatkan sensor hardware yang didukung yang mungkin dimiliki perangkat.
Raw Depth API vs full Depth API
Raw Depth API memberikan perkiraan kedalaman dengan akurasi yang lebih tinggi, tetapi gambar kedalaman mentah mungkin tidak menyertakan perkiraan kedalaman untuk semua piksel dalam gambar kamera. Sebaliknya, Depth API penuh memberikan perkiraan kedalaman untuk setiap piksel, tetapi data kedalaman per piksel mungkin kurang akurat karena penghalusan dan interpolasi perkiraan kedalaman. Format dan ukuran gambar kedalaman sama di kedua API. Hanya kontennya yang berbeda.
Tabel berikut mengilustrasikan perbedaan antara Raw Depth API dan full Depth API menggunakan gambar kursi dan meja di dapur.
API | Hasil | Gambar kamera | Gambar depth | Gambar keyakinan |
---|---|---|---|---|
Raw Depth API |
|
|||
API Kedalaman Penuh |
|
T/A |
Gambar keyakinan
Gambar yang ditampilkan secara percaya diri oleh Raw Depth API, piksel yang lebih terang memiliki nilai keyakinan yang lebih tinggi, dengan piksel putih yang merepresentasikan tingkat keyakinan penuh dan piksel hitam merepresentasikan tingkat keyakinan penuh. Secara umum, area dalam gambar kamera yang memiliki lebih banyak tekstur, seperti pohon, akan memiliki keyakinan kedalaman mentah yang lebih tinggi daripada area yang tidak memiliki tekstur, seperti dinding kosong. Permukaan tanpa tekstur biasanya menghasilkan tingkat keyakinan nol.
Jika perangkat target memiliki sensor kedalaman hardware yang didukung, keyakinan terhadap area gambar yang cukup dekat dengan kamera kemungkinan akan lebih tinggi, bahkan pada permukaan tanpa tekstur.
Biaya komputasi
Biaya komputasi Raw Depth API adalah sekitar setengah dari biaya komputasi untuk Depth API penuh.
Kasus penggunaan
Dengan Raw Depth API, Anda dapat memperoleh gambar kedalaman yang memberikan representasi geometri objek yang lebih mendetail dalam scene. Data kedalaman mentah dapat berguna saat membuat pengalaman AR yang memerlukan peningkatan akurasi dan detail kedalaman untuk tugas memahami geometri. Beberapa kasus penggunaan meliputi:
- Rekonstruksi 3D
- Pengukuran
- Deteksi bentuk
Prasyarat
Pastikan Anda memahami konsep dasar AR dan cara mengonfigurasi sesi ARCore sebelum melanjutkan.
Aktifkan Kedalaman
Dalam sesi ARCore baru, periksa apakah perangkat pengguna mendukung Kedalaman. Tidak semua perangkat yang kompatibel dengan ARCore mendukung Depth API karena kendala daya pemrosesan. Untuk menghemat resource, kedalaman dinonaktifkan secara default di ARCore. Aktifkan mode kedalaman agar aplikasi Anda menggunakan Depth API.
Java
Config config = session.getConfig(); // Check whether the user's device supports Depth. if (session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)) { // Enable depth mode. config.setDepthMode(Config.DepthMode.AUTOMATIC); } session.configure(config);
Kotlin
if (session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)) { session.configure(session.config.apply { depthMode = Config.DepthMode.AUTOMATIC }) }
Mendapatkan gambar tingkat keyakinan dan kedalaman mentah terbaru
Panggil frame.acquireRawDepthImage16Bits()
untuk memperoleh gambar kedalaman mentah terbaru. Tidak semua piksel gambar yang ditampilkan melalui Raw Depth API akan berisi data kedalaman, dan tidak setiap bingkai ARCore akan berisi gambar kedalaman mentah baru. Untuk menentukan apakah gambar kedalaman mentah untuk frame saat ini masih baru, bandingkan stempel waktunya dengan stempel waktu gambar kedalaman mentah sebelumnya. Jika stempel waktunya berbeda, gambar kedalaman mentah didasarkan pada data kedalaman baru. Jika tidak, gambar kedalaman adalah proyeksi ulang dari data kedalaman sebelumnya.
Panggil frame.acquireRawDepthConfidenceImage()
untuk mendapatkan gambar keyakinan. Anda dapat menggunakan gambar tingkat keyakinan untuk memeriksa akurasi setiap piksel kedalaman mentah. Gambar keyakinan ditampilkan dalam format Y8. Setiap piksel adalah bilangan bulat 8-bit tanpa tanda tangan. 0
menunjukkan tingkat keyakinan paling rendah, sedangkan 255
menunjukkan tingkat keyakinan paling tinggi.
Java
// Use try-with-resources, so that images are released automatically. try ( // Depth image is in uint16, at GPU aspect ratio, in native orientation. Image rawDepth = frame.acquireRawDepthImage16Bits(); // Confidence image is in uint8, matching the depth image size. Image rawDepthConfidence = frame.acquireRawDepthConfidenceImage(); ) { // Compare timestamps to determine whether depth is is based on new // depth data, or is a reprojection based on device movement. boolean thisFrameHasNewDepthData = frame.getTimestamp() == rawDepth.getTimestamp(); if (thisFrameHasNewDepthData) { ByteBuffer depthData = rawDepth.getPlanes()[0].getBuffer(); ByteBuffer confidenceData = rawDepthConfidence.getPlanes()[0].getBuffer(); int width = rawDepth.getWidth(); int height = rawDepth.getHeight(); someReconstructionPipeline.integrateNewImage(depthData, confidenceData, width, height); } } catch (NotYetAvailableException e) { // Depth image is not (yet) available. }
Kotlin
try { // Depth image is in uint16, at GPU aspect ratio, in native orientation. frame.acquireRawDepthImage16Bits().use { rawDepth -> // Confidence image is in uint8, matching the depth image size. frame.acquireRawDepthConfidenceImage().use { rawDepthConfidence -> // Compare timestamps to determine whether depth is is based on new // depth data, or is a reprojection based on device movement. val thisFrameHasNewDepthData = frame.timestamp == rawDepth.timestamp if (thisFrameHasNewDepthData) { val depthData = rawDepth.planes[0].buffer val confidenceData = rawDepthConfidence.planes[0].buffer val width = rawDepth.width val height = rawDepth.height someReconstructionPipeline.integrateNewImage( depthData, confidenceData, width = width, height = height ) } } } } catch (e: NotYetAvailableException) { // Depth image is not (yet) available. }
Langkah selanjutnya
- Pelajari cara membangun aplikasi Anda sendiri dengan Raw Depth dengan membaca codelab Raw Depth.