راهنمای برنامه‌نویس تصاویر افزوده شده برای 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);

فایل های پایگاه داده را می توان با ابزار Image یا با فراخوانی 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 از نقاط ویژگی تصویر دوربین برای مطابقت با موارد موجود در پایگاه داده تصویر استفاده می کند.

تصاویر افزوده شده را در یک جلسه 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