Android NDK の拡張イメージ デベロッパー ガイド

ご自身のアプリで拡張画像を使用する方法をご覧ください。

前提条件

続行する前に、AR の基本的なコンセプトARCore セッションを構成する方法を理解しておいてください。

画像データベースを作成する

参照画像を保存するための ArAugmentedImageDatabase を作成します。コピーするには次の 2 通りの方法があります。

  • 空のデータベースを作成する
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 Tool を使用するか、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;

indexname の値は、検出された参照画像を識別するために後で使用されます。

画像トラッキングを有効にする

画像データベースを登録して画像を追跡するように 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 を作成し、ArTrackingStateTRACKING に、ArAugmentedImageTrackingMethodFULL_TRACKING に設定します。トラッキングされた画像がカメラビューから出ると、ARCore は引き続き ArTrackingStateTRACKING に設定しますが、画像の向きと位置は指定し続けながら、ArAugmentedImageTrackingMethodLAST_KNOWN_POSE に変更します。

トラッキング ステータスとトラッキング方法は、使用目的に応じて異なる方法でアプリで使用する必要があります。

  • 固定画像。所定の位置に固定されている(つまり移動するはずではない)画像に関するほとんどのユースケースでは、ArTrackingState を使用するだけで、画像が検出されたかどうかと、位置が判明しているかどうかを判定できます。ArAugmentedImageTrackingMethod は無視して構いません。

  • 動画。アプリで動画をトラッキングする必要がある場合は、ArTrackingStateArAugmentedImageTrackingMethod の両方を使用して、画像が検出されたかどうかと、その位置がわかっているかどうかを確認します。

使用例 固定された画像 画像を移動しています
壁に掛けられたポスター バスの車体の横に表示される広告
このポーズは、
ArTrackingState == TRACKING ArTrackingState == TRACKING
および
ArAugmentedImageTrackingMethod == FULL_TRACKING