Laboratorul 04. Augmented Images

API-ul Augmented Images din ARCore ne permite să creăm aplicații care pot detecta și augmenta imagini 2D din mediul înconjurător al utilizatorului (cum ar fi postere, tablouri, ambalaje). API-ul se bazează pe setarea unui set de imagini de referință. ARCore utilizează pe urmă un algoritm computer vision pentru a extrage caracteristici din informația grayscale a fiecărei imagini și salvează o reprezentare a acestor caracteristici într-o bază de date de imagini augmentate. La runtime, ARCore caută aceste caracteristici pe suprafețele plane din mediul înconjurător al utilizatorului. Asta permite ARCore să detecteze aceste imagini în lumea reală și să estimeze poziția, orientarea și dimensiunea lor.

Capabilități Tehnice

  • ARCore poate urmări simultan până la 20 de imagini. Cu toate acestea, ARCore nu va detecta sau urmări instanțe multiple ale aceleași imagini.
  • Fiecare bază de date de imagini augmentate poate reține maxim 1000 de imagini de referință. Nu există nicio limită pentru numărul de baze de date folosite de o aplicație, dar la un anumit moment de timp o singură bază de date poate fi activă. O bază de date poate fi îmbogățită cu imagini la runtime cu condiția ca baza de date să nu depășească 1000 de imagini.
  • Când adăugăm o imagine într-o bază de date putem specifica dimensiunea imaginii. Acest lucru va rezulta în îmbunătățirea performanței de detecție. Dacă nu este setată dimensiunea imaginii, ARCore va estima dimensiunea periodic.
  • ARCore poate detecta imagini care fie se află într-o poziție fixă (de exemplu un tablou pe un perete), fie se mișcă (de exemplu o reclamă pe un autobuz).
  • Odată ce o imagine este detectată, ARCore va urmări poziția și orientarea imaginii chiar și când imaginea nu se mai află în raza camerei telefonului. În cazul acesta, ARCore presupune că imaginea este statică, deci aceasta nu se mișcă, ci doar telefonul utilizatorului.
  • Toată procesarea are loc pe dispozitiv. Nu este necesară o conexiune la internet pentru a detecta și a urmări imagini. Baza de date de imagini este, la rândul său, locală.

Cerințe de Funcționare

Pentru a fi detectate, imaginile trebuie:

  • Să fie plate (un ambalaj de pe o sticlă nu este garantat că va fi detectat)
  • Să fie clar vizibile de camera telefonlui. Imaginile nu vor fi detectate dacă sunt parțial ascunse sau dacă telefonul este mișcat prea rapid.
  • Să reprezinte cel puțin 25% din imaginea procesată de camera telefonului pentru a fi detectate inițial.

Selectarea Imaginilor de referință

Similar Vuforia, nici ARCore nu poate detecta orice imagine. Astfel, imaginile folosite trebuie să îndeplinească o serie de criterii:

  • Rezoluția unei poze ar trebui să fie de cel puțin 300 x 300 pixeli. Imagini cu rezoluții foarte mari nu îmbunătățesc performanța detecției.
  • Imaginile trebuie să fie în format PNG sau JPEG.
  • Informația de culoare nu este folosită, ci imaginea grayscale.
  • Evitați imaginile cu rată de compresie mare (interferează cu extracția de caracteristici).
  • Evitați imaginile care conțin un număr foarte mare de caracteristici geometrice sau care conțin prea puține caracteristici. Astfel de imagini vor fi greu detectate.
  • Evitați imaginile cu modele repetitive

Crearea Bazei de Date de Imagini

  • Baza de date salvează o reprezentare comprimată a caracteristicilor extrase din imaginea grayscale a imaginii de referință. Fiecare imagine ocupă aproximativ 6kB.
  • Adăugarea unei imagini la runtime într-o bază de date durează aproximativ 30ms.
  • Este indicat să se adauge imagini pe thread-uri separate pentru a evita blocarea thread-ului interfeței grafice.
  • Dacă cunoașteți dimensiunea imaginii de input specificați-o. Informația aceasta îmbunătățește performanța detecției imaginii în special pentru imagini fizice foarte mari (mai mari de 75cm).
  • Evitați să aveți în baza de date foarte multe imagini nefolosite.

Crearea Bazei de Date de Imagini

  1. Click dreapta în Project → Create → XR → Reference Image Library
  2. Click pe obiectul creat → Add Image din Inspector
  3. Populați baza de date cu imagini
  4. Atașați scriptul AR Tracked Image Manager pe un GameObject din scenă
  5. Serialized Library va fi baza de date creată anterior
  6. Tracked Image prefab va fi obiectul care se va instanția când o imagine din baza de date este detectată

Crearea Bazei de Date de Imagini la Runtime

Putem observa că în pașii prezentați anterior baza de date de imagini este creată înainte de compilare. Deci trebuie să cunoaștem toate imaginile pe care le dorim în proiect înainte de a crea .apk-ul. Acest aspect nu este însă practic. De multe ori poate vom dori să folosim imagini aleatoare. Drept urmare, o bază de date configurată anterior nu este fezabilă. Deci, vom avea nevoie să creăm o bază de date proprie la runtime:

  1. Ștergem vechea bază de date de imagini (în caz că există); deci ștergem componenta ARTrackedImageManager dacă există
  2. Adăugăm o nouă componentă ARTrackedImageManager obiectului
  3. Creăm baza de date la runtime
  4. Adăugăm imagini în baza de date
  5. Setăm baza de date nou creată și numărul maxim de imagini mișcătoare.
  6. Activăm noua baza de date
  7. Setăm funcția de gestiune a schimbării stării de tracking a imaginilor
/* Destroy the previous ARTrackedImageManager component */
DestroyImmediate(gameObject.GetComponent<ARTrackedImageManager>());
 
/* Add a new ARTrackedImageManager component */
ARTrackedImageManager trackImageManager = gameObject.AddComponent<ARTrackedImageManager>();
 
/* Create a new database */
var library = trackImageManager.CreateRuntimeLibrary();
 
/* Add images to the database */
if (library  is MutableRuntimeReferenceImageLibrary mutableLibrary)
{
        mutableLibrary.ScheduleAddImageWithValidationJob(imageToAdd, "Image Name", 0.5f /* 50 cm */);
}
 
/* Set max number of moving images */
trackImageManager.requestedMaxNumberOfMovingImages = 3;
 
/* Set the reference library */
trackImageManager.referenceLibrary = library;
 
/* Enable current ARTrackedImageManager */
trackImageManager.enabled = true;
 
/* Attach the function for handling the tracking state of the images */
trackImageManager.trackedImagesChanged += OnTrackedImagesChanged; 
void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
{
    foreach (ARTrackedImage trackedImage in eventArgs.added)
    {
 
    }
 
    foreach (ARTrackedImage trackedImage in eventArgs.updated)
    {
 
    }
 
    foreach (ARTrackedImage trackedImage in eventArgs.removed)
    {
 
    }
}

Optimizarea Image Tracking

  • Dacă imaginea nu își va schimba niciodată poziția (de exemplu, un tablou), puteți atașa o ancoră imaginii pentru a crește stabilitatea detectării imaginii.
  • Imaginea fizică trebuie să ocupe cel puțin 25% din imaginea produsă de cameră pentru a putea detecta inițial imaginea.
  • Nu utilizați poziția, orientarea și dimensiunea imaginii atâta timp cât tracking state NU este Tracked. Când o imagine este inițial detectată de ARCore și dimensiunea acesteia nu a fost specificată, starea sa va fi Paused. Asta înseamnă ca ARCore a recunoscut imaginea, dar nu are încă suficiente informații pentru a putea estima poziția și orientarea sa.

Tasks

Vom folosi scena Augmented Images din scheletul de laborator. Acesta poate fi descărcat de aici. Scriptul necesar pentru rezolvarea laboratorului se află în Assets→Scripts: RuntimeImageLibrary.cs.

  1. Creați o bază de date înainte de compilare cu minim 3 imagini.
  2. Augmentați imaginile din baza de date creată.
  3. Creați o bază de date la runtime cu minim o imagine și augmentați imaginea.
  4. Bonus: Adăugați un buton pe ecran cu care veți face switch între cele două baze de date.

Putem avea o singură bază de date de imagini activă la un moment dat. Deci, când adăugăm o nouă bază de date de imagini, trebuie să ștergem ultima bază de date existentă.

irva/laboratoare/04.txt · Last modified: 2023/10/23 12:49 by maria_anca.balutoiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0