Scopri come utilizzare le immagini aumentate nelle tue app.
Prerequisiti
Assicurati di aver compreso i concetti fondamentali di AR e di configurare una sessione ARCore prima di procedere.
Crea un database di immagini
Ogni database di immagini può archiviare informazioni per un massimo di 1000 immagini.
Esistono due modi per creare una AugmentedImageDatabase
:
- Carica un database di immagini salvate. Poi, facoltativamente, aggiungi altre immagini di riferimento.
- Crea un nuovo database vuoto. Quindi aggiungi le immagini di riferimento una alla volta.
Carica un database di immagini salvato
Utilizza AugmentedImageDatabase.deserialize()
per caricare un database di immagini esistente:
Java
AugmentedImageDatabase imageDatabase; try (InputStream inputStream = this.getAssets().open("example.imgdb")) { imageDatabase = AugmentedImageDatabase.deserialize(session, inputStream); } catch (IOException e) { // The Augmented Image database could not be deserialized; handle this error appropriately. }
Kotlin
val imageDatabase = this.assets.open("example.imgdb").use { AugmentedImageDatabase.deserialize(session, it) }
I database di immagini possono essere creati utilizzando lo strumento a riga di comando arcoreimg
durante lo sviluppo o chiamando AugmentedImageDatabase.serialize()
su un database che contiene contenuti caricati in memoria.
Crea un nuovo database vuoto
Per creare un database di immagini vuoto in fase di runtime, utilizza il costruttore AugmentedImageDatabase
:
Java
AugmentedImageDatabase imageDatabase = new AugmentedImageDatabase(session);
Kotlin
val imageDatabase = AugmentedImageDatabase(session)
Aggiungere immagini a un database esistente
Aggiungi immagini al tuo database di immagini chiamando AugmentedImageDatabase.addImage()
per ogni immagine e specificando un valore widthInMeters
facoltativo.
Java
Bitmap bitmap; try (InputStream bitmapString = getAssets().open("dog.jpg")) { bitmap = BitmapFactory.decodeStream(bitmapString); } catch (IOException e) { // The bitmap could not be found in assets; handle this error appropriately. throw new AssertionError("The bitmap could not be found in assets.", e); } // If the physical size of the image is not known, use addImage(String, Bitmap) instead, at the // expense of an increased image detection time. float imageWidthInMeters = 0.10f; // 10 cm int dogIndex = imageDatabase.addImage("dog", bitmap, imageWidthInMeters);
Kotlin
val bitmap = assets.open("dog.jpg").use { BitmapFactory.decodeStream(it) } // If the physical size of the image is not known, use addImage(String, Bitmap) instead, at the // expense of an increased image detection time. val imageWidthInMeters = 0.10f // 10 cm val dogIndex = imageDatabase.addImage("dog", bitmap, imageWidthInMeters)
Gli indici restituiti possono essere utilizzati in seguito per identificare quale immagine di riferimento è stata rilevata.
Attiva il monitoraggio delle immagini
Configura la tua sessione ARCore per iniziare a monitorare le immagini impostando la configurazione sessione su una configurazione configurata con il database di immagini desiderato:
Java
Config config = new Config(session); config.setAugmentedImageDatabase(imageDatabase); session.configure(config);
Kotlin
val config = Config(session) config.augmentedImageDatabase = imageDatabase session.configure(config)
Durante la sessione, ARCore cerca le immagini abbinando i punti caratteristica dell'immagine della videocamera a quelli nel database delle immagini.
Per ottenere le immagini corrispondenti, esegui il sondaggio per verificare la presenza di AugmentedImage
aggiornate nel loop di aggiornamento del frame.
Java
Collection<AugmentedImage> updatedAugmentedImages = frame.getUpdatedTrackables(AugmentedImage.class); for (AugmentedImage img : updatedAugmentedImages) { if (img.getTrackingState() == TrackingState.TRACKING) { // Use getTrackingMethod() to determine whether the image is currently // being tracked by the camera. switch (img.getTrackingMethod()) { case LAST_KNOWN_POSE: // The planar target is currently being tracked based on its last // known pose. break; case FULL_TRACKING: // The planar target is being tracked using the current camera image. break; case NOT_TRACKING: // The planar target isn't been tracked. break; } // You can also check which image this is based on img.getName(). if (img.getIndex() == dogIndex) { // TODO: Render a 3D version of a dog in front of img.getCenterPose(). } else if (img.getIndex() == catIndex) { // TODO: Render a 3D version of a cat in front of img.getCenterPose(). } } }
Kotlin
val updatedAugmentedImages = frame.getUpdatedTrackables(AugmentedImage::class.java) for (img in updatedAugmentedImages) { if (img.trackingState == TrackingState.TRACKING) { // Use getTrackingMethod() to determine whether the image is currently // being tracked by the camera. when (img.trackingMethod) { AugmentedImage.TrackingMethod.LAST_KNOWN_POSE -> { // The planar target is currently being tracked based on its last known pose. } AugmentedImage.TrackingMethod.FULL_TRACKING -> { // The planar target is being tracked using the current camera image. } AugmentedImage.TrackingMethod.NOT_TRACKING -> { // The planar target isn't been tracked. } } // You can also check which image this is based on AugmentedImage.getName(). when (img.index) { dogIndex -> TODO("Render a 3D version of a dog at img.getCenterPose()") catIndex -> TODO("Render a 3D version of a cat at img.getCenterPose()") } } }
Supportare diversi casi d'uso
Quando ARCore rileva un'immagine aumentata, crea un elemento Trackable
per
questa immagine e imposta TrackingState
su TRACKING
e TrackingMethod
su FULL_TRACKING
. Quando l'immagine tracciata esce dalla visualizzazione della fotocamera, ARCore
modifica il valore TrackingMethod
in LAST_KNOWN_POSE
, continuando a fornire l'orientamento e la posizione
dell'immagine.
L'app deve utilizzare queste enumerazioni in modo diverso a seconda del caso d'uso previsto.
Immagini fisse. Nella maggior parte dei casi d'uso relativi a immagini fisse in posizione (ovvero che non sono previste per essere spostate) possono semplicemente utilizzare
TrackingState
per determinare se l'immagine è stata rilevata e se la sua posizione è nota.TrackingMethod
può essere ignorato.Immagini in movimento. Se la tua app deve monitorare un'immagine in movimento, usa sia
TrackingState
siaTrackingMethod
per determinare se l'immagine è stata rilevata e se la sua posizione è nota.
Caso d'uso | Immagine corretta | Spostamento immagine in corso... |
---|---|---|
Esempio | Un poster appeso a una parete | Un annuncio sulla fiancata di un autobus |
La posa può essere considerata valida quando |
TrackingState == TRACKING |
TrackingState == TRACKING
e TrackingMethod == FULL_TRACKING
|
Vedi anche
I progetti di esempio delle immagini aumentate nell'SDK ARCore.