Android NDK'da (C) kullanıcının ortamını anlama

Scene Semantics API'yi kendi uygulamalarınızda nasıl kullanacağınızı öğrenin.

Scene Semantics API, ML modeline dayalı, gerçek zamanlı semantik bilgiler sağlayarak geliştiricilerin kullanıcının etrafındaki sahneyi anlamasını sağlar. Bir dış mekan sahnesinin görüntüsü sayesinde API, gökyüzü, bina, ağaç, yol, kaldırım, araç, kişi ve diğer pek çok kullanışlı semantik sınıfta her piksel için bir etiket döndürür. Scene Semantics API, piksel etiketlerine ek olarak, her piksel etiketi için güven değerleri ve açık hava sahnesinde belirli bir etiketin yaygınlığını sorgulamak için kullanımı kolay bir yol sunar.

Soldan sağa, giriş resmi, piksel etiketlerinin anlamsal resmi ve karşılık gelen güven resmi örnekleri:

Giriş resmi, anlamsal resim ve anlamsal güven resmi örneği.

Ön koşullar

Devam etmeden önce temel AR kavramlarını ve ARCore oturumunu nasıl yapılandıracağınızı anladığınızdan emin olun.

Sahne Semantiğini Etkinleştir

Yeni bir ARCore oturumunda, kullanıcının cihazının Scene Semantics API'yi destekleyip desteklemediğini kontrol edin. ARCore uyumlu cihazların tümü, işlem gücü kısıtlamaları nedeniyle Scene Semantics API'yi desteklemez.

Kaynakları kaydetmek için Scene Semantics, ARCore'da varsayılan olarak devre dışıdır. Uygulamanızın Scene Semantics API'yi kullanması için semantik modu etkinleştirin.

// Check whether the user's device supports the Scene Semantics API.
int32_t is_scene_semantics_supported = 0;
ArSession_isSemanticModeSupported(ar_session, AR_SEMANTIC_MODE_ENABLED, &is_scene_semantics_supported);

// Configure the session for AR_SEMANTIC_MODEL_ENABLED.
ArConfig* ar_config = NULL;
ArConfig_create(ar_session, &ar_config);
if (is_scene_semantics_supported) {
  ArConfig_setSemanticMode(ar_session, ar_config, AR_SEMANTIC_MODE_ENABLED);
}
CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS);
ArConfig_destroy(ar_config);

Anlamsal resmi edinin

Scene Semantics etkinleştirildiğinde semantik resim alınabilir. Anlamsal resim bir AR_IMAGE_FORMAT_Y8 resmidir. Burada her piksel ArSemanticLabel tarafından tanımlanan anlamsal bir etikete karşılık gelir.

Anlamsal resmi edinmek için ArFrame_acquireSemanticImage() değerini kullanın:

// Retrieve the semantic image for the current frame, if available.
ArImage* semantic_image = NULL;
if (ArFrame_acquireSemanticImage(ar_session, ar_frame, &semantic_image) != AR_SUCCESS) {
  // No semantic image retrieved for this frame.
  // The output image may be missing for the first couple frames before the model has had a chance to run yet.
  return;
}
// If a semantic image is available, use it here.

Anlamsal çıkış resimleri, cihaza bağlı olarak oturumun başlangıcından itibaren yaklaşık 1-3 kareden sonra kullanılabilir.

Güven resmini elde edin

Her piksel için bir etiket sağlayan semantik resme ek olarak, API aynı zamanda karşılık gelen piksel güven değerlerinin bir güven görüntüsü de sağlar. Güven resmi bir AR_IMAGE_FORMAT_Y8 resmidir. Burada her piksel, [0, 255] aralığındaki bir değere ve her piksel için anlamsal etiketiyle ilişkili olasılığa karşılık gelir.

Anlamsal güven görüntüsünü edinmek için ArFrame_acquireSemanticConfidenceImage() değerini kullanın:

// Retrieve the semantic confidence image for the current frame, if available.
ArImage* semantic_confidence_image = NULL;
if (ArFrame_acquireSemanticConfidenceImage(ar_session, ar_frame, &semantic_confidence_image) != AR_SUCCESS) {
  // No semantic confidence image retrieved for this frame.
  // The output image may be missing for the first couple frames before the model has had a chance to run yet.
  return;
}
// If a semantic confidence image is available, use it here.

Çıkış güveni görüntüleri, cihaza bağlı olarak, oturumun başlangıcından itibaren yaklaşık 1-3 kareden sonra kullanılabilir olmalıdır.

Anlamsal bir etiket için piksel oranını sorgulama

Geçerli karede gökyüzü gibi belirli bir sınıfa ait piksellerin oranını da sorgulayabilirsiniz. Bu sorgu, anlamsal resmi döndürmek ve belirli bir etiket için piksel düzeyinde arama yapmaktan daha etkilidir. Döndürülen kesir, [0.0, 1.0] aralığındaki bir ondalık değerdir.

Belirli bir etiketin kesirini almak için ArFrame_getSemanticLabelFraction() değerini kullanın:

// Retrieve the fraction of pixels for the semantic label sky in the current frame.
float out_fraction = 0.0f;
if (ArFrame_getSemanticLabelFraction(ar_session, ar_frame, AR_SEMANTIC_LABEL_SKY, &out_fraction) != AR_SUCCESS) {
  // No fraction of semantic labels was retrieved for this frame.
}