Hier erfahren Sie, wie Sie erweiterte Bilder in Ihren eigenen Apps verwenden.
Voraussetzungen
Machen Sie sich mit den grundlegenden AR-Konzepten und zur Konfiguration einer ARCore-Sitzung vertraut, bevor Sie fortfahren.
Bilddatenbank erstellen
Erstellen Sie ein ArAugmentedImageDatabase
zum Speichern von Referenzbildern. Dafür gibt es zwei Möglichkeiten:
- Leere Datenbank erstellen
ArAugmentedImageDatabase* ar_augmented_image_database = NULL; ArAugmentedImageDatabase_create(ar_session, &ar_augmented_image_database);
- Aus einer Bilddatenbankdatei lesen. Weitere Informationen finden Sie in der AugmentedImage für
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);
Datenbankdateien können entweder mit dem Image-Tool oder durch Aufrufen von ArAugmentedImageDatabase_serialize()
erstellt werden.
Bilder zur Datenbank hinzufügen
Dieser Schritt ist optional, wenn die gewünschten Referenzbilder bereits aus der Datenbankdatei geladen wurden. Wenn Sie ein Bild zur Laufzeit hinzufügen möchten, rufen Sie wie unten gezeigt ArAugmentedImageDatabase_addImage()
auf. In der Beispiel-App augmented_image_c finden Sie Funktionen im util
-Namespace.
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;
Die Werte index
und name
werden später verwendet, um festzustellen, welches Referenzbild erkannt wurde.
Bild-Tracking aktivieren
Konfigurieren Sie Ihre ARCore-Sitzung für das Tracking von Bildern, indem Sie die Bilddatenbank registrieren:
ArConfig_setAugmentedImageDatabase(ar_session_, ar_config, ar_augmented_image_database); const ArStatus status = ArSession_configure(ar_session_, ar_config);
Während der Sitzung nutzt ARCore Featurepunkte aus dem Kamerabild, um es mit denen in der Bilddatenbank abzugleichen.
Erweiterte Bilder in einer AR-Sitzung finden
Um übereinstimmende Bilder zu erhalten, fragen Sie in der Frame-Update-Schleife nach aktualisierten ArAugmentedImage
-Elementen ab.
// 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). } }
Unterstützung verschiedener Anwendungsfälle
Wenn ARCore ein erweitertes Bild erkennt, wird ein Trackable
dafür erstellt und ArTrackingState
auf TRACKING
und ArAugmentedImageTrackingMethod
auf FULL_TRACKING
gesetzt. Wenn sich das erfasste Bild aus dem Sichtfeld der Kamera hinausbewegt, setzt ARCore ArTrackingState
weiterhin auf TRACKING
, ändert jedoch ArAugmentedImageTrackingMethod
zu LAST_KNOWN_POSE
und stellt weiterhin die Ausrichtung und Position des Bilds bereit.
Je nach beabsichtigtem Anwendungsfall sollten Tracking-Status und Tracking-Methode in Ihrer App unterschiedlich verwendet werden.
Behobene Bilder: In den meisten Anwendungsfällen, in denen Bilder an Ort und Stelle fixiert sind (also nicht verschoben werden sollen), kann einfach mit
ArTrackingState
ermittelt werden, ob das Bild erkannt wurde und ob sein Standort bekannt ist.ArAugmentedImageTrackingMethod
kann ignoriert werden.Bilder verschieben: Wenn Ihre Anwendung ein sich bewegendes Bild verfolgen muss, verwenden Sie sowohl
ArTrackingState
als auchArAugmentedImageTrackingMethod
, um festzustellen, ob das Bild erkannt wurde und ob seine Position bekannt ist.
Anwendungsfall | Fixiertes Bild | Bild wird verschoben |
---|---|---|
Beispiel | Ein an einer Wand hängendes Plakat | Anzeige an der Seite eines Busses |
Die Pose kann als gültig angesehen werden, wenn |
ArTrackingState == TRACKING |
ArTrackingState == TRACKING
und ArAugmentedImageTrackingMethod == FULL_TRACKING
|