Android NDK (C) पर उपयोगकर्ताओं के एनवायरमेंट को समझना

अपने ऐप्लिकेशन में Scene Semantics API का इस्तेमाल करने का तरीका जानें.

सीन सिमैंटिक एपीआई की मदद से डेवलपर, उपयोगकर्ता के आस-पास के माहौल को समझ पाते हैं. इसके लिए, उन्हें मशीन लर्निंग मॉडल पर आधारित रीयल-टाइम सिमैंटिक जानकारी दी जाती है. किसी आउटडोर सीन की इमेज देने पर, एपीआई हर पिक्सल के लिए एक लेबल दिखाता है. यह लेबल, काम की सेमैटिक क्लास के सेट में होता है. जैसे, आसमान, इमारत, पेड़, सड़क, फ़ुटपाथ, वाहन, व्यक्ति वगैरह. पिक्सल लेबल के अलावा, सीन सेमेटिक्स एपीआई हर पिक्सल लेबल के लिए कॉन्फ़िडेंस वैल्यू भी देता है. साथ ही, किसी लेबल के आउटडोर सीन में मौजूद होने की जानकारी पाने के लिए, आसानी से इस्तेमाल किया जा सकने वाला तरीका भी देता है.

बाईं से दाईं ओर, इनपुट इमेज के उदाहरण, पिक्सल लेबल की सिमैंटिक इमेज, और उससे जुड़ी कॉन्फ़िडेंस इमेज:

इनपुट इमेज, सिमेंटिक इमेज, और सिमेंटिक कॉन्फ़िडेंस इमेज का उदाहरण.

ज़रूरी शर्तें

आगे बढ़ने से पहले, पक्का करें कि आपने एआर के बुनियादी सिद्धांतों और ARCore सेशन को कॉन्फ़िगर करने का तरीका समझ लिया हो.

सीन सेमेटिक्स की सुविधा चालू करना

नए ARCore सेशन में, यह देखें कि उपयोगकर्ता के डिवाइस पर सीन सिमैंटिक एपीआई काम करता है या नहीं. प्रोसेसिंग पावर की कमी की वजह से, ARCore के साथ काम करने वाले सभी डिवाइस, सीन सिमैंटिक एपीआई के साथ काम नहीं करते हैं.

संसाधनों को सेव करने के लिए, ARCore पर सीन सिमैंटिक्स की सुविधा डिफ़ॉल्ट रूप से बंद रहती है. अपने ऐप्लिकेशन में सीन सिमैंटिक एपीआई का इस्तेमाल करने के लिए, सिमैंटिक मोड चालू करें.

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

सेशन शुरू होने के एक से तीन फ़्रेम के बाद, सेमैनटिक इमेज दिखनी चाहिए. हालांकि, यह डिवाइस पर निर्भर करता है.

कॉन्फ़िडेंस इमेज पाना

हर पिक्सल के लिए एक लेबल देने वाली सिमैंटिक इमेज के अलावा, यह एपीआई हर पिक्सल के लिए कॉन्फ़िडेंस वैल्यू की कॉन्फ़िडेंस इमेज भी उपलब्ध कराता है. कॉन्फ़िडेंस इमेज एक 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.
}