Android NDK uygulamanızda Ham Derinlik 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.

int32_t is_depth_supported = 0;

// Check whether the user's device supports the Depth API.
ArSession_isDepthModeSupported(ar_session, AR_DEPTH_MODE_AUTOMATIC,
                               &is_depth_supported);
ArConfig* ar_config = NULL;
ArConfig_create(ar_session, &ar_config);
if (is_depth_supported) {
  ArConfig_setDepthMode(ar_session, ar_config, AR_DEPTH_MODE_AUTOMATIC);
}
CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS);
ArConfig_destroy(ar_config);

En yeni ham derinlik görüntüsünü edinin

En son ham derinlikli görüntüyü almak için ArFrame_acquireRawDepthImage16Bits() numaralı telefonu arayın.

int64_t previous_depth_image_timestamp_ns = -1;
int64_t depth_image_timestamp_ns;
ArImage* depth_image = NULL;

// Acquire the raw depth image for the current frame.
ArStatus acquire_image_status =
    ArFrame_acquireRawDepthImage16Bits(ar_session, ar_frame, &depth_image);

if (acquire_image_status == AR_SUCCESS) {
  // Optional: compare raw depth image timestamps. Use this check if your app
  // uses only new depth data.
  ArImage_getTimestamp(ar_session, depth_image, &depth_image_timestamp_ns);
  if (depth_image_timestamp_ns != previous_depth_image_timestamp_ns) {
    // Raw depth image is based on new depth data.
    previous_depth_image_timestamp_ns = depth_image_timestamp_ns;
    // …
  }
  // Release the acquired image.
  ArImage_release(depth_image);
}

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.

En son güven görüntüsünü edinin

Güven resmini almak için ArFrame_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.

// Acquire the raw depth confidence image.
ArImage* confidence_image = NULL;
ArStatus acquire_image_status = ArFrame_acquireRawDepthConfidenceImage(
    ar_session, ar_frame, &confidence_image);

if (acquire_image_status == AR_SUCCESS) {
  // …
  // Release the acquired image.
  ArImage_release(confidence_image);
}