Dowiedz się, jak używać obrazów rozszerzonych w swoich aplikacjach.
Wymagania wstępne
Zanim przejdziesz dalej, upewnij się, że znasz podstawowe pojęcia związane z AR i wiesz, jak skonfigurować sesję ARCore.
Tworzenie bazy danych obrazów
Utwórz ArAugmentedImageDatabase
do przechowywania obrazów referencyjnych. Możesz to zrobić na 2 sposoby:
- Utwórz pustą bazę danych
ArAugmentedImageDatabase* ar_augmented_image_database = NULL; ArAugmentedImageDatabase_create(ar_session, &ar_augmented_image_database);
- Odczyt z pliku bazy danych obrazów. Zapoznaj się z [przykładową aplikacją C AugmentedImage dla
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);
Pliki bazy danych można tworzyć za pomocą narzędzia do obrazów lub wywołania ArAugmentedImageDatabase_serialize()
.
Dodaj obrazy do bazy danych
Ten krok jest opcjonalny, jeśli żądane obrazy referencyjne zostały już załadowane z pliku bazy danych. Aby dodać obraz w czasie działania, wywołaj ArAugmentedImageDatabase_addImage()
, jak pokazano poniżej. Więcej informacji o funkcjach w przestrzeni nazw util
znajdziesz w przykładowej aplikacji 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;
Wartości index
i name
są używane później do określenia, który obraz referencyjny został wykryty.
Włącz śledzenie obrazów
Skonfiguruj sesję ARCore tak, aby śledziła obrazy, rejestrując bazę danych obrazów:
ArConfig_setAugmentedImageDatabase(ar_session_, ar_config, ar_augmented_image_database); const ArStatus status = ArSession_configure(ar_session_, ar_config);
Podczas sesji ARCore używa punktów cech z obrazu z aparatu, aby dopasowywać je do tych w bazie danych obrazów.
Znajdowanie rozszerzonych obrazów podczas sesji AR
Aby uzyskać dopasowane obrazy, przeprowadź ankietę dotyczącą zaktualizowanych elementów ArAugmentedImage
w pętli aktualizacji ramki.
// 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). } }
Obsługiwanie różnych przypadków użycia
Gdy ARCore wykryje obraz rozszerzone, tworzy dla niego Trackable
i ustawia ArTrackingState
na TRACKING
oraz ArAugmentedImageTrackingMethod
na FULL_TRACKING
. Gdy śledzony obraz zniknie z widoku aparatu, ARCore wciąż ustawia wartość ArTrackingState
na TRACKING
, ale zmienia wartość ArAugmentedImageTrackingMethod
na LAST_KNOWN_POSE
przy zachowaniu orientacji i położenia obrazu.
Aplikacja powinna w różny sposób korzystać ze stanu i metody śledzenia w zależności od jej zastosowania.
Stałe obrazy. W większości przypadków użycia obejmujących obrazy, które są stałe (czyli nie powinny się przesuwać), można po prostu użyć atrybutu
ArTrackingState
, aby określić, czy obraz został wykryty i czy jest znana jego lokalizacja. ElementArAugmentedImageTrackingMethod
można zignorować.Ruchome obrazy. Jeśli aplikacja musi śledzić ruchomy obraz, użyj obu właściwości,
ArTrackingState
iArAugmentedImageTrackingMethod
, aby ustalić, czy obraz został wykryty i czy jest znana jego pozycja.
Przypadek użycia | Poprawiony obraz | Przenosisz obraz |
---|---|---|
Przykład | Plakat zawieszony na ścianie | Reklama z boku autobusu |
Pozycja może być uznana za prawidłową, gdy |
ArTrackingState == TRACKING |
ArTrackingState == TRACKING
i ArAugmentedImageTrackingMethod == FULL_TRACKING
|