ご自身のアプリで拡張画像を使用する方法をご覧ください。
前提条件
続行する前に、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;
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
|