Android uygulamanızda İşlenmemiş Derinlik ayarını kullanma

Ham Depth API, kamera görüntüleri için tam Depth API verilerinden daha yüksek doğruluk oranına sahip derinlik verileri sağlar ancak her pikseli her zaman kapsamaz. Ham derinlikli görüntüler ve eşleşen güven resimleri de daha ayrıntılı şekilde işlenebilir. Böylece uygulamalar, yalnızca kendi kullanım alanları için yeterli doğrulukta olan derinlik verilerini kullanabilir.

Cihaz uyumluluğu

Ham Derinlik, Depth API'yi destekleyen tüm cihazlarda kullanılabilir. Tam Depth API gibi ham Depth API de, uçuş süresi (ToF) sensörü gibi desteklenen bir donanım derinlik sensörü gerektirmez. Ancak hem Raw Depth API hem de Full Depth API, cihazlarda desteklenen tüm donanım sensörlerinden yararlanır.

Ham Depth API ile full Depth API karşılaştırması

Ham Depth API, daha yüksek doğrulukla derinlik tahminleri sağlar ancak ham derinlikli görüntüler, kamera görüntüsündeki tüm pikseller için derinlik tahminlerini içermeyebilir. Buna karşılık, full Depth API her piksel için tahmini derinlik sağlar ancak derinlik tahminlerinin yumuşatılması ve interpolasyonu nedeniyle piksel başına derinlik verilerinin doğruluğu daha düşük olabilir. Derinlikli görüntülerin biçimi ve boyutu her iki API'de de aynıdır. Yalnızca içerik farklıdır.

Aşağıdaki tabloda, mutfaktaki bir sandalye ve masa resmi kullanılarak Ham Depth API ile Full Depth API arasındaki farklar gösterilmektedir.

API İadeler Kamera resmi Derinlik resmi Güven resmi
Ham Depth API'sı
  • Kamera görüntüsündeki tüm pikseller yerine bazı pikseller için çok doğru bir derinlik tahmini içeren ham derinlik görüntüsü.
  • Her ham derinlikli resim pikseli için güven veren bir güven görüntüsü. Derinlik tahmini olmayan kamera görüntüsü piksellerinin güveni sıfırdır.
Full Depth API'sı
  • Tek bir "yumuşatılmış" derinlik tahmini içeren bir resim dosyasıdır.
  • Bu API ile güven resmi sağlanmadı.
Yok

Güven resimleri

Ham Depth API tarafından döndürülen güven görüntülerinin güvenirlik değeri daha yüksektir. Beyaz pikseller tam güveni, siyah pikseller ise güvenilirliği temsil eder. Genel olarak, kamera görüntüsünde daha fazla dokuya sahip olan bölgelerin (ör. ağaç) ham derinlik güveni, boş duvar gibi olmayan bölgelere göre daha yüksek olur. Dokusuz yüzeyler genellikle sıfır güvenir.

Hedef cihazda desteklenen bir donanım derinlik sensörü varsa, dokusuz yüzeylerde bile resmin kameraya yeterince yakın olan alanlarına duyulan güven daha yüksek olabilir.

İşlem maliyeti

Ham Depth API'nin işlem maliyeti, tam Depth API'nin işlem maliyetinin yaklaşık yarısıdır.

Kullanım alanları

Ham Depth API ile sahnedeki nesnelerin geometrisinin daha ayrıntılı bir şekilde gösterildiği derinlikli görüntüler elde edebilirsiniz. Ham derinlik verileri, geometriyi anlama görevleri için daha fazla derinlikte doğruluğun ve ayrıntının gerekli olduğu AR deneyimleri oluştururken faydalı olabilir. Bazı kullanım alanları şunlardır:

  • 3D rekonstrüksiyon
  • Ölçüm
  • Şekil algılama

Ön koşullar

Temel artırılmış gerçeklik kavramlarını anladığınızdan emin olun ve devam etmeden önce ARCore oturumunun nasıl yapılandırılacağı hakkında daha fazla bilgi edinin.

Derinliği etkinleştir

Yeni bir ARCore oturumunda, kullanıcının cihazının Derinliği destekleyip desteklemediğini kontrol edin. İşlem gücü kısıtlamaları nedeniyle ARCore uyumlu cihazların hepsi Depth API'yi desteklemez. Kaynaklardan tasarruf etmek için ARCore'da derinlik varsayılan olarak devre dışıdır. Uygulamanızın Depth API'yi kullanması için derinlik modunu etkinleştirin.

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 })
}

En yeni ham derinlik ve güven görüntülerini edinin

En son ham derinlikli görüntüyü almak için frame.acquireRawDepthImage16Bits() numaralı telefonu arayın. Ham Depth API aracılığıyla döndürülen bazı görüntü pikselleri derinlik verisi içermez ve her ARCore çerçevesi yeni bir ham derinlik görüntüsü içermez. Geçerli karenin ham derinlik görüntüsünün yeni olup olmadığını belirlemek için zaman damgasını önceki ham derinlik görüntüsünün zaman damgasıyla karşılaştırın. Zaman damgaları farklıysa ham derinlik görüntüsü, yeni derinlik verilerini temel alır. Aksi takdirde, derinlik görüntüsü, önceki derinlik verilerinin yeniden projeksiyonudur.

Güven resmini almak için frame.acquireRawDepthConfidenceImage() numaralı telefonu arayın. Her bir ham derinlik pikselinin doğruluğunu kontrol etmek için güven resmini kullanabilirsiniz. Güven resimleri Y8 biçiminde döndürülür. Her piksel 8 bitlik imzasız bir tam sayıdır. 0 en düşük güveni, 255 ise en yüksek güveni gösterir.

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.
}

Sırada ne var?