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, makine öğrenimi modeline dayalı, gerçek zamanlı semantik bilgiler sağlayarak geliştiricilerin kullanıcıyı çevreleyen ortamı anlamalarını sağlar. Bir dış mekan sahnesinin resmi dikkate alındığında API, gökyüzü, bina, ağaç, yol, kaldırım, araç, kişi ve diğer yararlı anlamsal sınıflarda 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 belirli bir etiketin dış mekan sahnesindeki yaygınlığını sorgulamak için kolay bir yol sunar.

Soldan sağa, bir giriş resmi örnekleri, piksel etiketlerinin anlamsal resmi ve ilgili güven resmi:

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

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

Sahne Anlamını Etkinleştir

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

Kaynakları kaydetmek için ARCore'da Sahne Semantiği varsayılan olarak devre dışıdır. Uygulamanızın Scene Semantics API'yi kullanmasını sağlamak için semantik modunu 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 görüntü edinme

Sahne Semantiği etkinleştirildiğinde anlamsal resim alınabilir. Anlamsal resim, her pikselin ArSemanticLabel ile tanımlanan anlamsal bir etikete karşılık geldiği bir AR_IMAGE_FORMAT_Y8 resmidir.

Anlamsal resmi edinmek için ArFrame_acquireSemanticImage() simgesini 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.

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

Güven görüntüsünü elde etme

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

Anlamsal güven görüntüsünü elde etmek için ArFrame_acquireSemanticConfidenceImage() simgesini 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üven resimleri, cihaza bağlı olarak oturumun başlangıcından itibaren yaklaşık 1-3 kare sonra kullanılabilir olmalıdır.

Anlamsal etiket için piksellerin oranını sorgulama

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

Belirli bir etiketin kesirini öğrenmek için ArFrame_getSemanticLabelFraction() işlevini 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.
}