دليل المطوّر حول الصور المعزّزة لنظام التشغيل Android NDK

تعرَّف على كيفية استخدام ميزة "الصور المعزَّزة" في تطبيقاتك.

المتطلبات الأساسية

احرص على فهم مفاهيم الواقع المعزّز الأساسية. وكيفية ضبط جلسة ARCore قبل المتابعة.

إنشاء قاعدة بيانات للصور

إنشاء ArAugmentedImageDatabase لتخزين الصور المرجعية هناك طريقتان:

  • إنشاء قاعدة بيانات فارغة
ArAugmentedImageDatabase* ar_augmented_image_database = NULL;
ArAugmentedImageDatabase_create(ar_session, &ar_augmented_image_database);
  • القراءة من ملف قاعدة بيانات الصور يُرجى الرجوع إلى [AugmentedImage C sample app] للغة util::LoadFileFromAssetManager.
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() كما هو موضّح أدناه. راجِع augmented_image_c نموذج التطبيق للتعرّف على الدوال في مساحة الاسم util.

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