درک محیط کاربر در Android NDK (C)

یاد بگیرید که چگونه از Scene Semantics API در برنامه های خود استفاده کنید.

Scene Semantics API به توسعه دهندگان این امکان را می دهد که صحنه اطراف کاربر را با ارائه اطلاعات معنایی زمان واقعی مبتنی بر مدل ML درک کنند. با توجه به تصویری از یک صحنه در فضای باز، API یک برچسب برای هر پیکسل در مجموعه ای از کلاس های معنایی مفید، مانند آسمان، ساختمان، درخت، جاده، پیاده رو، وسیله نقلیه، شخص و موارد دیگر برمی گرداند. علاوه بر برچسب‌های پیکسل، Scene Semantics API همچنین مقادیر اطمینان را برای هر برچسب پیکسل و روشی آسان برای پرس و جو در مورد شیوع یک برچسب معین در یک صحنه در فضای باز ارائه می‌دهد.

از چپ به راست، نمونه‌هایی از یک تصویر ورودی، تصویر معنایی برچسب‌های پیکسل و تصویر اطمینان مربوطه:

نمونه ای از تصویر ورودی، تصویر معنایی و تصویر اطمینان معنایی.

پیش نیازها

قبل از ادامه، مطمئن شوید که مفاهیم اساسی AR و نحوه پیکربندی یک جلسه ARCore را درک کرده اید.

Scene Semantics را فعال کنید

در جلسه ARCore جدید ، بررسی کنید که آیا دستگاه کاربر از Scene Semantics API پشتیبانی می‌کند یا خیر. همه دستگاه‌های سازگار با ARCore از Scene Semantics API به دلیل محدودیت‌های قدرت پردازش پشتیبانی نمی‌کنند.

برای ذخیره منابع، Scene Semantics به طور پیش فرض در ARCore غیرفعال است. حالت معنایی را فعال کنید تا برنامه شما از Scene Semantics API استفاده کند.

// 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);

تصویر معنایی را بدست آورید

هنگامی که Semantics صحنه فعال شد، تصویر معنایی را می توان بازیابی کرد. تصویر معنایی یک تصویر AR_IMAGE_FORMAT_Y8 است، که در آن هر پیکسل مربوط به یک برچسب معنایی تعریف شده توسط ArSemanticLabel است.

برای بدست آوردن تصویر معنایی ArFrame_acquireSemanticImage() استفاده کنید:

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

تصاویر معنایی خروجی باید پس از حدود 1-3 فریم از شروع جلسه بسته به دستگاه در دسترس باشند.

تصویر اعتماد به نفس را بدست آورید

علاوه بر تصویر معنایی، که یک برچسب برای هر پیکسل ارائه می کند، API همچنین یک تصویر اطمینان از مقادیر اطمینان پیکسل مربوطه ارائه می دهد. تصویر اطمینان یک تصویر AR_IMAGE_FORMAT_Y8 است، که در آن هر پیکسل با مقداری در محدوده [0, 255] مطابقت دارد که مربوط به احتمال مرتبط با برچسب معنایی برای هر پیکسل است.

از ArFrame_acquireSemanticConfidenceImage() برای بدست آوردن تصویر اطمینان معنایی استفاده کنید:

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

تصاویر اطمینان خروجی باید پس از حدود 1-3 فریم از شروع جلسه بسته به دستگاه در دسترس باشند.

کسری از پیکسل ها را برای یک برچسب معنایی پرس و جو کنید

همچنین می‌توانید کسری از پیکسل‌ها را در فریم فعلی که به یک کلاس خاص، مانند آسمان تعلق دارند، پرس و جو کنید. این پرس و جو کارآمدتر از برگرداندن تصویر معنایی و انجام جستجوی پیکسلی برای یک برچسب خاص است. کسر برگشتی یک مقدار شناور در محدوده [0.0, 1.0] است.

از ArFrame_getSemanticLabelFraction() برای بدست آوردن کسری برای یک برچسب معین استفاده کنید:

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