Laborator AR 04. Augmented Images. Augmented Faces
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 altor engine-uri de realitate augmentată (precum 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
Click dreapta în Project → Create → XR → Reference Image Library.
Click pe obiectul creat → Add Image din Inspector.
Populați baza de date cu imagini.
Atașați scriptul AR Tracked Image Manager pe un GameObject din scenă.
Serialized Library va fi baza de date creată anterior.
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:
Ștergem vechea bază de date de imagini (în caz că există); deci ștergem componenta ARTrackedImageManager dacă există.
Adăugăm o nouă componentă ARTrackedImageManager obiectului.
Creăm baza de date la runtime.
Adăugăm imagini în baza de date.
Setăm baza de date nou creată și numărul maxim de imagini mișcătoare.
Activăm noua baza de date.
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.
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ă.
Augmented Faces
API-ul Augmented Faces permite randare de asset-uri peste fețele umane (similar Snapchat). Acesta furnizează puncte de referință care permit aplicației să identifice automat diferite regiuni ale unei fețe detectate. Aplicația poate apoi să folosească aceste regiuni pentru a suprapune asset-uri într-un mod care se potrivește corect conturului feței fiecărei persoane.
Părțile unei Fețe Augmentate
Trei poziții de regiune: Situate în partea stângă a frunții, în partea dreaptă a frunții și în vârful nasului, pozițiile de regiune marchează părți importante ale feței utilizatorului; folosite pentru a randa asset-uri pe nas sau în jurul urechilor.
Un mesh 3D al feței: Alcătuită din 468 de vertecși, permite aplicarea de texturi detaliate și adaptabile care urmează cu precizie conturul feței.
Detectarea Fețelor
Fețele sunt reprezentate de obiecte ARFace, care sunt create, actualizate și eliminate de ARFaceManager. O dată pe cadru, ARFaceManager declanșează un eveniment facesChanged care conține trei liste: fețe adăugate, fețe actualizate și fețe eliminate. Când ARFaceManager detectează o față în scenă, va instanția un prefab, care conține ARFace atașat pentru a urmări fața. Pentru a vizualiza mesh-ul feței, prefabul feței trebuie să conțină ARFaceMeshVisualizer. ARFaceMeshVisualizer generează un mesh corespunzător feței detectate.
Pași pentru augmentarea fețelor:
Adăugați un obiect ARFaceManager în Hierarchy.
Hierarchy → click dreapta → XR → AR Default Face.
Creați un prefab și ștergeți AR Default Face din Hierarchy.
Setați prefabul creat ca Face Prefab al ARFaceManager.
Camera Frontală
În plus, cel mai adesea când dorim să augmentăm fețe, dorim să folosim camera frontală a telefonului. Astfel:
Setați AR Session → AR Session → Tracking mode la valoarea Rotation only.
Setați XR Origin → Camera Offset → Main Camera → AR Camera Manager → Facing Direction la valoarea User. Valoarea World reprezintă camera principală a telefonului.
Tasks
Vom folosi scena
L4_AugmentedImages din scheletul de laborator pentru primele 3 task-uri și scena
L4_AugmentedFaces pentru ultimul task. Acesta poate fi descărcat de
aici. Scriptul necesar pentru rezolvarea laboratorului se află în
Assets→Scripts:
RuntimeImageLibrary.cs.
Importați ultima versiune a pachetului IRVA_L4_AR
care se găsește în folder-ul UnityPackages din folderul root al proiectului.
Creați o bază de date înainte de compilare cu minim 3 imagini.
Augmentați imaginile din baza de date creată.
Creați o bază de date la runtime cu minim o imagine și augmentați imaginea.
Detectați și augmentați o față.
Bonus: Adăugați posibilitatea de a cicla printre 3 “măști” diferite pentru augmentarea feței. Utilizatorul poate selecta masca dintr-un meniu de pe ecran.