Android एनडीके के लिए ऑगमेंटेड इमेज डेवलपर गाइड

अपने ऐप्लिकेशन में ऑगमेंटेड इमेज को इस्तेमाल करने का तरीका जानें.

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

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

इमेज डेटाबेस बनाना

रेफ़रंस इमेज को सेव करने के लिए, ArAugmentedImageDatabase बनाएं. इसके दो तरीके हैं:

  • खाली डेटाबेस बनाना
ArAugmentedImageDatabase* ar_augmented_image_database = NULL;
ArAugmentedImageDatabase_create(ar_session, &ar_augmented_image_database);
  • किसी इमेज डेटाबेस फ़ाइल से पढ़ें. util::LoadFileFromAssetManager के लिए, [AugmentedImage C sample app] देखें.
std::string database_buffer;
util::LoadFileFromAssetManager(asset_manager_, "sample_database.imgdb",
                               &database_buffer);
uint8_t* raw_buffer = reinterpret_cast<uint8_t*>(&database_buffer.front());

ArAugmentedImageDatabase* ar_augmented_image_database = NULL;
const ArStatus status = ArAugmentedImageDatabase_deserialize(
    ar_session, raw_buffer, database_buffer.size(),
    &ar_augmented_image_database);

डेटाबेस फ़ाइलें या तो इमेज टूल का इस्तेमाल करके या ArAugmentedImageDatabase_serialize() को कॉल करके बनाई जा सकती हैं.

डेटाबेस में इमेज जोड़ें

अगर आपकी मनचाही रेफ़रंस इमेज डेटाबेस फ़ाइल से पहले ही लोड की जा चुकी हैं, तो यह चरण ज़रूरी नहीं है. रनटाइम के दौरान इमेज जोड़ने के लिए, ArAugmentedImageDatabase_addImage() को नीचे बताए गए तरीके से कॉल करें. util नेमस्पेस में मौजूद फ़ंक्शन के बारे में जानने के लिए, augmented_image_c सैंपल ऐप्लिकेशन देखें.

int32_t width, height, stride, index;
uint8_t* image_pixel_buffer = nullptr;
constexpr const char kSampleImageName[] = "default.jpg";
bool load_image_result = util::LoadImageFromAssetManager(
    kSampleImageName, &width, &height, &stride, &image_pixel_buffer);

uint8_t* grayscale_buffer = nullptr;
util::ConvertRgbaToGrayscale(image_pixel_buffer, width, height, stride,
                             &grayscale_buffer);

int32_t grayscale_stride = stride / 4;
const ArStatus status = ArAugmentedImageDatabase_addImage(
    ar_session_, ar_augmented_image_database, kSampleImageName,
    grayscale_buffer, width, height, grayscale_stride, &index);

// If the physical size of the image is known, you can instead use
//     ArStatus ArAugmentedImageDatabase_addImageWithPhysicalSize
// This will improve the initial detection speed. ARCore will still actively
// estimate the physical size of the image as it is viewed from multiple
// viewpoints.

delete[] image_pixel_buffer;
delete[] grayscale_buffer;

index और name वैल्यू का इस्तेमाल, बाद में यह पता लगाने के लिए किया जाता है कि कौनसी पहचान इमेज मिली है.

इमेज ट्रैकिंग चालू करें

इमेज डेटाबेस रजिस्टर करके, इमेज ट्रैक करने के लिए अपने ARCore सेशन को कॉन्फ़िगर करें:

ArConfig_setAugmentedImageDatabase(ar_session_, ar_config,
                                   ar_augmented_image_database);
const ArStatus status = ArSession_configure(ar_session_, ar_config);

सेशन के दौरान ARCore, कैमरा इमेज के फ़ीचर पॉइंट का इस्तेमाल करता है, ताकि उन्हें इमेज डेटाबेस में मौजूद सुविधाओं से मैच किया जा सके.

एआर सेशन में ऑगमेंटेड इमेज ढूंढना

मिलती-जुलती इमेज पाने के लिए, अपने फ़्रेम अपडेट लूप में, अपडेट किए गए ArAugmentedImage के लिए पोल करें.

// Update loop, in onDrawFrame
ArTrackableList* updated_image_list = nullptr;
ArTrackableList_create(ar_session_, &updated_image_list);
ArFrame_getUpdatedTrackables(
    ar_session_, ar_frame_, AR_TRACKABLE_AUGMENTED_IMAGE, updated_image_list);

int32_t image_list_size;
ArTrackableList_getSize(ar_session_, updated_image_list, &image_list_size);

for (int i = 0; i < image_list_size; ++i) {
  ArTrackable* ar_trackable = nullptr;
  ArTrackableList_acquireItem(ar_session_, updated_image_list, i,
                              &ar_trackable);
  ArAugmentedImage* image = ArAsAugmentedImage(ar_trackable);

  ArTrackingState tracking_state;
  ArTrackable_getTrackingState(ar_session_, ar_trackable, &tracking_state);

  int image_index;
  ArAugmentedImage_getIndex(ar_session_, image, &image_index);

  if (tracking_state == AR_TRACKING_STATE_TRACKING) {
    util::ScopedArPose scopedArPose(ar_session_);
    ArAugmentedImage_getCenterPose(ar_session_, image,
                                   scopedArPose.GetArPose());

    ArAnchor* image_anchor = nullptr;
    const ArStatus status = ArTrackable_acquireNewAnchor(
        ar_session_, ar_trackable, scopedArPose.GetArPose(), &image_anchor);

    // For example, you can now render content at the image anchor, choosing
    // content based on the image index (or name).
  }
}

इस्तेमाल के अलग-अलग उदाहरणों के साथ

जब ARCore को किसी ऑगमेंटेड इमेज का पता चलता है, तो यह उसके लिए Trackable बनाता है ऑगमेंटेड इमेज और सेट ArTrackingState TRACKING तक और ArAugmentedImageTrackingMethod से FULL_TRACKING तक. ट्रैक की गई इमेज कब कैमरा व्यू से बाहर निकल जाता है, ARCore काम करना जारी रखता है ArTrackingState से TRACKING, लेकिन ArAugmentedImageTrackingMethod को बदल देता है स्क्रीन की दिशा और स्थिति देते हुए, LAST_KNOWN_POSE तक इमेज को हाइलाइट करें.

आपके ऐप्लिकेशन को उसके इस्तेमाल के मुताबिक, ट्रैकिंग की स्थिति और ट्रैकिंग के तरीके का अलग-अलग तरीके से इस्तेमाल करना चाहिए केस.

  • फ़िक्स्ड इमेज. इस्तेमाल के ज़्यादातर उदाहरण, जिनमें ऐसी इमेज शामिल हैं जो एक जगह पर ही मौजूद हैं (यानी, चलने की उम्मीद नहीं है) ArTrackingState का इस्तेमाल करके यह तय कर सकती है कि क्या इमेज का पता लगा लिया गया है और क्या उसकी जगह पता है. ArAugmentedImageTrackingMethod को अनदेखा किया जा सकता है.

  • इमेज को एक जगह से दूसरी जगह ले जाना. अगर आपके ऐप्लिकेशन को किसी चलती हुई इमेज को ट्रैक करना है, तो दोनों का इस्तेमाल करें ArTrackingState और ArAugmentedImageTrackingMethod पता लगाने के लिए कि इमेज को पता लगाया गया है और क्या उसकी स्थिति पता है.

इस्तेमाल का उदाहरण फ़िक्स्ड इमेज इमेज को एक जगह से दूसरी जगह ले जाया जा रहा है
उदाहरण दीवार पर लटका हुआ पोस्टर बस के बगल में दिख रहा विज्ञापन
पोज़
हो सकता है मान्य तब माना जाता है, जब
ArTrackingState == TRACKING ArTrackingState == TRACKING अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
और
ArAugmentedImageTrackingMethod == FULL_TRACKING