Laboratorní práce z předmětu Počítačové vidění pro informatiku, 33PVI
Milan Krčmář, letní semestr 1999/2000
Spojte dva navazující obrazy focené z jednoho místa pouze otočením kamery do jednoho pomocí zadaných korespondujících bodů.
Odvození spojení obrazů vychází z matematického modelu
kamery. Ve světovém souřadném systému (ortonormální báze) je umístěn pozorovaný
bod o souřadnicích[1] a kamera, jejíž střed promítání je v bodě
. Tento bod se do obrazu kamery promítá do souřadnic
. Bodová matice obrazu má pouze dvě souřadnice,
a
, třetí se udává pro usnadnění dalšího zápisu. Na jeden bod
se zobrazí celá přímka bodů
. Rovnice této přímky je
Parametrem přímky je ,
je ortonormální rotační matice, která otáčí rozdílný vektor
tak, aby světový souřadný systém byl kolmý na promítací rovinu kamery, matice
vystihuje transformaci kamery, říká se jí kalibrační matice.
Z této rovnice lze osamostatnit
, dostáváme konečný tvar
,
ve kterém je rozšířen o čtvrtou jednotkovou souřadnici. Matice
je jednotková 3,3.
Zadání předpokládá, že jsou obrazy „focené z jednoho
místa“. Znamená to, že kamera měla vždy stejnou polohu středu promítání, pouze
se otočila. S výhodou volíme světový souřadný systém tak, aby měl počátek
právě ve středu promítání, vektor bude potom nulový. Snímky označíme čísly 1 a 2. Pro jediný
bod viditelný na obou snímcích musí platit zároveň rovnice obou kamer:
a
U příslušných hodnot jsou indexy , protože budeme pracovat s více body a tyto rovnice
musí platit pro každý (obecně
-tý) bod. Pokud z levé rovnice vypočítáme
a dosadíme do pravé (zároveň vynecháme násobení maticí
v závorce, čímž se nám zkrátí
na tři složky), dostaneme
.
Součin matic sloučíme do jedné, sloučíme podíl koeficientů do jednoho koeficientu a dostáváme konečný vztah pro transformaci bodů jednoho obrazu do druhého
.
Abychom zjistili transformaci všech bodů, stačí znát matici , koeficient
lze vypočítat z pravé strany a podmínky, že třetí složka
musí být rovna jedné. Matici
rozepíšeme na tři řádkové vektory
.
Maticový výraz rozepíšeme do tří rovnic, ve třetí rovnici se
na levé straně vyskytuje pouze , tak ji dosadíme do prvé a druhé rovnice. Dostáváme soustavu
.
Tuto soustavu dále rozepíšeme na jednotlivé složky a
seřadíme podle indexů položek matice :
Pokud takto sestavíme rovnice pro všechny zadané korespondující body, dostaneme soustavu, jejíž maticový zápis je
.
Matice obsahuje koeficienty dané korespondujícími body, vektor
obsahuje prvky matice
čtené po řádcích. Je jich 9. Řešení nemusíme mít jediné,
stačí nám jednodimenzionální prostor, protože pro různá řešení budou pouze
vycházet různé koeficienty
. Matice
tedy musí mít hodnost 8. Potřebujeme tedy aspoň 4 dvojice
korespondujících bodů, pokud nejsou po třech kolineární, přispívá každá ke
zvýšení hodnosti matice o 2. Prakticky ale bude řešení složitější, protože
jednak nemáme naměřeny body naprosto přesně, což ovlivní hodnost matice, jednak
chceme mít možnost použít metodu i na větší počet zadaných korespondujících
bodů. Proto se výsledná matice, získaná ze všech (aspoň čtyřech)
korespondujících dvojic upraví tak, aby měla hodnost 8 a byla zároveň „blízká“
matici původní. Za míru se zde považuje součet druhých mocnin odchylek všech
prvků. Tuto matici lze najít pomocí metody SVD, která jako vedlejší produkt
spočte přímo vektor
. Aby SVD pracovala
správně, je vhodné, aby rozptyl koeficientů v matici byl co nejmenší.
Konstanty v matici jsou nuly a jedničky, volíme standardní normalizaci,
která zajistí, aby střední hodnota souřadnic bodů byla nulová a aby souřadnice
byly v rozsahu ±1:
,
,
,
.
Když známe vzájemné transformace mezi obrazy, můžeme přistoupit ke spojení obrazů. Při připojení bodů obrazu 2 k obrazu 1 se postupuje tak, že se vypočítá výřez (hranice) obrazu 1, kam se obraz 2 bude transformovat. Potom se berou jednotlivé body výřezu obrazu 1 a zpětnou transformací se zjišťuje místo, kam by se promítly do obrazu 2. Určí se barva tohoto místa a ta se nastaví bodu obrazu 1. Jas se určuje dvěma způsoby, buď se najde nejbližší skutečný bod (nejbližší soused), nebo se interpoluje barva ze čtyř nejbližších sousedů. Pokud označíme jasovou funkci obrazu 1 jako I a podobně J u obrazu 2, bude platit:
Úlohu jsem ověřil v programu MatLab. Korespondující body jsem vkládal pomocí nástroje CorrGUI. Nejdříve jsem zkusil sestavit obrázky ze zadaných čtyř korespondencí, tím jsem dostal následující výsledek. Na obrázku je zvětšeno místo napojení.
Potom jsem zkoušel volit body tak, abych odstranil shod v napojení. Nejlepší výsledek, jakého jsem dosáhl pro 4 korespondující dvojice bodů, ukazuje další obrázek.
Změnil jsem pořadí a vkládal levý obrázek do pravého.
Při zadání většího počtu se mi nepodařilo dosáhnout lepšího výsledku, než se 4 dvojicemi. Následující obrázek je pro 8 dvojic, z nichž 4 jsou z obrázku minulého.
Je potřeba zadávat body pořádně. Corrgui nabízí zvětšení obou obrázků, takže je možno body trefit s větší přesností. Tento postup se mi osvědčil.