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