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

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

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

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

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

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

  • खाली डेटाबेस बनाना
ArAugmentedImageDatabase* ar_augmented_image_database = NULL;
ArAugmentedImageDatabase_create(ar_session, &ar_augmented_image_database);
  • किसी इमेज डेटाबेस फ़ाइल से पढ़ें. util::LoadFileFromAssetManager के लिए, [AugmentedImage C सैंपल ऐप्लिकेशन] देखें.
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