Android NDK-এর জন্য অগমেন্টেড ইমেজ ডেভেলপার গাইড

আপনার নিজের অ্যাপে কিভাবে অগমেন্টেড ইমেজ ব্যবহার করবেন তা শিখুন।

পূর্বশর্ত

এগিয়ে যাওয়ার আগে নিশ্চিত করুন যে আপনি মৌলিক AR ধারণা এবং কীভাবে একটি 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 namespace-এ ফাংশনের জন্য 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 ক্যামেরা ইমেজ থেকে ফিচার পয়েন্ট ব্যবহার করে ইমেজ ডাটাবেসের সাথে মেলে।

একটি AR সেশনে বর্ধিত চিত্রগুলি খুঁজুন

মিলে যাওয়া ছবি পেতে, আপনার ফ্রেম আপডেট লুপে আপডেট করা 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