2014-02-27

ARToolkit ir OpenCV panaudojimas papildytosios realybės kūrimui

Šiandien nestebina įvairiuose informacijos šaltiniuose skelbiamos naujienos apie virtualią realybę, t.y. žaidimus - tai tapo gana įprasta. Apie papildytąją realybę (augmented reality - toliau AR) ar bent jos sąvoką galbūt irgi teko girdėti. Ja siekiama kasdienišką ir įprastą mūsų realybę (vaizdą) praturtinti į ją įkomponuojant įvairius virtualius (3D) objektus. Ypač tai tapo populiaru, kai web/vaizdo kameros išplito mobiliuosiuose įrenginiuose - Qualcomm iniciatyva atsirado pirmosios AR demonstracijos, mini žaidimai ir pan. Šiame straipsnyje panagrinėsime šią technologiją iš arčiau ir apžvelgsime kaip panaudoti ARToolkit+ biblioteką ir kitus įrankius AR kūrimui.




I. Prologas


AR sąvoka gana plati - apima ne tik matomų vaizdų monitoriuje ar telefono ekrane "pagražinimą" bet ir dažnai vaizdai/papildoma informacija yra projektuojama ant realių objektų aplinkoje - automobilio lango, pastatų sienų ir t.t. Įvedę į Google paiešką "augmented reality" rasime begales vaizdų pradedant mobiliosiomis technologijomis, automobilių pramone ar net Google Glass. AR jau nuo seno naudojama karo/aviacijos pramonėje ir pan. taikymo sričių yra išties nemažai.






Kurti AR sprendimus galime kiekvienas prieš tai susipažinę su šia technologija, jos veikimo principais bei turint šiek tiek programavimo žinių. Pagrindinė problema bet kokiame AR sprendime - žinoti, kaip teisingai įkomponuoti neegzistuojančius objektus į tikrą sceną, kad viskas atrodytų kiek įmanoma natūraliau. Turime nustatyti, naujų 3D objektų orientaciją ir poziciją, jau nekalbant apie jų apšvietimo pritaikymą pagal scenos apšvietimą. Turint statinę sceną (pvz. pastato siena) viskas paprasčiau - tereikia žinoti tikslius išmatavimus ir paviršiaus formą. Jeigu dirbame su dinamine aplinka (pvz.: mobilios kameros matomu vaizdu), tai numatyti iš anksto kokia yra matoma scena - tiesiog neįmanoma. Tokiu atveju naudojami įvairūs žymekliai/markeriai ar žinomas vaizdas, kad būtų lengviau nustatoma darbinio paviršiaus orientacija.

   

Labiausiai ištobulintos būtent žymekliais paremtos technologijos, kadangi algoritmai juos aptinkantys vaizde jau senokai aprašyti ir yra tikrai gana tikslūs. Paprasčiausi juodai-balti (dvejetainiai) žymekliai dėl savo kontrasto yra lengviausiai aptinkamos figūros bet kokioje scenoje. Maksimalios spalvų reikšmės padeda lengviau išskirti kontūrą ir išvengti klaidų ar net dalį jų atstatyti - taip padidinant patikimumą. Dvejetainių žymeklių yra įvairių tipų. Vieni kaip šablonas naudoja mums suprantamą vaizdelį/tekstą (pvz. alfabeto raidė), kiti - dvejetainį ar kitokį blokinį kodą užkoduotą 2D matricoje, leidžiantį nustatyti net daug žymeklių vienu metu ir kiekvieno jų ID bei konkrečią orientaciją.

Šiuo metu yra prieinama nemažai įvairių įrankių, kurie palengvina žymeklių nustatymo procesą - jeigu kuriate žaidimą galima naudoti Unity 3D ar Qualcomm Vuforia AR įrankius, tai pat yra begalės bibliotekų kaip ARtoolkit+, Aruco, ARma ir t.t. Šiam darbui pasirinkau gerai žinomą ARtoolkit+ biblioteką, kuri yra neblogai ištobulinta, optimizuota ir turi nemažai naudingų funkcijų - palaiko iki 4096 žymeklių sekimą vienu metu be didelio spartos praradimo, turi kameros kalibravimo palaikymą, naudoja efektyvius žymeklių orientacijos nustatymo metodus ir pan.


II. ARToolkit+

ARtoolkit gali dirbti dviem režimais - sekti matomus žymeklius po vieną arba sekti matomus žymeklius kaip vieną bendrą objektą (plokštumą). Sekant plokštumą pirmiausia faile yra aprašomi žymekliai ir jų reliatyvus išsidėstymas ant jos. Toliau šis aprašas užkraunamas į ARToolkit ir sistema iš keleto matomų žymeklių gali aproksimuoti kitų žymeklių pozicijas bei bendrą plokštumos orientaciją. Pakanka 5-6 atpažintų žymeklių ant plokštumos, kad būtų pasiekiamas labai geras orientacijos nustatymo tikslumas. Savo testuose pasirinkau naudoti atskirų (single) žymeklių sekimo metodą, tačiau pereiti prie daugelio - gana paprasta.

Be abejo, bet kokiems tikslumo reikalaujantiems AR sprendimams reikia kalibruoti kamerą - vien dėl tangentinių ar radialinių lęšio defektų matomas vaizdas nėra visiškai tikslus. ARToolkit palaiko MATLAB Camera Calibration Toolbox įrankio formatą, taip palengvindama visą šio darbo procesą. Kalibruojant apskaičiuojami svarbūs kameros parametrai kaip - židinio nuotolis, iškraipymo koeficientai ir pan. iš šių duomenų galima atkurti kameros projekcijos matricą. Žinoma, kamera taip pat kiek galima turi būti sufokusuota reikiamu atstumu, kad aptikimas būtų  kuo tikslesnis.

Dirbant su ARToolkit+ biblioteka mums reikės ją parsisiųsti ir susikompiliuoti. Tą aš atlikau naudodamas MS Visual Studio 2010 IDE. Toliau galime pasižiūrėti, kaip naudoti bilioteką žymeklių aptikimui. Pirmiausia biblioteka palaiko įvairius žymeklių tipus - paprastus (storu juodu apvadu), BCH bei savo aprašytus. Iš visų šių alternatyvų mano požiūriu geriausias variantas atrodė BCH žymekliai. Kitaip nei kuriant savo, jie jau aprašyti ir automatiškai nustatomi bibliotekos, o jų sekamas skaičius vienu metu gali būti net iki 4096. Taip pat šie dvejetainiai žymekliai, nei įprasti, turi klaidų korekcijos funkciją - tad jų atpažinimo tikslumas dar geresnis. Na ir galiausiai visi šie 4096 žymeklių vaizdų jau paruošti ir pridedami prie bibliotekos - tad belieka žymeklius padidinti iki reikiamo dydžio ant popieriaus ir atspausdinti. Mano naudojamas A4 formato dokumentas (yra prie projekto kodo) turi keturis 40mm žymeklius kampuose, kaip pavaizduota žemiau:


Aptarėme, kokį funkcionalumą naudosime, tad dabar apžvelkime kaip inicializuoti ir dirbti su pačia biblioteka. Reikia įtraukti keletą antraščių į kodo failą:


Norėdami naudodami bibliotekos funkcijas taip pat reikės prisidėti ir atitinkamą ARtoolkit.lib biblioteką. ARtoolkit inicializacija atliekama kaip pateikta apačioje:



Atlikę inicializaciją galime pradėti žymeklių aptikimą vaizde. Iš kur imsime vaizdą - kiekvieno pasirinkimas. Ar tai bus kamera ar statinis vaizdas, ar video failas - priklausys tik nuo uždavinio. Bet kokiu atveju tam, kad aptikti žymeklius reikia vaizdo kadro RGB pikselių informacijos. Šią informaciją mano atveju paėmiau iš vaizdo kameros panaudojęs OpenCV bibliotekos funkcijas. Taigi aptikimo eiga - vos viena eilutė, o likusios - piešimo/vaizdavimo funkcijos:


Aptiktų žymeklių piešimas paliekamas realizuoti skaitytojui. Galutiniame projekte naudojamas tiek OpenCV tiek ir OpenGL funkcionalumas siekiant atvaizduoti gautus rezultatus. Bendru atveju po aptikimo gauname informaciją apie žymeklio centro poziciją, kraštines, OpenGL stiliaus projekcijos ir modelview matricas - orientaciją, taip pat gauname ir markerių ID, pagal kurį žinosime, kurie markeriai matomi. 

Gauti rezultatai demonstruojami žemiau esančiame video - OpenCV ir OpenGL languose. Siekiant realizuoti bent minimalų AR ir neapkrauti projekto pavyzdžio įdėjau tik 3D eglutės piešimo kodą ties kiekvieno žymeklio centru.




III. Reziumė ir perspektyvos

Bendru atveju ARToolkit nėra visiškai tobulas sprendimas - bet gana neblogas. Iš trūkumų galima būtų pažymėti tai jog, bent vienam žymeklio kampui pasislėpus už kadro, žymeklis nebeaptinkamas, nors gali būti matoma didelė dalis žymeklio. Kartais žymeklio orientacijos matrica (modelview) gali būti neapskaičiuojama (nulinė) nors žymeklis aptinkamas ir matomas - ypač pasireiškia naudojant RPP orientacijos nustatymo metodą. Vis gi, stabilumas geras, nustatyta nejudančio žymeklio pozicija ir orientacija labai mažai kinta/virpa (jitters) ramybės būsenoje bėgant laikui, kadangi automatiškai įvertinamos praeities reikšmės (history). Su šia biblioteka galima padaryti tikrai įdomių dalykų - ji verta dėmesio, tik blogiausia, kad nebetobulinama :(

Taip pat pabaigai reiktų paminėti, jog aktyviai tobulinama AR sritis, kurioje siekiama nenaudoti žymeklių, o tik natūralius ir kitus objektus - pavyzdžiui žmogaus ranką  (Handy AR - šaltinis) sekant jo pirštus ir pan. kaip parodyta žemiau:



Kiti nauji metodai (naudojami Qualcomm Vuforia ir kt.) remiasi bruožų paieška paveiksluose - lyginami kampai, kraštinės ir pan. Ieškomi panašūs paveikslai (pvz: žurnalo viršelis, nuotrauka) naujame vaizde turintys tuos pačius ar panašius bruožus:


Dar vienas perspektyvus metodas - bruožų sekimas per keletą kadrų (PTAM - Paraller Tracking and Mapping). Šis metodas sekdamas aplinkos bruožus sudaro galimų plokštumų aibę ir ant jų toliau leidžia piešti AR objektus, video žemiau:




Visą šio straipsnio projekto kodą galite parsisiųsti iš žemiau esančios nuorodos. Sėkmės eksperimentuojant ir iki kitų susitikimų!

Project source - download


2 komentarai:

  1. can I get the source code for the tree on aruco mrker video because I didn't understand a word explained in here .Language problrem

    AtsakytiPanaikinti