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

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