فهم بيئة المستخدم على 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 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);

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

بعد تفعيل ميزة "دلالات المشهد"، يمكن استرداد الصورة الدلالية. الصورة الدلالية هي صورة 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.

من المفترض أن تظهر صور الثقة في الإخراج بعد مرور إطار واحد أو ثلاثة إطارات تقريبًا من بدء الجلسة، وذلك حسب الجهاز.

طلب نسبة البكسلات لتصنيف دلالي

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