Menggunakan Raw Depth di aplikasi Android

Raw Depth API menyediakan data kedalaman untuk gambar kamera yang memiliki akurasi lebih tinggi daripada data Depth API penuh, tetapi tidak selalu mencakup setiap piksel. Gambar kedalaman mentah, beserta gambar keyakinan pencocokannya, juga dapat diproses lebih lanjut, sehingga aplikasi dapat hanya menggunakan data kedalaman yang memiliki akurasi yang cukup untuk setiap kasus penggunaannya.

Kompatibilitas perangkat

Raw Depth tersedia di semua perangkat yang mendukung Depth API. Raw Depth API, seperti Depth API penuh, tidak memerlukan sensor kedalaman hardware yang didukung, seperti sensor waktu penerbangan (ToF). Namun, baik Raw Depth API maupun Depth API penuh menggunakan sensor hardware yang didukung yang mungkin dimiliki perangkat.

Raw Depth API vs Depth API penuh

Raw Depth API memberikan perkiraan kedalaman dengan akurasi yang lebih tinggi, tetapi gambar kedalaman mentah mungkin tidak menyertakan perkiraan kedalaman untuk semua piksel pada gambar kamera. Sebaliknya, Depth API penuh memberikan perkiraan kedalaman untuk setiap piksel, tetapi data kedalaman per piksel mungkin kurang akurat karena penghalusan dan interpolasi estimasi kedalaman. Format dan ukuran depth image sama di kedua API. Hanya kontennya yang berbeda.

Tabel berikut mengilustrasikan perbedaan antara Raw Depth API dan Depth API penuh menggunakan gambar kursi dan meja di dapur.

API Hasil Gambar kamera Gambar kedalaman Gambar keyakinan
Raw Depth API
  • Gambar kedalaman mentah yang berisi perkiraan kedalaman yang sangat akurat untuk sebagian, tetapi tidak semua, piksel dalam gambar kamera.
  • Gambar keyakinan yang memberikan keyakinan untuk setiap piksel gambar kedalaman mentah. Piksel gambar kamera yang tidak memiliki perkiraan kedalaman memiliki keyakinan nol.
API Kedalaman Penuh
  • Satu gambar kedalaman "dihaluskan" yang berisi perkiraan kedalaman untuk setiap piksel.
  • Tidak ada gambar keyakinan yang disediakan dengan API ini.
T/A

Gambar keyakinan

Dalam gambar keyakinan yang ditampilkan oleh Raw Depth API, piksel yang lebih terang memiliki nilai keyakinan lebih tinggi, dengan piksel putih mewakili keyakinan penuh dan piksel hitam menunjukkan tidak yakin. Secara umum, area dalam gambar kamera yang memiliki lebih banyak tekstur, seperti hierarki, akan memiliki keyakinan kedalaman mentah yang lebih tinggi daripada wilayah yang tidak memiliki tekstur, seperti dinding kosong. Permukaan tanpa tekstur biasanya menghasilkan keyakinan nol.

Jika perangkat target memiliki sensor kedalaman hardware yang didukung, tingkat keyakinan pada 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 bisa memperoleh gambar kedalaman yang memberikan representasi geometri objek yang lebih mendetail di adegan. Data kedalaman mentah dapat berguna saat membuat pengalaman AR yang memerlukan peningkatan akurasi dan detail untuk tugas memahami geometri. Beberapa kasus penggunaan mencakup:

  • Rekonstruksi 3D
  • Pengukuran
  • Deteksi bentuk

Prasyarat

Pastikan Anda memahami konsep AR dasar dan cara mengonfigurasi sesi ARCore sebelum melanjutkan.

Aktifkan Kedalaman

Di sesi ARCore baru, periksa apakah perangkat pengguna mendukung Depth. Tidak semua perangkat yang kompatibel dengan ARCore mendukung Depth API karena keterbatasan daya pemrosesan. Untuk menghemat resource, depth 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 kedalaman dan keyakinan mentah terbaru

Panggil frame.acquireRawDepthImage16Bits() untuk mendapatkan 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 bingkai saat ini baru, bandingkan stempel waktu dengan stempel waktu gambar kedalaman mentah sebelumnya. Jika stempel waktu berbeda, gambar kedalaman mentah akan 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 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 yang 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