فهم بيئة المستخدم على Android NDK (C)

تعرّف على كيفية استخدام Scene Semantics API في تطبيقاتك الخاصة.

تتيح Scene Semantics API للمطوّرين فهم المشهد المحيط بالمستخدم من خلال توفير معلومات دلالية في الوقت الفعلي مستندة إلى نموذج تعلُّم الآلة. عند توفّر صورة لمشهد خارجي، تعرض واجهة برمجة التطبيقات تصنيفًا لكل وحدة بكسل على مستوى مجموعة من الفئات الدلالية المفيدة، مثل السماء والمبنى والشجرة والطريق والرصيف والمركبة والشخص والمزيد. بالإضافة إلى تصنيفات وحدات البكسل، توفر واجهة برمجة التطبيقات Scene Semantics API أيضًا قيم ثقة لكل تصنيف بكسل وطريقة سهلة الاستخدام للاستعلام عن انتشار تسمية معينة في مشهد خارجي.

من اليسار إلى اليمين، أمثلة لصورة إدخال، والصورة الدلالية لتصنيفات البكسل، وصورة الثقة المقابلة لها:

مثال على صورة الإدخال والصورة الدلالية وصورة الثقة الدلالية

المتطلبات الأساسية

قبل المتابعة، تأكد من فهم مفاهيم الواقع المعزّز الأساسية وكيفية ضبط جلسة ARCore.

تفعيل دلالات المشهد

في جلسة ARCore جديدة، تحقَّق مما إذا كان جهاز المستخدم متوافقًا مع Scene Semantics API. لا تتوافق بعض الأجهزة المتوافقة مع ARCore مع Scene Semantics API بسبب قيود معالجة البيانات.

لحفظ الموارد، يتم إيقاف Scene Semantics تلقائيًا على ARCore. يمكنك تفعيل الوضع الدلالي لكي يستخدم تطبيقك واجهة برمجة تطبيقات Scene Semantics.

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

الحصول على الصورة الدلالية

بعد تمكين "Sene 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 لقطات من بداية الجلسة، حسب الجهاز.

الحصول على صورة الثقة

بالإضافة إلى الصورة الدلالية التي توفّر تصنيفًا لكل بكسل، توفّر واجهة برمجة التطبيقات أيضًا صورة ثقة لقيم ثقة وحدات البكسل المقابلة. صورة الثقة هي صورة 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.

يجب أن تتوفّر صور ثقة في الإخراج بعد إطار واحد إلى 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.
}