Západočeská univerzita v Plzni Fakulta aplikovaných věd Katedra kybernetiky
BAKALÁŘSKÁ PRÁCE
PLZEŇ,2011
LUKÁŠ BUREŠ
PROHLÁŠENÍ Předkládám tímto k posouzení a obhajobě bakalářskou práci zpracovanou na závěr studia na Fakultě aplikovaných věd Západočeské univerzity v Plzni. Prohlašuji, že jsem bakalářskou práci vypracoval samostatně a výhradně s použitím odborné literatury a pramenů, jejichž úplný seznam je její součástí. V Plzni dne 19. května 2011 ............................... vlastnoruční podpis
PODĚKOVÁNÍ Chtěl bych vyjádřit poděkování Ing. Markovi Hrúzovi za cenné připomínky, odborné rady a podněty k zamyšlení. Dále bych chtěl poděkovat všem, kteří mě jakkoliv podpořili při psaní bakalářské práce.
Anotace Práce se zabývá technologií rozšířené reality. Obsahuje matematický popis kalibrace virtuální scény ze známého kalibračního vzoru. Popisuje postup implementace v programovacím jazyce C++ s využitím knihoven OpenGL a OpenCV. V závěru prezentuje získané výsledky a navrhuje další možný postup pro optimalizaci. Klíčová slova : rozšířená realita, 3D projekce, C++, OpenGL, OpenCV
Annotation The thesis deals with the technology of augmented reality. It contains a mathematical description of the calibration of a virtual scene from a known calibration pattern. It describes how to implement the algorithm in C++ using OpenGL and OpenCV. In conclusion, it presents the obtained results and suggests another possible procedure for the optimization. Keywords : augmented reality, 3D projection, C++, OpenGL, OpenCV
Obsah 1 Úvod
1
2 Rozšířená realita 2.1 Magazín Esquire . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Novodobá výuka medicíny . . . . . . . . . . . . . . . . . . . . 2.3 Hry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 2 3 4
3 Počítačové 3D vidění a geometrie 3.1 Body a přímky v projekčním prostoru . . . . . . . . . . . . . .
5 5
4 Model kamery 4.1 Model dírkové kamery . . . . . . . . . . . . . . . . . . . . . .
7 7
5 Zařízení pro záznam vizuálního signálu 11 5.1 Kamery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 5.2 Kinect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 6 Kalibrace kamery 14 6.1 Kalibrace jedné kamery . . . . . . . . . . . . . . . . . . . . . . 14 6.2 Kalibrace kamery ze známé scény . . . . . . . . . . . . . . . . 15 7 Programy a knihovny
17
8 Kalibrační vzor
19
9 Hardware
20
10 Odhadnutí vnitřních a vnějších parametrů známého kalibračního vzoru 10.1 Rozdělení programu . . . . . . . . . . . . . . 10.2 Spuštění programu . . . . . . . . . . . . . . 10.3 Programová realizace . . . . . . . . . . . . . 10.3.1 Výpočet vnějších parametrů kamery 10.3.2 Výpočet vnitřních parametrů kamery
kamery pomocí . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
21 21 22 24 24 28
11 Nastavení virtuální scény v OpenGL 30 11.1 Nastavení vnitřních parametrů kamery . . . . . . . . . . . . . 30 11.2 Nastavení vnějších parametrů kamery . . . . . . . . . . . . . . 32 12 Vykreslování virtuálních objektů
I
34
13 Problém určení počátku vykreslovací soustavy
37
14 Závěr
39
II
1
Úvod
Téma bakalářské práce bylo Vylepšená realita v OpenGL za pomoci vizuálního snímače. Toto téma bylo zvoleno na základě pokračování v předchozích projektech, které se vztahovaly k této bakalářské práci. Technologie rozšířené reality je relativně nová a má velký potenciál pro rozšíření do mnoha komerčních sekcí, kde jistě v budoucnu nalezne své uplatnění. Motivací a cílem bylo vytvořit program, který by do videa dokresloval virtuální interaktivní objekty v reálném čase, tak aby navozovaly dojem, že jsou součástí reality. Takovéto spojení virtuálního a skutečného světa vytváří velmi ojedinělý zážitek, který neumí napodobit ani dokonalá virtuální realita. V bakalářské práci je řešeno mnoho dílčích problémů, které ve výsledku dovolují vytvořit rozšířenou realitu. Mezi hlavní řešené problémy patří nalezení vnitřních a vnějších parametrů kamery ze snímků obsahujících známý kalibrační vzor, nastavení virtuální scény v OpenGL a vykreslování virtuálních objektů. Práce obsahuje popis důležitých funkcí k programové realizaci a konkrétní nastavení jejich parametrů. Úvodní kapitoly se zabývají představením technologie rozšířené reality. V kapitole 2 je představena tato technologie a jsou ukázány možnosti reálného využití. Kapitola 3 se zabývá matematickým popisem dírkové kamery a projekční geometrie. Následující kapitoly obsahují, vysvětlení matematického modelu kamery v kapitole 4, reálné druhy kamer a jejich použití jsou uvedeny v kapitole 5. Dále se práce zabývá v kapitole 6 popisem kalibrace kamery. Kapitoly 7, 8, 9 popisují programové prostředky, které byly použity, zvolený kalibrační vzor a hardware. V kapitolách 10, 11, 12, které se vztahují již ke konkrétnímu řešení problému, je uvedeno nastavení vnějších a vnitřních parametrů kamery, následně scény v OpenGL a samotné vykreslování virtuálních objektů. Na závěr je poukázáno na možné vylepšení programu v kapitole 13.
1
2
Rozšířená realita
Rozšířená realita je v angličtině nazývána jako augmented reality (AR). V poslední době, ač se to nezdá, nabývá velkého rozmachu. Nejdříve si definujme, co to rozšířená realita vlastně je. V roce 1997 definici nabídl Ronald Azuma, který definici této technologie interpretoval následovně. Rozšířená realita spojuje reálné a virtuální, je interaktivní, v reálném čase a je zobrazena ve 3D [1]. Takto definovaná technologie dnes nachází uplatnění v nejrůznějších odvětvích vědy. Začíná se uplatňovat v komerční sekci, v podobě nejrůznějších her, interaktivních aplikací, armádních projektů, lékařství. Největší zájem je samozřejmě o tuto technologii v oblasti počítačových her. Mezi další možné aplikace patří i počítačem vedená prohlídka města nebo využití při počítačovém 3D navrhování. Porovnejme nyní virtuální a rozšířenou realitu. Nevýhodou virtuální reality oproti rozšířené realitě je skutečnost, že návštěvníka modelu zcela vytrhuje z reálného světa. I přesto, že je možné realitu počítačem detailně vymodelovat a zprostředkovat pozorovateli, zážitek z přítomnosti v konkrétním prostředí je jen těžko nahraditelný. Technologie rozšířené reality dovoluje osobě pohybující se v reálném světě vnímat objekty zkonstruované v digitálním světě. Technologie spočívá ve sledování trajektorie pozorovatele, přesněji předem definovaného obrazce, který je přítomen v reálném prostředí. Nejčastěji se jedná o černobílou kartu s pevně definovaným motivem. Společně s digitálními prvky tento obraz tvoří rozšířenou realitu. Uveďme si několik příkladů reálného použití.
2.1
Magazín Esquire
Magazín Esqure je ve světě, převážně v USA, známý jako pánský magazín zaměřující se na dobře situovanou skupinu mužů ve věku mezi 30 a 45 lety, který podává čtenáři informace týkající se životního stylu, módních trendů a zajímavostí ze života celebrit. Tento magazín v nedávné době do svých časopisů přidal černobílé detekční obrazce. Díky kterým si čtenář, za předpokladu že si stáhne aplikaci z webových stránek Esquire, bude moci prohlížet s pomocí své webkamery nové modely oblečení na svém monitoru. Což tištěnému zdroji informací přidává nový rozměr, bez nutnosti distribuovat magazín s aditivním nosičem dat.
2
Obrázek 1: Magazín Esquire [2].
2.2
Novodobá výuka medicíny
Rozšířená realita poskytuje nepřeberné množství možností pro vzdělávání. Nyní se zaměříme na použití výuky v medicíně. Ve světě se vyvíjí mnoho aplikací v projektech, které by měly lékařům zjednodušit jejich práci. Případně jim pomoci si určité věci lépe představit nebo zapamatovat. Jedním z příkladů použití je detekování bodů na umělé figuře lidské hlavy a následném dokreslení snímků v daných rovinách řezů. Takto si lze jednoduše představit, jak to v lidském těle vypadá.
Obrázek 2: Použití rozšířené reality v medicíně [3].
3
2.3
Hry
Technologie rozšířené reality našla své uplatnění i ve hrách, jak již hraných na klasických stolních počítačích, tak na přenosných PDA, mobilních telefonech nebo PlayStation Portable (PSP). Jednou z komerčně prodávaných AR her je Invizimals [4]. Invizimals je PSP AR hra, která byla vyvinuta firmou Novarama [5] a publikována byla Sony Computer Entertainment Europe [6]. Tento produkt je dodáván s kamerou kompatibilní s PSP. Invizimals je jednou z takzvaných sběratelských her, kde hráč nejdříve musí v reálném světě za pomoci svého PSP a kamery chytit některý z různých druhů zvířat. To se provádí pomocí reálné „pasti“, ve skutečnosti jde o detekční obrazec předem známého tvaru a rozměrů. Typ nalezeného zvířete se odvíjí od barvy povrchu podkladu a denní doby. Lze hrát hru pro jednoho hráče, to znamená proti umělé inteligenci, nebo hru pro více hráčů. Přičemž při souboji zvířat musí být vždy přítomen detekční obrazec, již výše zmiňovaná „past“. V roce 2009, kdy tato hra vyšla na trh, získala mnoho ocenění. Například v roce 2009 Special Achievement for Innovation, IGN.com Best of E3 2009.
Obrázek 3: AR hra Invizimals na PSP [7]. Technologie rozšířené reality není doposud příliš známá mezi lidmi a je relativně nová. A proto lze očekávat, že v následujících letech její uplatnění v herním průmyslu bude narůstat a budeme se stále častěji setkávat s těmito odlišnými hrami, než na jaké jsme byli doposud zvyklí. 4
3
Počítačové 3D vidění a geometrie
Počítačové vidění je odvětví výpočetní techniky a vývoje softwaru zabývající se vytvářením zařízení schopných získávat informaci ze zachyceného obrazu. Může se jednat mimo jiné i o zpracování videa, obrazu z více zdrojů nebo dat z lékařských vyšetření [8]. V oblasti počítačového vidění byl zaznamenán rychlý rozvoj v zobrazování geometrie, která se zabývá matematickými vztahy mezi: 1. 3D body ve scéně a obecněji jinými jednoduchými geometrickými objekty, 2. jejich projekcí, 3. vztahy mezi více projekcemi 3D scény. Z oblasti počítačového vidění se vyvinula fotogrammetrie, která se zabývá rekonstrukcí tvarů, měřením rozměrů a určováním polohy předmětů, které jsou zobrazeny na fotografických snímcích. Fotogrammetrii lze definovat jako vědní obor, který se zabývá zpracováním informací na fotografiích. Zaměřuje se na poměrně omezený okruh úkolů oproti 3D počítačovému vidění, které zkoumá používání běžně dostupných kamer, ty jsou buď částečně kalibrované, nebo vůbec ne. Pracuje oproti fotogrammetrii s velkými nepřesnostmi v obrazu. Nedávný vývoj umožnil plnou automatizaci úkolů, jako je 3D rekonstrukce bodů a parametrů kamery z neznámé sekvence snímků. Dále automatickou rekonstrukci 3D scény z velkého počtu odlišných pohledů. Základním senzorem, který poskytuje informaci o okolním světě, počítačového 3D vidění je kamera, která zachycuje jeden snímek a nebo sekvenci snímků, tedy video. Důraz je kladen hlavně na geometrii. Dále si vysvětlíme jak se dají 2D obrazové informace využít k rekonstrukci 3D informace. K tomu si potřebujeme říci něco o perspektivní projekci, která je také nazývána centrální projekcí. Perspektivní projekce je používána modelem dírkové kamery. Podstatou této projekce je, že dvě rovnoběžné čáry se zobrazí jako sbíhající se.
3.1
Body a přímky v projekčním prostoru
Začněme definicí projekčního prostoru. Uvažujme (𝑑 + 1) dimenzionální lineární prostor bez jeho počátku ℛ𝑑+1 − {[0, ..., 0]⊤ }, a definujme ekvivalentní vztah [︁ ]︁⊤ [𝑥1 , ..., 𝑥𝑑+1 ]⊤ ≃ 𝑥′1 , ..., 𝑥′𝑑+1 , (1)
5
právě tehdy, když [︁
∃𝛼 ̸= 0 : [𝑥1 , ..., 𝑥𝑑+1 ]⊤ = 𝛼 𝑥′1 , ..., 𝑥′𝑑+1
]︁⊤
.
(2)
To znamená, že dva vektory v ℛ𝑑+1 jsou ekvivalentní, když jsou stejné, až na nenulovou konstantu 𝛼. Projekční prostor 𝒫 𝑑 si lze představit jako množinu všech přímek procházejících počátkem.
Obrázek 4: Projekční perspektiva rovnoběžných přímek. Bod v 𝒫 𝑑 odpovídá nekonečně rovnoběžným vektorům v ℛ𝑑+1 a je jednoznačně dán jakýmkoliv jedním vektorem v 𝒫 𝑑+1 . Takový vektor se nazývá homogenní (také projekční) reprezentace bodu v 𝒫 𝑑 . Homogenní vektor reprezentuje stejný bod jako vektor, který se liší o nenulovou velikost. Často je tomu tak, že vektor má na pozici nejvíce vpravo číslo 1, například [𝑥′1 , ..., 𝑥′𝑑 , 1]⊤ .
6
4
Model kamery
Modelování je vytváření abstraktní, koncepční, grafické, matematické formy modelu. Ten je vždy pouze přiblížení se skutečnosti, protože skutečný systém může být natolik složitý, že jeho realizace není možná. My se dále budeme zabývat modelem kamery, konkrétně modelem dírkové komory. Je to optické zařízení používané jako pomůcka malířů, předchůdce fotoaparátu a kamery.
4.1
Model dírkové kamery
Dírková kamera, v angličtině nazývaná jako pinhole camera, je používána jako vhodný model pro mnoho aplikací počítačového vidění. Model dírkové kamery vykonává středovou projekci, geometrie je zobrazena na Obr. 5. Rovina 𝜋 je umístěna horizontálně a je na ni promítán reálný svět. Optická osa prochází středovým bodem a ohniskovým bodem, který se také nazývá optický střed nebo střed projekce. Ohnisková vzdálenost 𝑓 je jedním z parametrů čočky. Kamera vykonává lineární transformaci z 3D prostoru 𝒫 3 do 2D prostoru 𝒫 2 . Projekce je přenášena optickým paprskem, který je odražený od bodu scény X nebo vznikl ze zdroje světla. Optický paprsek projde skrz optický střed C a na promítací rovině skrz bod u.
Obrázek 5: Geometrie lineární perspektivy kamery. 7
Pro popsání potřebujeme čtyři souřadné systémy: 1. Světový souřadný systém, který má střed v bodu O. Body X a u jsou vyjádřeny ve světovém souřadném systému. 2. Kamerový souřadný systém (s indexem 𝐶 ) má střed v bodu 𝐶 ≡ 𝑂𝐶 , který je také ohniskem. Osa 𝑍𝐶 je sjednocena s optickou osou. Její orientace je z ohniskového bodu C směrem k promítací rovině. Dostáváme vztah mezi světovým a kamerovým souřadným systémem, který je dán Euklidovskou transformací skládající se z rotace R a translace t. 3. Euklidovský souřadný systém (s indexem 𝑖 ) promítací roviny má osy zarovnány s kamerovým souřadným systémem. To znamená,že osy 𝑢𝑖 ,𝑣𝑖 ,𝑤𝑖 jsou kolineární se souřadným systémem 𝑋𝐶 ,𝑌𝐶 ,𝑍𝐶 . Osy 𝑢𝑖 a 𝑣𝑖 leží na promítací rovině. 4. Affiní souřadný systém (s indexem 𝑎 ) je tvořen souřadnými osami 𝑢,𝑣,𝑤 a počátkem 𝑂𝑎 , který je totožný s Euklidovským souřadným systémem 𝑂𝑖 . Souřadné osy 𝑢,𝑤 jsou zarovnány s 𝑢𝑖 ,𝑤𝑖 . Naopak osa 𝑣 má jinou orientaci vzhledem k ose 𝑣𝑖 . Důvod proč zavádíme affiní souřadný systém je, že body se mohou zobrazovat zdeformovaně a souřadné osy nemusí mít stejná měřítka. Projekční transformace se dá rozdělit do tří jednoduchých transformací, které odpovídají jednotlivým transformacím mezi těmito čtyřmi souřadnými systémy. První transformace (mezi 1 a 2 výše) tvoří přechod ze světového souřadného systému (𝑂; 𝑋, 𝑌 , 𝑍) do kamerového souřadného systému (𝑂𝐶 ; 𝑋𝐶 , 𝑌𝐶 , 𝑍𝐶 ). Světový souřadný systém může být zarovnán s kamerovým souřadným systémem, translací středu 𝑂 do 𝑂𝐶 o vektor 𝑡 a rotací souřadných os o rotační matici 𝑅. Transformace bodu 𝑋 do 𝑋𝐶 vyjádřená v nehomogenních souřadnicích je 𝑋𝐶 = 𝑅(𝑋 − 𝑡). (3) Rotační matice 𝑅 vyjadřuje tři základní rotace kolem jednotlivých os 𝑋, 𝑌 a 𝑍. Translační vektor 𝑡 vyjadřuje tři prvky translace počátku světového souřadného systému s ohledem na kamerový souřadný systém. Nyní dostáváme šest vnějších kamerových parametrů, tři rotační a tři translační.
8
Parametry 𝑅 a 𝑡 se nazývají vnější kalibrační parametry kamery. Nyní vyjádříme rovnici (3) v homogenních souřadnicích [︃
𝑋𝐶 =
𝑅 −𝑅𝑡 0⊤ 1
]︃
(4)
𝑋.
Druhá transformace (mezi 2 a 3 výše) promítá bod 𝑋𝐶 z 3D scény, který je vyjádřený v kamerovém středovém souřadném systému (𝑂𝐶 ; 𝑋𝐶 , 𝑌𝐶 , 𝑍𝐶 ), do bodu 𝑢𝑖 , který leží na promítací rovině 𝜋 a je vyjádřen pomocí souřadného systému promítací roviny (𝑂𝑖 ; 𝑢𝑖 , 𝑣𝑖 , 𝑤𝑖 ). Projekce ℛ3 → ℛ2 v nehomogenních souřadnicích nám dává dvě nelineární rovnice v 𝑍𝐶 𝑌𝐶 𝑓 𝑋𝐶 𝑓 , 𝑣𝑖 = , (5) 𝑢𝑖 = 𝑍𝐶 𝑍𝐶 kde 𝑓 je ohnisková vzdálenost. Jestliže je projekce dána rovnicemi (5) v projekčním prostoru, potom se projekce 𝒫 3 → 𝒫 2 zapíše lineárně v homogenních souřadnicích jako ⎡ ⎤ 𝑓 0 0 0 ⎥ 𝑢𝑖 ≃ ⎢ (6) ⎣ 0 𝑓 0 0 ⎦ 𝑋𝐶 . 0 0 1 0 Třetí transformace (mezi 3 a 4 výše) mapuje Euklidovský souřadný systém na affiní souřadný systém. Je výhodné shromáždit všechny vnitřní parametry kamery do 3 × 3 matice 𝐾. Ohnisková vzdálenost 𝑓 je jedním z těchto parametrů. Tato matice 𝐾 je nazývána vnitřní kalibrační maticí. Matice 𝐾 je horní trojúhelníková a vyjadřuje mapování 𝒫 2 → 𝒫 2 , které je speciálním případem affiní transformace. To lze provést v promítací rovině jak lze vidět na Obr. 5. Tato 𝒫 2 → 𝒫 2 transformace je ⎡
⎤
𝑎 𝑏 −𝑢0 ⎢ ⎥ 𝑢 ≃ 𝐾𝑢𝑖 = ⎣ 0 𝑐 −𝑣0 ⎦ 𝑢𝑖 . 0 0 1
(7)
Parametry vnitřní kalibrační matice jsou následující: 𝑎 udává měřítko podél osy 𝑢 a 𝑐 udává měřítko podél osy 𝑣. Často jsou obě hodnoty stejné 𝑎 = 𝑐. Parametr 𝑏 udává deformaci pravoúhlosti os. Což znamená: ⎡
⎤
⎡
⎤⎡
⎤
⎡
⎤
𝑥 𝑎 𝑏 −𝑢0 𝑥 𝑎𝑥 + 𝑏𝑦 − 𝑢0 ⎢ ⎥ ⎢ ⎥⎢ ⎥ ⎢ ⎥ 𝑐𝑦 − 𝑣0 𝐾 ⎣ 𝑦 ⎦ = ⎣ 0 𝑐 −𝑣0 ⎦ ⎣ 𝑦 ⎦ = ⎣ ⎦. 1 0 0 1 1 1
(8)
Ze vztahu (8) je vidět, že parametr 𝑏 určuje, jak je osa 𝑢 sešikmená ve směru osy 𝑣. 9
Nyní můžeme zcela obecně specifikovat projekci dírkové kamery. Již víme, že se jedná o lineární transformaci z 3D projekčního prostoru 𝒫 3 do 2D projekčního prostoru 𝒫 2 . Transformace je součinem tří výše odvozených rovnic (4),(6) a (7): ⎡ ⎤ ]︃ 𝑓 0 0 0 [︃ 𝑅 −𝑅𝑡 ⎢ ⎥ 𝑢≃𝐾⎣ 0 𝑓 0 0 ⎦ 𝑋. (9) 0⊤ 1 0 0 1 0 Součinem druhého a třetího koeficientu dostaneme užitečnou vnitřní strukturu, přepíšeme rovnici (9) jako ⎡
⎤ ]︃ 𝑓 0 0 0 [︃ [︁ ]︁ 𝑅 −𝑅𝑡 ⎢ ⎥ 𝑅 | −𝑅𝑡 𝑢≃𝐾⎣ 0 𝑓 0 0 ⎦ 𝑋 = 𝐾 𝑋 = 𝑀 𝑋. 0⊤ 1 0 0 1 0 (10) Pokud bychom vyjádřili bod scény v homogenních souřadnicích, můžeme psát projekci perspektivy v lineární podobě pomocí jediné 3 × 4 matice 𝑀 , která se nazývá projekční matice (nebo také matice kamery). Submatice o velikosti 3 × 3, která je vlevo, popisuje rotaci a sloupec vpravo translaci. Oddělovač | označuje, že matice se skládá ze dvou submatic. Poznamenejme, že matice 𝑀 obsahuje všechny vnitřní a vnější parametry, protože
𝑀 =𝐾
[︁
]︁
𝑅 | −𝑅𝑡 .
V této kapitole byly čerpány informace ze zdroje [14].
10
(11)
5
Zařízení pro záznam vizuálního signálu
Vizuální signál neboli video, které jako slovo je původem z latinského slovesa videre a znamená vidět, představuje technologii pro zachycení, zaznamenávání, přehrávání, přenos a obnovu pohyblivých obrázků. Video představuje společné označení pro digitální i analogové způsoby ukládání záznamů. Mezi digitální formáty videa se řadí například MPEG, D3, Digital Betacam, DV a naopak k analogovým formátům patří VHS, Betacam, Quadruplex. Velikost obrazu se měří v pixelech pro digitální a nebo v řádcích pro analogové formáty. Televizní analogové vysílání používalo k vysílání 576 řádků pro formáty PAL a SECAM, vysílání ve formátu NTSC používalo pouze 480 řádků. Digitální formát HDTV používá 720 nebo 1024 řádků. Další parametr, který se uvádí u videa, je takzvaný frame rate, česky řečeno počet snímků za jednotku času. Přesněji se uvádí počet snímků za sekundu (FPS - frames per second). V začátcích videa se FPS pohybovalo mezi 6-8 snímky za sekundu, v dnešní době je standardem 25 nebo 29.97 FPS. Poměr stran se anglicky uvádí jako aspect ratio. Udává poměr vodorovné a svislé strany. Poměr stran klasické televizní obrazovky je 4:3 u zařízení s vysokým rozlišením bývá poměr stran 16:9, který je také nazýván širokoúhlým poměrem stran. K reprezentaci barev existuje mnoho schémat, jedním z nejzákladnějších a nejlépe představitelných je Red Green Blue (RGB). Mezi další rozšířené barevné formáty patří YUV, který byl použitý pro televizní vysílání PAL a SECAM.
5.1
Kamery
Fotoaparát je zařízení, které zaznamenává a ukládá obrázky. Tyto obrázky mohou být stále fotografiemi nebo pohybujícími se obrázky, jako jsou videa a filmy. Název kamera pochází z latinského camera obscura, v překladu temná komora, která provádí středovou projekci popsanou v kapitole 4. Kamery mohou pracovat se světlem viditelného spektra nebo s jinými částmi elektromagnetického spektra. Webová kamera běžně nazývaná také jako webkamera se řadí mezi vstupní zařízení počítače. Pořízené snímky většinou ukládá na internet, díky tomu má uživatel s připojením k internetu vždy aktuální snímky odkudkoliv na světě. Jejich cena je velmi nízká, a proto jsou tak masivně využívány. Uplatnění nachází v oblasti videokomunikace mezi lidmi, střežení majetku, pozorování stavu na silnicích, nebo v neposlední řadě monitorování množství sněhu na horách. 11
HD kamery jsou jedny z moderních digitálních kamer, k záznamu používají formát HDV (High-Definition video). Tento formát byl vyvinut v roce 2003. Byl koncipován jako cenově dostupný formát pro digitální kamery s vysokým rozlišením. Existují verze HDV 1080i a HDV 720p. PAL kamery nahrávají ve formátu PAL (Phase Alternating Line), což je norma pro kódování obrazu. Používá se například pro televizní vysílání. Byla vyvinuta německou firmou Telefunken a v současnosti ji používá více než šedesát zemí světa. Česká republika je od roku 1990 jednou z nich. Systém vychází z dřívějšího NTSC a odstraňuje jeho nedostatky. Obraz je rozložen do 25 snímků za sekundu, které jsou vysílány po půlsnímcích s frekvencí 50 𝐻𝑧. Stereo kamera je typ kamery se dvěma čočkami, které mají oddělené obrazové senzory, to umožňuje kameře simulovat lidské vidění, a proto jsou schopny zachytit trojrozměrný obraz. Vzdálenost mezi čočkami v typické stereo kameře je 6,35 𝑐𝑚. Takto natočené video je nejčastěji používáno k projekci 3D filmů v kinech. Vysokorychlostní kamera je zařízení pro záznam rychle se pohybujících objektů. Po ukončení nahrávání snímků, které byly uloženy na záznamové médium, mohou být přehrávány zpomaleně. Vysokorychlostní kamery jsou schopny zaznamenávat i 250 000 snímků za sekundu, takto pořízený záznam jedné sekundy by se přehrával normální rychlostí přibližně 10 minut. Zde se naráží na problém, jakým způsobem ukládat obrazová data na standardní datová úložiště, jelikož datový tok zde je obrovský. Nejmodernější zařízení dokáží zachytit 200 milionů snímků za sekundu. Vysokorychlostní kamery se používají ve vědeckém výzkumu, při vojenských testech a v průmyslu. Infračervená kamera je zařízení pro zachytávání infračerveného záření, podobně jako obyčejná kamera, která k zachytávání snímků používá viditelné světlo. Infračervené kamery zachytávají světlo vlnové délky 14 𝜇𝑚. Původně byly vyvinuty pro vojenské použití během korejské války. V současné době se tato technologie využívá například pro monitorování procesů, hašení požárů, noční vidění a mnohé další.
12
5.2
Kinect
Kinect je zařízení určené pro konzoli Xbox 360. Vyvinula jej firma Microsoft pod kódovým označením projekt Natal. Zařízení je na Evropském trhu k dostání od 10. listopadu 2010. Kinect umožňuje uživatelům ovládat a pracovat s konzolí Xbox 360 bez nutnosti používat jakýkoliv ovladač. K ovládání slouží celé lidské tělo, proto lze jednoduše pomocí gest a mluvených příkazů nahradit ovladač. Kinect soutěží s jinými ovládacími zařízeními, například Wii MotionPlus a PlayStation Move. Avšak tito dva zmínění rivalové k ovládání používají ovladač s pohybovým čidlem. Kinect ve své základně obsahuje, 8-bitovou RGB kameru s rozlišením VGA (640× 480 pixelů). Hloubkové čidlo, které se skládá z infračerveného vysílače a přijímače. Dále obsahuje mikrofon, který dokáže rozpoznat až 4 osoby. Samotné zařízení se umí natáčet nahoru a dolu o 27∘ a musí mít dodatečné napájení ze sítě, protože napájení přes USB z konzole Xbox 360 není dostačující. Snímač má čtvercové hrací pole, které je vymezeno vzdáleností 1, 2−3, 5 𝑚 od zařízení. Takto vymezená hrací plocha má obsah přes 5 𝑚2 . V tomto prostoru se může vyskytovat až 6 osob, které jsou rozeznávány, ale pouze dvě, které jsou aktivně zapojeny do hry. Na každé aktivní osobě je rozeznáváno 20 kloubů [9].
Obrázek 6: Zařízení Kinect pro Xbox 360 [10].
13
6
Kalibrace kamery
Kalibrace je soubor úkonů, kterými se za specifikovaných podmínek stanoví vztah mezi hodnotami veličin, které jsou indikovány měřicím systémem nebo měřicím přístrojem nebo hodnotami reprezentovanými ztělesněnou mírou nebo referenčním materiálem a odpovídajícími hodnotami, které jsou realizovány etalony (standardy)[11]. Kalibrace je postup, kterým se dá odhadnout, za pomoci výpočtů, projekční matice kamery 𝑀 . Kalibrace se dá provádět za pomoci jedné a více kamer. Například při použití dvou kamer mluvíme o takzvané stereo kalibraci, která přináší více obrazové informace než při kalibraci jedné kamery. Na druhou stranu je složitější. My si dále ukážeme, jak postup kalibrace aplikovat na jednu kameru.
6.1
Kalibrace jedné kamery
Při kalibraci jedné kamery potřebujeme nalézt projekční matici 𝑀 z rovnice (11), která obsahuje všechny vnitřní a vnější parametry zařízení. Nyní musíme určit, kolik parametrů v matici 𝑀 je volných a kolik závislých. Pomocí ortogonální matice rotace 𝑅, jejíž sloupcové vektory jsou na sebe kolmé, dokážeme na rovinném příkladě, že na určení dvou úseček v rovině nám stačí znát pouze tři ze čtyř souřadnic. Za předpokladu, že matice [︃
𝑅2𝐷 =
𝑐𝑜𝑠𝜙 −𝑠𝑖𝑛𝜙 𝑠𝑖𝑛𝜙 𝑐𝑜𝑠𝜙
]︃
(12)
je ortogonální a že úsečky mají počátek v [0, 0]. Proveďme grafické řešení.
Obrázek 7: Grafické řešení 𝑦 souřadnice koncového bodu červené úsečky. 14
Z Obr. 7 je vidět, že určení koncového bodu červené úsečky je jednoznačné. Dále provedeme analytické řešení pomocí [︃
𝑥′𝑖 𝑦𝑖′
]︃
[︃
= 𝑅2𝐷
𝑥𝑖 𝑦𝑖
]︃
(13)
.
Nechť je dáno 𝜙 = 90∘ , 𝑥1 = 4, 𝑦1 = 2, 𝑥2 = −2, 𝑦2 = ?. Po dosazení do vztahu (13) dostáváme řešení 𝑦2 = 4. Odvodili jsme, že pro čtvercovou ortogonální rotační matici je potřeba určit 𝑛2 − 1 volných parametrů, kde 𝑛 je velikost matice 𝑅. V 3D prostoru má matice 𝑅 rozměry 3 × 3 → 9 volných parametrů mínus jeden, který je určený ortogonalitou matice 𝑅. K těmto 8 parametrům z matice 𝑅 přičtěme 3 volné parametry, které musíme určit v translačním vektoru 𝑡. Proto má projekční matice 𝑀 z rovnice (11) pouze 11 volných parametrů pro kalibraci.
6.2
Kalibrace kamery ze známé scény
Nyní bude více detailněji popsána kalibrace kamery ze známé scény, musí být brán ohled na to, že tento proces se dělí na dvě části. V první části je odhadnuta projekční matice 𝑀 (11) ze známých souřadnic bodů scény. Ve druhé jsou vnější a vnitřní parametry kamery odhadnuty z projekční matice 𝑀 . V prvním kroku získáme matici 𝑀 následovně. Pro každý bod 𝑋 = [𝑥, 𝑦, 𝑧, 1]⊤ ze známé scény a jeho korespondující 2D bod 𝑢′ = [𝑢, 𝑣, 1]⊤ dostáváme jednu rovnici. Hledáme číselné hodnoty 𝑚𝑖𝑗 v projekční matici 𝑀 , která má velikost 3 × 4. Jednoduchými úpravami rovnice (14) získáme tvar rovnice (16). ⎡ ⎢ ⎣
⎤
⎡
⎤
⎡
𝛼𝑢 𝑚11 𝑚12 𝑚13 𝑚14 ⎢ ⎥ ⎢ ⎢ 𝛼𝑣 ⎦ = ⎣ 𝑚21 𝑚22 𝑚23 𝑚24 ⎥ ⎦⎢ ⎣ 𝛼 𝑚31 𝑚32 𝑚33 𝑚34
⎡
⎤
⎡
𝑥 𝑦 𝑧 1
⎤ ⎥ ⎥ ⎥ ⎦
(14)
⎤
𝛼𝑢 𝑚11 𝑥 𝑚12 𝑦 𝑚13 𝑧 𝑚14 ⎢ ⎥ ⎢ ⎥ ⎣ 𝛼𝑣 ⎦ = ⎣ 𝑚21 𝑥 𝑚22 𝑦 𝑚23 𝑧 𝑚24 ⎦ 𝛼 𝑚31 𝑥 𝑚32 𝑦 𝑚33 𝑧 𝑚34 𝑢(𝑚31 𝑥 + 𝑚32 𝑦 + 𝑚33 𝑧 + 𝑚34 ) = 𝑚11 𝑥 + 𝑚12 𝑦 + 𝑚13 𝑧 + 𝑚14 𝑣(𝑚31 𝑥 + 𝑚32 𝑦 + 𝑚33 𝑧 + 𝑚34 ) = 𝑚21 𝑥 + 𝑚22 𝑦 + 𝑚23 𝑧 + 𝑚24
(15)
(16)
Takto získáme dvě lineární rovnice, které obsahují 12 neznámých 𝑚11 , · · · , 𝑚34 pro každý bod ze známé scény a k němu korespondující 2D bod. 15
Pokud 𝑛 bude počet dvojic korespondujících bodů, můžeme rovnici (16) přepsat do maticové reprezentace. V ní figuruje známá matice o velikosti 2𝑛×12 a vektor neznámých parametrů 𝑚11 , · · · , 𝑚34 . ⎡ ⎢ ⎢ ⎣
⎤
⎡
𝑥 𝑦 𝑧 1 0 0 0 0 −𝑢𝑥 −𝑢𝑦 −𝑢𝑧 −𝑢 ⎢ ⎥⎢ 0 0 0 0 𝑥 𝑦 𝑧 1 −𝑣𝑥 −𝑣𝑦 −𝑣𝑧 −𝑣 ⎥ ⎢ ⎦⎢ .. ⎣ .
𝑚11 𝑚12 .. .
⎤ ⎥ ⎥ ⎥ ⎥ ⎦
=0
(17)
𝑚34
Matice 𝑀 má pouze 11 neznámých parametrů, jak bylo ukázáno v kapitole (6.1). Pro každou dvojici korespondujících bodů (𝑢𝑖 , 𝑋𝑖 ) potřebujeme vyřešit homogenní lineární rovnici 𝛼𝑖 𝑢′𝑖 = 𝑀 𝑋𝑖 , 𝑖 = 1, ..., 𝑚
(18)
pro 𝑀 a 𝛼𝑖 . Matice 𝑀 má určenou velikost, proto má pouze 11 volných parametrů. Pro 𝑚 = 5 je systém podurčen a pro 𝑚 = 6 je naopak přeurčen. Tedy potřebujeme minimálně 𝑚 = 6 pro výpočet matice 𝑀 . Většinou je použito více bodů a přeurčená rovnice (17) je vyřešena pomocí robustní metody nejmenších čtverců, která je použita pro odstranění šumu vzniklého v měření. Výsledkem výpočtu je projekční matice 𝑀 . Ve druhém kroku je potřeba oddělit vnější parametry (rotační matici 𝑅 a translační vektor 𝑡) z odhadnuté projekční matice 𝑀 , kterou lze zapsat úpravou rovnice (11) jako 𝑀 = [𝐾𝑅| − 𝐾𝑅𝑡] = [𝐴|𝑏] .
(19)
Submatice 3 × 3 je označována jako 𝐴 a vektor nejvíce vpravo jako 𝑏. Výpočet translačního vektoru je jednoduchý, nahradíme 𝐴 = 𝐾𝑅 v rovnici (19), pak 𝑡 = −𝐴−1 𝑏. Pro určení rotační matice 𝑅 musíme brát v úvahu, že kalibrační matice 𝐾 je horní trojúhelníková a rotační matice 𝑅 je ortogonální. Pro rozklad matice 𝐴 se používá metoda nazývaná QR rozklad, jejíž výsledkem jsou přesně takové tvary matic 𝐾 a 𝑅 jaké hledáme. Alternativně bychom mohli použít singulární rozklad (SVD). SVD je hlavní nástroj pro řešení geometrických problémů spojených s 3D viděním [14].
16
7
Programy a knihovny
K řešení problému byly použity následující programy a knihovny. 1. Operační systém: Linux - Ubuntu 10.04 LTS 2. Vývojové prostředí: Eclipse - Helios 3. Programovací jazyk: C++ 4. Knihovny: OpenGL, OpenCV Operační systém Ubuntu 10.04 LTS byl zvolen, jelikož jednou z jeho mnoha výhod je, že je open source. To znamená, že je volně šiřitelný za podmínky, že jeho volná šiřitelnost zůstane zachována. Označení LTS znamená Long Term Support neboli dlouhodobá podpora (minimálně 18 měsíců), takto označený systém je vydávaný každé 2 roky. Bylo zvoleno vývojové prostředí Eclipse - Helios, které je primárně určeno pro programovací jazyk Java. Avšak podporuje velkou množinu programovacích jazyků za pomoci přídavných pluginů. Je open source a multiplatformní, proto ho lze využívat i na operačním systému, který byl výše zmíněný. Jako programovací jazyk byl zvolen C++, který podporuje několik programovacích stylů jako je procedurální programování, objektově orientované programování a generické programování, není tedy jazykem čistě objektovým. V současné době patří C++ mezi nejrozšířenější programovací jazyky, proto je pro něj k nalezení mnoho knihoven. První implementace byly provedeny v programovacím jazyce Java, ale ten se ukázal jako neperspektivní díky menší podpoře rozšiřitelných knihoven a uživatelské podpory. Proto všechny programy byly vytvořeny v jazyce C++. OpenCV (Open Computer Vision) je open source knihovna, která je multiplatformní a je využívána pro manipulaci s obrazem. Je zaměřena především na počítačové vidění a zpracování obrazu v reálném čase. Knihovnu je možné využít z prostředí jazyků C, C++, Python. Existuje i komerční verze pro C#. Tato knihovna byla použita díky své velké rozšířenosti, uživatelské podpoře a jejímu širokému spektru využití implementovaných algoritmů v počítačovém vidění. OpenGL (Open Graphics Library) je průmyslový standard specifikující multiplatformní rozhraní pro tvorbu aplikací počítačové grafiky. Používá se při tvorbě počítačových her, CAD programů a aplikací virtuální reality. Implementace OpenGL existují skoro pro všechny počítačové platformy, na kterých je možno vykreslovat grafiku. Existují implementace vestavěné přímo na grafické kartě a i softwarové implementace, které umožňují používat OpenGL 17
i na hardwaru, který pro něj není určen. To sebou samozřejmě přináší značnou ztrátu výpočetního výkonu. Pokud shrneme, jaké programy a knihovny byly k realizaci použity, ve výsledku dostáváme, že nebyl použit žádný komerční program ani knihovna. Z čehož je vidět, že k realizaci podobných úloh není potřeba žádného speciálního a ani komerčního softwaru.
18
8
Kalibrační vzor
Ke kalibraci musel být zvolen vhodný kalibrační obrazec. Jelikož funkce z knihovny OpenCV, které si dále představíme, jsou schopny vypočítat vnitřní a vnější parametry kamery za pomoci černobílé šachovnice. Nejmenší možný počet detekovaných vnitřních rohů je 4. Za předpokladu, že kalibrační obrazec tvoří obdélník nebo čtverec, nejmenší možný počet detekovaných rohů je 3, jeden roh se dopočítá. Na Obr. 8 je zobrazen nejmenší možný kalibrační vzor, který by mohl být použit ke kalibraci.
Obrázek 8: Nejmenší možný kalibrační vzor. Pro řešení reálné úlohy, kde působí mnoho faktorů, které mohou kalibraci znepřesnit, je dobré použít mnohem větší kalibrační vzor, než je nejmenší možný, aby kalibrace byla co nejpřesnější. Proto byl zvolen kalibrační vzor na Obr. 9, který má 8 sloupců a 6 řádků vnitřních rohů pro detekci a kalibraci. Velikost rozteče mezi rohy (délka hrany) je přibližně 28 𝑚𝑚.
Obrázek 9: Zvolený kalibrační vzor.
19
9
Hardware
K realizaci byl použit notebook (NB) značky ASUS, který obsahoval následující hardware. Procesor Intel Core 2 Duo s frekvencí jader 2400 𝑀 𝐻𝑧. Grafická karta nVidia GeForce 9500M s vlastní videopamětí o velikosti 512 𝑀 𝐵. Display o velikosti 15.4 palce s rozlišením 1440×900. Operační paměť o velikosti 3072 𝑀 𝐵 s frekvencí 667 𝑀 𝐻𝑧. K vývoji a testování programu byla použita webkamera integrovaná v NB. Vzhled a vlastnosti jsou vyobrazeny na Obr. 10, 11. Webkamera dokáže zachytávat snímky v rozlišení 160 × 120 𝑝𝑥 až 1280 × 1024 𝑝𝑥. Bylo použito rozlišení 640 × 480 𝑝𝑥, které je nominální pro zachytávané video, jak lze vidět na Obr. 11. Tento výpis (v pravé části Obr. 11) se zobrazí po zadání příkazu v4l-info v Terminálu, kde V4L je používaný kodek Video4Linux.
Obrázek 10: Použitá webkamera.
Obrázek 11: Vlastnosti webkamery.
20
10
Odhadnutí vnitřních a vnějších parametrů kamery pomocí známého kalibračního vzoru
V této kapitole si ukážeme, jakým způsobem byl proveden odhad vnitřních a vnějších parametrů kamery. K tomu byl využit kalibrační vzor z kapitoly 8 vyobrazený na Obr. 9. Dále byly použity programy a knihovny zmíněné v kapitole 7. Program byl odzkoušen na hardwaru z kapitoly 9.
10.1
Rozdělení programu
Program je rozdělen do následujících souborů: 1. Calibrate.cpp 2. CaptureImage.cpp 3. LoadMatrix.cpp 4. Main.cpp 5. OpenGL.cpp 6. SaveMatrix.cpp Každý z výše uvedených vyjma Main.cpp má k sobě hlavičkový soubor se stejným názvem, ale odlišnou příponou (.hpp). V průběhu programu mohou být využívány následující textové soubory, které obsahují data pro správný chod. 1. Camera_Deffault_Int_Matrix.txt 2. Camera_Ext_Matrix.txt 3. Camera_Int_Matrix.txt Camera_Deffault_Int_Matrix.txt obsahuje výchozí vnitřní parametry kamery. Tyto parametry byly odhadnuty na základě nejlepší věrohodnosti zobrazení objektů. Camera_Ext_Matrix.txt obsahuje vnější parametry kamery, pouze pro jeden právě zpracovávaný snímek. Camera_Int_Matrix.txt obsahuje vnitřní parametry kamery, které byly určeny výpočtem kalibrace. 21
Calibrate.cpp obsahuje funkce, které zajišťují samotnou detekci rohů a výpočet kalibrace. CaptureImage.cpp zajišťuje získání tří kalibračních snímků. Je použita pouze v případě, když není zvolena možnost načtení výchozích vnitřních parametrů kamery. LoadMatrix.cpp načítá výchozí vnitřní a vnější parametry kamery pro další využití. Main.cpp obsahuje hlavní funkci, která je volána ihned po spuštění programu. OpenGL.cpp obstarává vykreslování virtuálních objektů do scény a jejich pohyb po scéně pomocí klávesnice. SaveMatrix.cpp ukládá vnitřní a vnější matice do příslušných souborů ve správném formátu.
10.2
Spuštění programu
Po zpracování direktiv preprocesoru, lexikální a syntaktické analýze se provede sestavení programu, který se může spustit dvěma způsoby. 1. Bez parametru a nebo se špatným parametrem na příkazové řádce. 2. S nepovinným parametrem [
] na příkazové řádce. Při spuštění bez parametru na příkazové řádce program vypíše informativní text, který je zobrazen na Obr. 12 a načte výchozí vnitřní parametry kamery ze souboru Camera_Deffault_Int_Matrix.txt.
Obrázek 12: Spuštění programu bez parametru na příkazové řádce.
22
Při spuštění programu, s nepovinným parametrem [] na příkazové řádce, program vypíše informativní text a nápovědu pro ovládání. Parametr [] značí, že nebude načtena výchozí matice vnitřních parametrů kamery ze souboru Camera_Deffault_Int_Matrix.txt, ale bude vypočtena v kalibračním módu. Dále vyžaduje jako vstup pro výpočet vnitřních parametrů kamery tři snímky, které budou použity pro kalibraci, a proto by měly obsahovat kalibrační vzor z kapitoly 8, který by měl být zachycen z různých úhlů, pro co nejlepší výpočet. Při nesprávném výpočtu bude program vyžadovat tři nové kalibrační snímky.
Obrázek 13: Spuštění programu s nepovinným parametrem [] na příkazové řádce.
23
10.3
Programová realizace
10.3.1
Výpočet vnějších parametrů kamery
Při volbě spuštění programu s načtením výchozích vnitřních parametrů kamery, jak bylo zmíněno v kapitole 10.2, se použijí výchozí vnitřní parametry uložené v souboru Camera_Deffault_Int_Matrix.txt. Tyto parametry budou načteny pouze jednou a budou neměnné v průběhu programu. Při výpočtu vnitřních parametrů kamery pro každý snímek nedostaneme stejné hodnoty v porovnání s ostatními. To by znamenalo, že by každý snímek byl pořízen jinou kamerou, to ovšem není pravda. Naopak vnější parametry kamery se vypočítají pro každý snímek. Program nejdříve zavolá funkci int main(), ve které se volá funkce startGL(). Ta má na starost samotné volání funkcí pro OpenGL a jeho vykreslování. Dále volá funkce, které provádí samotnou kalibraci. Na ty se nyní zaměříme. Pro nalezení rohů na kalibrační šachovnici byla použita funkce cvFindChessboardCorners() z knihovny OpenCV. int cvFindChessboardCorners(const void* image, CvSize patternSize, CvPoint2D32f* corners, int* cornerCount=NULL, int flags); const void* image je zdrojový snímek, na kterém je zobrazena kalibrační šachovnice. Tento snímek musí být barevný a nebo v 256 odstínech šedi. V mém případě byl použit barevný snímek. CvSize patternSize je velikost šachovnice určená počtem vnitřních rohů. V mém případě, protože byl použitý kalibrační obrazec na Obr. 9, je tento počet dán. int column=8; int row=6; CvSize board_sz=cvSize(row,column); CvPoint2D32f* corners je výstupní pole detekovaných bodů v mém případě. CvPoint2D32f* corners=new CvPoint2D32f[row*column];
24
int* cornerCount=NULL je výstupní parametr, který určuje počet detekovaných rohů. int corner_count=0; int flags představují další možnosti nastavení. Použil jsem následující. CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS CV_CALIB_CB_ADAPTIVE_THRESH dovoluje použít přizpůsobivého škálování pro převod do odstínů šedi. Na rozdíl od pevně dané hodnoty se vypočítává z průměrné hodnoty jasu snímku. CV_CALIB_CB_FILTER_QUADS určuje další kritéria pro to, aby se mezi detekované rohy nezařadily i nesprávné. V této chvíli byly obdrženy detekované rohy. Tato detekce byla zpřesněna pomocí OpenCV funkce cvFindCornerSubPix(). void cvFindCornerSubPix(IplImage* Image, CvPoint2D32f* corners, int count, CvSize win, CvSize zeroZone, CvTermCriteria criteria); IplImage* Image je vstupní snímek, který musí být v odstínech šedi. Do tohoto formátu lze snímek z webkamery převést takto. cvCvtColor(image,image_GrayScale,CV_RGB2GRAY); Kde image je vstupní barevný snímek, image_GrayScale je výstupní snímek v odstínech šedi a CV_RGB2GRAY je metoda převodu, zde z RGB do GRAY. CvPoint2D32f* corners jsou výchozí body, které se mají zpřesnit. int count je vstupní parametr, který určuje kolik rohů má byt zpřesněno.
25
CvSize win určuje velikost prohledávaného okénka kolem detekovaného rohu udávaná v polovičním měřítku. Například, když je velikost okénka rovna (5,5) pak je prohledávaná oblast 5 · 2 + 1 × 5 · 2 + 1 = 11 × 11. V mém případě cvSize(11,11) CvSize zeroZone je takzvaná mrtvá oblast uprostřed prohledávaného okénka, která se neprohledává. Hodnota (-1,-1) znamená, že žádná taková oblast není. V mém případě cvSize(-1,-1) CvTermCriteria criteria reprezentuje zastavující podmínky, použil jsem následující. cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,30,0.1) Kde CV_TERMCRIT_ITER+CV_TERMCRIT_EPS znamená, že jako zastavovací podmínky zpřesňování rohů byly zvoleny, počet iterací a 𝜀, které představuje dosaženou přesnost.
Obrázek 14: Detekované rohy na kalibračním vzoru.
26
Nyní byla získána přesná poloha rohů, která byla potřebná k nalezení vnějších parametrů kamery. Vnější parametry byly získány z funkce cvFindExtrinsicCameraParams2(). void cvFindExtrinsicCameraParams2(const CvMat* objectPoints, const CvMat* imagePoints, const CvMat* cameraMatrix, const CvMat* distCoeffs, CvMat* rvec, CvMat* tvec); const CvMat* objectPoints je pole 3D bodů, které byly vytvořeny v reálném měřítku podle kapitoly 8 (Pozn. konstanta 28 v následujícím kódu představuje rozteč rohů, neboli délku hrany čtverce na kalibračním vzoru, v milimetrech). Kde 𝑍 souřadnice je rovna 0. CvMat* three_D_points=cvCreateMat(row*column,3,CV_32FC1); int m=0; for(int i=0;i
CvMat* tvec výstupní translační vektor. Tyto nalezené parametry nedosahovaly dostatečné přesnosti, proto se musela funkce cvFindExtrinsicCameraParams2() použít ještě jednou s dalším parametrem int useExtrinsicGuess. void cvFindExtrinsicCameraParams2(const CvMat* objectPoints, const CvMat* imagePoints, const CvMat* cameraMatrix, const CvMat* distCoeffs, CvMat* rvec, CvMat* tvec, int useExtrinsicGuess); Pokud hodnota parametru int useExtrinsicGuess je nastavena na 1, pak jsou parametry CvMat* rvec a CvMat* tvec použity jako výchozí odhady a jsou zpřesněny. Nyní byly získány vnější parametry kamery, které společně s výchozími vnitřními parametry jsou používány k zobrazování virtuálních objektů do reálného snímku. Při této volbě spuštění se tedy provádí výpočet vnějších parametrů kamery pro každý snímek. Pokud kalibrační vzor není celý v zorném úhlu kamery, a nebo je v poloze, kdy nelze detekovat všechny vnitřní rohy, tak je použita k zobrazení poslední správně spočítaná matice vnějších parametrů kamery [13]. 10.3.2
Výpočet vnitřních parametrů kamery
V kalibračním módu nejsou používány výchozí vnitřní parametry kamery, ale jsou vypočítávány ze tří vstupních kalibračních snímků, na kterých musí být zobrazen kalibrační vzor. Nejdříve jsou nalezeny rohy ve všech třech kalibračních snímcích funkcí cvFindChessboardCorners(), ty jsou zpřesněny pomocí cvFindCornerSubPix(). Dále je potřeba nalézt matici vnitřních parametrů kamery pomocí další z OpenCV funkcí cvCalibrateCamera2().
28
double cvCalibrateCamera2(const CvMat* objectPoints, const CvMat* imagePoints, const CvMat* pointCounts, CvSize imageSize, CvMat* cameraMatrix, CvMat* distCoeffs, CvMat* rvecs, CvMat* tvecs, int flags); Některé parametry jsou shodné s uvedenými výše, proto nebudou dále vysvětlovány. CvSize imageSize určuje velikost obrázku. V mém případě byl tento parametr nastaven jako velikost jednoho z kalibračních snímků, protože jejich velikost se nemění, bude jeho hodnota stejná. CvSize imageSize=cvGetSize(img0); CvMat* cameraMatrix je výstupní matice 3 × 3 vnitřních parametrů kamery, vzorec 7. CvMat* distCoeffs jsou vypočítané parametry čočky (𝑘1 , 𝑘2 , 𝑝1 , 𝑝2 [, 𝑘3 ]), které definují její zkreslení. CvMat* rvecs a CvMat* tvecs jsou výstupní vektory rotace a translace. V mém případě 𝑁 𝑈 𝐿𝐿. int flags představují další možnosti nastavení. Použil jsem flag CV_CALIB_FIX_ASPECT_RATIO která zajišťuje, že funkce bere v úvahu pouze 𝑐 (rovnice (7)) jako volný parametr [13]. Nyní jsme získali matici vnitřních parametrů, která byla uložena do souboru Camera_Int_Matrix.txt pro další použití v programu. Vnější parametry kamery, rotace 𝑅 a translace 𝑡, jsou vypočítávány stejně jako v kapitole 10.3.1.
29
11 11.1
Nastavení virtuální scény v OpenGL Nastavení vnitřních parametrů kamery
Nejdříve je potřeba nastavit vnitřní parametry kamery pro vykreslování objektů v OpenGL, ty se nastavují pouze jednou na rozdíl od vnějších parametrů kamery, které se mění s každým snímkem. Mezi vnitřní parametry kamery patří fovy, aspect, zNear a zFar. Tyto parametry formují prostor virtuální kamery, který je zobrazen na Obr. 15. Nastavují se pomocí funkce gluPerspective() z knihovny OpenGL. void gluPerspective(GLdouble GLdouble GLdouble GLdouble
fovy, aspect, zNear, zFar);
GLdouble fovy specifikuje velikost úhlu pohledu v ose y (f ield of view angle, in the y direction), jeho hodnota je zadávána v úhlových stupních. Vypočítá se jako )︁ (︁ 2 𝑎𝑟𝑐𝑡𝑔 ℎ𝑒𝑖𝑔ℎ𝑡 2𝑐 · 180, (20) 𝑓 𝑜𝑣𝑦 = 𝜋 kde height je výška zobrazovaného snímku v pixelech a c je konstanta z matice vnitřních parametrů kamery, vzorec 7. GLdouble aspect je hodnota poměru stran 𝑎𝑠𝑝𝑒𝑐𝑡 =
𝑤𝑖𝑑𝑡ℎ · 𝑎 , ℎ𝑒𝑖𝑔ℎ𝑡 · 𝑐
(21)
kde width a height jsou šířka a výška zobrazovaného snímku v pixelech. Konstanty a a c jsou získány z matice vnitřních parametrů kamery, vzorec 7. Jejich číselné hodnoty jsou stejné, protože ve funkci cvCalibrateCamera2() byla použita flag CV_CALIB_FIX_ASPECT_RATIO, jak bylo uvedeno v kapitole 10.3.2. Proto aspect v mém případě je 𝑎𝑠𝑝𝑒𝑐𝑡 =
𝑤𝑖𝑑𝑡ℎ 640 = = 1, ¯3. ℎ𝑒𝑖𝑔ℎ𝑡 480
(22)
GLdouble zNear a GLdouble zFar určují vzdálenosti od virtuální kamery k nejbližší a nejvzdálenější rovině. Jinak řečeno, virtuální objekty, které by byly před a nebo za těmito rovinami, by nebyly zobrazeny, Obr. 15. 30
Obrázek 15: Vnitřní parametry kamery v OpenGL.
31
11.2
Nastavení vnějších parametrů kamery
Vnější parametry kamery jsme získali v kapitole 10.3. Tyto parametry byly detekovány knihovnou OpenCV, která má odlišný souřadný systém od OpenGL. Proto bylo nutné vnější parametry kamery upravit, za účelem správného zobrazování 3D virtuálních objektů. Souřadný systém OpenCV je zobrazen na Obr. 16. Tento souřadný systém musíme transformovat do souřadného systému OpenGL. Souřadný systém OpenGL je pravotočivý a virtuální kamera v něm sleduje osu −𝑍.
Obrázek 16: Souřadný systém OpenCV. Při transformaci je potřeba nejprve změnit směr rotace os 𝑌 a 𝑍, Obr. 17.
Obrázek 17: Změna směru rotace os 𝑌 a 𝑍. Výše uvedená změna se v matici vnějších parametrů (𝐸𝑥𝑡 ) projeví vynásobením −1 na pozicích označených − v (23). Změna vyplývá z elementárních matic rotace v prostoru kolem jednotlivých os. ⎡ ⎢
𝐸𝑥𝑡 = ⎢ ⎢ ⎣
+ − − + − + + + − + + + 0 0 0 1 32
⎤ ⎥ ⎥ ⎥ ⎦
(23)
Dále je potřeba upravit směr os 𝑌 a 𝑍, Obr. 18.
Obrázek 18: Souřadný systém OpenGL. Úpravou matice 𝐸𝑥𝑡 z (23) získáme následující tvar. ⎡ ⎢
𝐸𝑥𝑡 = ⎢ ⎢ ⎣
+ − − + − + + − − + + − 0 0 0 1
⎤ ⎥ ⎥ ⎥ ⎦
(24)
Nyní jsme získali potřebné změny matice vnějších parametrů pro správné zobrazování virtuálních objektů v OpenGL scéně. Matice 𝐸𝑥𝑡 představuje změnu znamének pro transformaci mezi OpenCV a OpenGL. Takto upravenou matici zapíšeme do souboru Camera_Ext_Matrix.txt pomocí funkce saveCamera_Ext_Matrix(), ze kterého je následovně načtena a použita pro správné vykreslení virtuálních objektů do OpenGL scény. /* Load Extrinsic camera parameters. */ float *Ext_Matrix = loadCamera_Ext_Matrix(); glLoadMatrixf(Ext_Matrix);
33
12
Vykreslování virtuálních objektů
Dále pokud je nastavena scéna pro vykreslování virtuálních objektů, jak bylo popsáno v kapitole 11, můžeme začít s vykreslováním jednoduchých základních obrazců ve 3D, ze kterých se výsledný model skládá. Knihovna OpenGL poskytuje množinu základních obrazců, které se dají vykreslovat. Například GL_LINES, GL_LINE_LOOP, GL_TRIANGLES, GL_QUADS a mnohé další [12]. Pro jednoduchost a názornost byla vykreslena krychle bez horní stěny, každá stěna je obarvena jinou barvou, aby bylo jednoduché je od sebe rozeznat. /* Colors are in RGB formats. */ /* Testing object - noncomplete cube. */ float space=28.0; glBegin(GL_QUADS); /* Below, red. */ glColor3f(255.0f,0.0f,0.0f); glVertex3f(space*move_x+0.0f,space*move_y+0.0f,0.0f); glVertex3f(space*move_x+space,space*move_y+0.0f,0.0f); glVertex3f(space*move_x+space,space*move_y-space,0.0f); glVertex3f(space*move_x+0.0f,space*move_y+space,0.0f); . . . /* Reset color. */ glColor3f(255.0f,255.0f,255.0f); glEnd(); Video které je v reálném čase zobrazováno v OpenCV okně, je vykreslováno i v OpenGL okně. Je vykreslováno v dostatečné vzdálenosti, aby nedošlo k průniku s 3D objekty při pohybu kalibračního vzoru ve scéně. Pro lepší představu je toto znázorněno na Obr. 19. Obr. 20, 21 a 22 demonstrují výsledná zobrazení v kontextu s realitou. Je vykreslována barevná krychle bez horní stěny, se kterou lze pomocí kláves 𝑊 , 𝑆, 𝐴, 𝐷 pohybovat po kalibračním vzoru. Tento dokreslovaný virtuální objekt velmi realisticky zapadá do zobrazované scény. 34
Obrázek 19: Princip dokreslování virtuálních objektů do scény.
Obrázek 20: Ukázka vykreslení testovacího objektu.
35
Obrázek 21: Ukázka vykreslení testovacího objektu.
Obrázek 22: Ukázka vykreslení testovacího objektu.
36
13
Problém určení počátku vykreslovací soustavy
V kapitole 10.3 jsme za pomoci funkce cvFindChessboardCorners() detekovali vnitřní rohy kalibračního vzoru, Obr. 14. Pokud je kalibrační vzor v okolí horizontální polohy, může dojít k nežádoucímu efektu, kdy jsou rohy detekovány v opačném pořadí. Tento problém má za následek změnu počátku a proto vykreslované objekty po kalibračním vzoru mohou přeskakovat. Na Obr. 23 jsou naznačeny dva možné výsledky detekce rohů.
Obrázek 23: Porovnání možných detekcí rohů v oblasti okolí horizontální polohy kalibračního vzoru. Jedno z možných řešení je, že se do některého z bílých polí v kalibračním vzoru vloží vzor, který bude určovat v jakém rohu kalibračního vzoru je počáteční bod. Tímto vzorem může být například černá tečka, Obr. 24.
Obrázek 24: Černý vzor na jednom z bílých polí.
37
Nyní se ovšem musí zjistit v jakém ze čtyř možných polí vyobrazených na Obr. 25 je skutečně vzor pro určení počátečního bodu. Pomocí OpenCV funkce cvFillPoly by bylo možné překopírovat oblast ohraničenou mnohoúhelníkem a dále porovnávat s ostatními poli. Například v závislosti na hodnotě jasu, nebo na hodnotě součtu barev v oblasti. Takto lze vždy identifikovat pole, na kterém se nachází vzor pro určení počátečního bodu. Za předpokladu, že by byl vždy správně určen počáteční bod, se identifikované rohy přeřadí a vykreslované virtuální objekty se vykreslí korektně.
Obrázek 25: Oblasti zvolené pro prohledávání.
38
14
Závěr
Cílem bakalářské práce bylo vytvořit rozšířenou realitu. Do reálných snímků z kamery jsou dokreslovány virtuální objekty, které navozují dojem, že jsou součástí reality. Ke splnění tohoto cíle bylo potřeba vyřešit několik dílčích problémů. Nejdříve bylo potřeba pomocí známého kalibračního vzoru nakalibrovat kameru. Tedy odhadnout projekční matici 𝑀 , ze které byly odhadnuty vnitřní a vnější parametry reálné kamery. Tyto parametry byly dále použity pro nastavení virtuální scény v OpenGL. Další problém, který byl řešen, tkví v přechodu mezi OpenCV a OpenGL souřadnými systémy. Řešením je změna znamének v matici vnějších parametrů kamery 𝑀 . Následně bylo zapotřebí vykreslovat virtuální objekty do reálné scény reprezentované videem z webkamery. Na závěr bakalářské práce se pojednává o možnosti zlepšení funkčnosti vytvořeného programu. Konkrétně o odstranění efektu, kdy v okolí horizontální polohy kalibračního vzoru začnou virtuální objekty měnit počátek vykreslování. Všechny výše zmíněné problémy byly vyřešeny, popřípadě navrhnuty možnosti pro jejich řešení. Ve výsledku se podařilo vytvořit rozšířenou realitu, která působí velmi věrohodným a realistickým dojmem.
39
Reference [1] R. Azuma A Survey of Augmented Reality Presence: Teleoperators and Virtual Environments, pp. 355–385, August 1997. [2] http://www.esquire.com/cm/esquire/images/02-esquire-augmentedreality-covers-110909-lg-49479114.jpg [3] http://www.youtube.com/watch?v=9qqUrhGQEiE [4] http://us.playstation.com/games-and-media/games/invizimalspsp.html [5] http://en.wikipedia.org/wiki/Novarama [6] http://en.wikipedia.org/wiki/Sony_Computer_Entertainment [7] http://www.game-focus.com/UserFilesGF/Image/Sony/PSP/Invizimals/ invizimals.jpg [8] H. Ballard and Christopher M. Brown Computer Vision. Prentice Hall. [9] http://en.wikipedia.org/wiki/Kinect [10] http://i00.i.aliimg.com/img/pb/685/753/278/278753685_719.jpg [11] http://cs.wikipedia.org/wiki/Kalibrace [12] Dokumentace ke knihovně OpenGL. http://www.opengl.org/sdk/docs/man/ [13] G. Baradski & A. Kaebler Learning OpenCV Computer Vision with the OpenCV Library [14] M. Sonka & V. Hlavac & R. Boyle Image Processing, Analysis, and Machine Vision, Third Edition Chapter 11: 3D vision, geometry
40