VŠB-TU Ostrava Fakulta elektrtechniky a infrmatiky Katedra infrmatiky Zpracvání multimediálních dat Pdpůrný text pr tutriál: Virtuální realita a její aplikace rzšířená realita Obrázek 1: Ukázka vide sekvence s dplněným 3D mdelem (ukázky z výsledné aplikace) Jednu z praktických aplikací z blasti virtuální reality je tzv. rzšířená realita. Cílem tét metdy je rzšíření reálnéh brazu virtuální prvky, jakými mhu být pčítačem genervaný braz, zvuk neb např. GPS data. V tmt tutriálu se seznámíme s pstupem pr vytvření aplikace, která d reálnéh záběru kamery umístí virtuální předmět na míst značené speciální značku. Tat značka (dále marker) umžní určit typ i rientaci bjektu, který chceme d scény virtuálně umístit. V následujících bdech shrneme jedntlivé krky veducí k umístění 3D mdelu předmětu d vide sekvence. Vzhledem k tmu, že se předpkládá vypracvání tht tutriálu v prstředí jazyka C++ a s využitím knihvny OpenCV, jsu u jedntlivých krků uvedeny také názvy dpvídajících funkcí, řešících daný prblém. Detailní ppis těcht funkcí je nad rámec tht textu a čtenář je dkazván na pdrbnu dkumentaci knihvny OpenCV.
Pstup: 1. Detekce markerů v brazu kamery Předpkládejme, že se nám pdařil úspěšně získat snímek z připjené kamery a pkusíme se v něm nalézt příslušný marker. Markerem rzumíme černý čtverec s vycentrvanu mřížku tvřenu černbílu šachvnicí (např. 5x5 čtverců), která reprezentuje infrmaci v binárním kódu (černá dpvídá hdntě 0 a bíla hdntě 1). Obrázek 2: Ukázka značky (markeru) rzměrech 7x7 Pr následnu snadnější manipulaci s brazem, tent nejprve převedeme z barevnéh prstru d stupňů šedi (cv::cvtclr). Dále je nutné braz binarizvat pmcí prahvání. Jednduché prahvání nebude v našem případě fungvat, prtže braz bude vykazvat různé úrvně jasu z důvdu prblematických světelných pdmínek. Lepší vlbu bude adaptivní prahvání (adaptivethreshld) pracující s průměrnými hdntami v určitém klí každéh pixelu. Výsledkem by měl být černbílý brázek, na kterém budu dbře viditelné všechny části markerů (tzn. jejich bvd i vnitřní vzr) a případně další neptřebné. 2. Detekce kntur Nyní ptřebujeme nalézt samtný marker v černbílém braze, který jsme získali v předchzím krku. Jelikž blast markeru představuje černý čtverec, je nejjedndušší tut blast aprximvat pmcí plygnu čtyřech vrchlech. Nalezení kntur řeší metda cv::findcnturs a našim úklem je ze získaných kntru vhdným způsbem dfiltrvat chybné detekce. Před samtným filtrváním je nutné knturu nahradit plygnem (cv::apprxplydp). Platný plygn musí mít právě čtyři vrchly, musí být knvexní (cv:iscnturcnvex) a vzdálenst každých dvu vrchlů plygnu musí být větší než vhdně zvlená prahvá hdnta. Tímt krkem jsme získali kandidáty na markery a musíme dále věřit, zdali jsu alespň některé ze získaných plygnů skutečně knturami markerů. 3. Ověření ptenciálních markerů Pr získání bsahu jedntlivých plygnů, je nutné nejprve dstranit perspektivní prjekci a získat jejich braz z čelníh phledu. Th dcílíme pmcí transfrmační matice, kteru vypčteme pmcí funkce cv::getperspectivetransfrm na základě znalsti čtyř krespndujících párů bdů. 2/8
První čtveřice bdů jsu suřadnice nalezených vrchlů plygnu v braze a druhá čtveřice představuje bdy v lkálním suřadném systému samtnéh markeru. Samtný warping brazu prvedeme pmcí funkce cv::warpperspective. Zdrjvým brazem pr warping je riginální barevný snímek z kamery a výsledný braz ptencinálníh markeru je tedy také barevný brázek. Pr čtení binárních symblů je pr nás vhdnější jeh černbílá reprezentace. Tu získáme prahváním pmcí Otsuva algritmu (cv::threshld( CV_THRESH_OTSU), který předpkládá bimdální rzlžení jasů v braze (t je přesně náš případ) a snaží se nalézt takvu hdntu prahu, která maximalizuje varianci mezi třídami při zachvání c nejmenší variance uvnitř tříd. P prvedeném prahvání se můžeme pkusit dečíst binární hdnty z příslušných míst brazu markeru a získat tak jeh kód. Každý bit markeru je reprezentván jedním ze 49 čtverců rzmístěných v pravidelné mřížce nad každým markerem (viz. Obrázek 2). Předpkládejme, že bvdvé bity jsu vždy 0, tj. černé a užitečnu infrmaci nese puze vnitřní mřížka 5x5 bitů. Pr převedení hdnt pixelů jedntlivých bitů markeru na bity lze využít funkce cv::cuntnnzer nad příslušným reginem brazu markeru (tzv. ROI). 4. Rzpznání markerů Jednu z mžnstí, jak zapsat pžadvanu infrmaci (typ bjektu a rientaci) d markeru, je přím zakódvat např. nějaké ID d 25-bitvé hdnty. T však není zcela idální, prtže např. takvá hdnta ID=0 by vedla na černý čtverec, ze kteréh by evidentně nebyl mžn získat infrmaci rientaci markeru. Rvněž symetrické vzry by nám neumžnily jednznačně zreknstruvat jeh rientaci. Dále také nemůžeme spléhat na t, že se nám vždy pdaří každý marker rzpznat zcela bezchybně. Z těcht důvdů je vhdné hdnty markerů zakódvat např. pmcí lineárníh Hammingva kódvání pr pravu jedné chyby. 5. Přesné dhledání plh markerů v braze P dekódvání ID markeru a určení jeh správné rientace, můžeme dhledat jeh vrchly se subpixelvu přesnstí pmcí funkce cv::crnersubpixel. Tent krk nám zajistí c nejpřesnější nalezení umístění vrchlů markeru v braze a následně zpřesní dhad jeh umístění v 3D prstru. Tent krk je pměrně časvě nárčný, a prt je zařazen až zde, jelikž teď již pracujeme jen s malým pčtem markerů. 6. Plha markeru v 3D prstru P prvedení předcházejícíh krku známe 2D plhy rhů (p s ) nalezených markerů v brazvém prstru. Jejich umístění v 3D světvém prstru (p w ) a krespndující prjekce d 2D brazvéh prstru je svázána rvnicí p s = A [R t] p w, (1) 3/8
kde A představuje tzv. vnitřní matici kamery ppisující parametry jak hniskvá vzdálenst, hlavní bd kamery a gemetricku distrzi bjektivu kamery. Rtační matice R rzměrech 3x3 splu s translačním 4D vektrem t v hmgenních suřadnicích představuje Euklidvsku transfrmaci. Z rvnice (1) známe puze plhy rhů p s (můžeme si určit libvlně) a p w () vše statní musíme určit. Kalibrací kamery se zde zabývat nebudeme, jen pznamenáme, že knihvna OpenCV je vybavena funkcemi pr získání matice A ze série 10 20 snímků šachvnice. Pr tut chvíli předpkládejme, že matice A je nám pr naši kameru k dispzici a můžeme pkračvat dále. Prcedura nalezení dhadu transfrmace mezi prstrem kamery a glbálním prstrem, ve kterém je umístěn sledvaný marker, se nazývá dhad pózy z 2D-3D krespndence a jejím výsledkem je nalezení matice Euklidvské transfrmace [R t]. Tut krespndenci lze snadn nalézt pmcí funkce cv::slvepnp vracející bě kmpnenty uvažvané Euklidvské transfrmace, je však nutné si uvědmit, že nalezená transfrmace ppisuje pzici kamery vůči markeru ve světvém prstru. Pr další zpracvání je vhdné získat inverzní transfrmaci. 7. Dplnění virtuálníh mdelu d reálnéh brazu Psledním krkem je s využitím získaných transfrmací prvést vykreslení mdelu d brazu kamery. Th je mžné dsáhnut např. pmcí knihvny OpenGL. Následujícím cílem je uvedený pstup prakticky realizvat v jazyce C++ za využití knihvny OpenCV. Jak návdný příklad může pslužit následující úspěšná implementace uvedenéh pstupu. Příklad výsledné aplikace: Autři: Tmáš Bartšek, Jan Křístek, Peter Drábik, šklní rk 2012/2013 4/8
Obrázek 3: Ukázka výsledné aplikace Ppis jedntlivých vládacích prvků hlavníh kna aplikace (viz. Obrázek 3): 1. Zdrj snímků: zde se nastavuje, c bude zdrjem snímků pr detekci markerů. Přepínáním mezi zálžkami (tabulátrem) se nastavuje typ zdrje: Obrázky: vytvří seznam brázků z disku. Lze vybrat subry puze z jedné slžky. Pmcí klávesy ctrl lze vybrat selektivně neb pmcí ctrl+a lze vybrat všechny subry. Vide: vide subr. Pkud bsahuje více prudů, bude pužit první a zvukvá stpa je kmpletně ignrvána. Kamera: připjená kamera k PC (např. webkamera). Parametrem je čísl, které je pužit pr metdu cv::videcapture::pen(). 2. Nastavení detekce a vykreslvání: nastavuje různé nastavení pr vykreslvání a detekci. Dále je zde mžn nastavit kalibrační subr kamery, který je ptřeba pr správnu detekci. Také je zde mžn nastavit subr s metadaty hledně markerů, případně nechat zbrazit výsledky v samstatném kně a průběh jedntlivých krků detekce. 3. Nahrávání d subru: umžňuje nahrát rendervané snímky d videa. Je pužit MJPG kdek. P kliknutí na Start se budu průběžně ukládat všechny vyrendervané snímky až d stisknutí Stp. 4. Infrmace průběhu: zbrazuje infrmace tm, který snímek se detekuje, status vlákna detekce apd. 5. Rendervání: vládá rendervání. Prstřednictvím tlačítek previus a next se lze přepínat mezi jedntlivými snímky, které se ihned detekují, renderují a zbrazí. Kliknutím na play se autmaticky budu přehrávat jedntlivé snímky. Pzn.: tlačítka previus a next si pamatují snímek, který byl renderván napsled. Přehrávání je ale ignrván. Snímek, kde 5/8
se má přehrávání začít a ke kterému se vztahují tlačítka previus a next lze nastavit v plžce Frame v sekci 2. 6. Výsledek rendervání: vizualizuje výsledek detekce a rendervání. 7. Parametry detekce: Zde lze nastavit parametry OpenCV funkcí pužité pr rendervání. 8. Plžka nástrje: bsahuje nástrj pr tvrbu markerů. Je mžné si naklikat marker a nechat zbrazit jeh kód (viz. Obrázek 4). Marker lze ulžit jak brázek. Kalibrace kamery Obrázek 4: Editr markerů Aby byl mžn prvést detekci markerů správně, je ptřeba zjistit parametry kamery, tj, kalibrvat ji. Kalibrace prbíhá tak, že se nejprve kameru zachytí něklik (10 20) snímků šachvnice známých rzměrů, a pté se nechá prběhnut výpčet, který dané parametry zjistí. Ukázka aplikace pr kalibraci kamery (viz. Obrázek 5) pchází z diplmvé práce Tmáše Bartška. Prgram umžňuje kalibraci prvést pmcí videa neb samstatných brázků. V pravé části je mžn nastavit parametry kalibrace včetně veliksti šachvnice. Metadata markerů Prgram rzšířené reality pužívá textvé dkumenty s metadaty markerů pr jejich detekci a vykreslení správnéh mdelu. Frmát metadat: Textvý frmát, lze libvlně ddělvat bílými mezerami s jednu výjimku Když je řečen řetězec, je myšlen bez uvzvek a bez bílých mezer Struktura dat jednh markeru: Uvzen symblem ">" (bez uvzvek) 6/8
Příklad: Řetězec: jmén markeru Čísl: indikátr, zda marker pužívá hammingv kódvání (1 - an, 0 ne) Čísl: zakódvaný kód markeru; v případě hammingva kódvání se vynechávají paritní bity (čísl sptřebvává tedy 20 bitů míst 25) lze získat z nástrje pr tvrbu markerů následují vlitelné parametry: mdel frmátu ply: řetězec: "PLY_MODEL" (bez uvzvek) adresa subru; jak adresa se bere následující celý zbytek řádku, takže může bsahvat bílé znaky Neuvádí se pčet markerů ani uknčvací tken, ale je ptřeba značit všechny markery symblem ">". > marker_01 0 22757246 PLY_MODEL markerdata/dragn_vrip_res4.ply > marker_03 1 1040743 PLY_MODEL markerdata/dragn_vrip_res4.ply > marker_04 1 1043519 PLY_MODEL markerdata/bun_zipper_res4.ply Pstup pužití aplikace: Obrázek 5: Kalibrace kamery 1. Je ptřeba nasnímat šachvnici pr kalibraci a snímky pr samtné markery. 2. Kalibrace kamery. 3. Vytvření subrů s metadaty markerů. 4. Spuštění hlavníh prgramu a spuštění rzšířené reality: 7/8
a) Ve zdrji snímků nastavit vide. b) Nastavit kalibrační subr kamery. c) Nastavit subr s metadaty markerů. d) Je dpručen nechat rendervání v samstatném vlákně. Vlitelně je mžné nastavit zbrazvání výsledků v samstatném kně a případně zbrazvání průběhu detekce. e) Vlitelně lze nastavit výstupní vide. Kliknutím na Start se připraví jeh nahrávání. f) Pužitím tlačítek apply, previus a next lze pstupně nechat zpracvat jedntlivé snímky neb tlačítkem play přehrát celé vide. g) Jestliže jsme nahrávali vide s výslednými snímky, kliknutím na Stp se nahrávání dknčí a výsledný vide subr bude mžné přehrát. Pužitá literatura: [1] Baggi, Daniel a kl. Mastering OpenCV with Practical Cmputer Visin Prjects. Packt Publishing. ISBN 978-1-84951-782-9. 2012. 8/8