33PVR 2007 - DU-03 - Přenesení objektu mezi obrazy |
Zadání
Vstup: Naše známá sekvence
fotografií, ve které přibyl první obrázek vyfocený z kostkou.
Teď vám navíc můžeme prozradit, že obrázky byly vyfoceny kamerami s
konstantní maticí K intrinsických (vnitřních) parametrů. Tj. při
snímání jsme nehýbali se zoomem ani zaostřením, hýbal se pouze
fotoaparát jako celek. To lze dosáhnout tím, že zamkneme zaostřování -
lepší foťáky tuto možnost mají.
Výstup: Sekvence stejných
obrázků, ve kterých bude vložena kostka. Tj. vyrobíte obrázky
"02+kostka.jpg" až "17+kostka.jpg", které se budou mít k obrázkům
"02.jpg" až "17.jpg" jako se teď má "01+kostka.jpg" k
"01.jpg". Správnou pozici rohů kostky spočítáte z korespondencí
získaných v úloze DU-02 dle návodu níže. Správnou texturu přenesete na
strany kostky pomocí algoritmů z úlohy DU-01.
Úkolem je napsat automatický algoritmus v MATLABu, který toto udělá.
Termíny
- paralelka 101 do 29.5.2007 23:59
- paralelka 104 do 01.6.2007 23:59
Ti, co mají zkoušku v předtermínu, odevzdají na (libovolném) cvičení
před termínem zkoušky. Např. má-li někdo zkoušku 31. května, odevzdá
nejpozději 29. května (je-li z paralelky 104, přijde v úterý).
Podrobný postup řešení
- Zvolte souřadnou soustavu scény a spočítejte intrinsické
(vnitřní) parametry K první kamery. To uděláte následujícně:
- Myší naklikejte viditelné rohy kostky v prvním obrazu. Jejich
projekce v obrazu v homogenních souřadnicích označme vi.
- Zvolte (libovolně až na otočení, posunutí a měřítko) 3D
souřadnice odpovídající těmto rohům kostky. Tím zvolíte souřadnou
soustavu scény. Např. můžete zvolit jeden roh jako [0,0,0]'
(nehomogenní vektor) a délku hrany kostky rovnou jedné. Tyto body v
homogenních souřadnicích označme Yi.
- Spočítejte projekční matici M první kamery z rovnice
&lambdai vi = M Yi. To uděláte
podobným způsobem, jakým jste počítali homografii ze čtyřech
korespondencí v úloze DU-01, tj. vyřešením homogenní lineární
soustavy rovnic. Zatímco jste pro homografii potřebovali 4
korespondence, zde jich budete potřebovat 6 (přesněji pět a půl, ale
prakticky 6).
Nezapomeňte na normalizaci: aby to dobře chodilo, musíte
vynásobit body vi vhodnou maticí, aby jejich délka byla
zhruba 1. To se udělá nejlépe tak, že se osy obrázku transformují
tak, že uprostřed je nula a obrázek má šířku a výšku jedna. Příklad:
Je špatně, kdyz homogenní souřadnice obrazových bodů vstupujících do
kalibrace jsou např. [220,634,1]; musíte je transformovat tak, aby
byly např. [-0.4,0.8,1].
- Projekční matici M rozložíte podle vzorečku M = K R [I | -T], kde
K je (trojúhelníková) matice vnitřních parametrů, R je rotační matice
(tj. RR'=I) vyjadřujíci rotaci soustavy kamery vůči soustavě scény,
a T je (nehomogenní) vektor posunutí mezi soustavou kamery a
soustavou scény. Písmeno I označuje jednotkovou matici 3x3.
Tento rozklad uděláte pomocí RQ-rozkladu, obdobného známému
QR-rozkladu v lineární algebře. QR-rozklad je k dispozici v MATLABu,
RQ-rozklad se liší pouze přehozením matic a musíte ho udělat pomocí
QR-rozkladu a např. maticové inverze.
Důležitá poznámka. Matice K je dosti citlivá na přesné
naklikání rohů kostky. Přesněji, nejcitlivější je hlavní bod, daný
(nehomogenním) vektorem K([1 2],3). Naneštěstí, P3P algoritmus (viz
dole) potřebuje, aby matice K byla určená dostatečně přesně. Tedy je
kritické naklikat rohy kostky přesně a použít všech 7 viditelných
rohů. Pro kontrolu (po vydělění matice K skalárem K(3,3)): K(1,1) a
K(2,2) mají být zhruba stejné, K(1,2) zhruba nulový, a K([1 2],3)
zhruba ve středu obrázku. Pokud se to nepodaří, zkuste jedno z
následujícího:
- Nastavte K(1,1)=K(2,2) na průměr původních K(1,1) a
K(2,2). Nastavte K(1,2)=0. Nastavte K([1 2],3) na střed obrázku. Pak
musíte samozřejmě opravit R a T pro první kameru.
- Zkuste tyto rohy:
Y = [0 0 1 1; 1 0 1 1; 1 1 1 1; 0 1 1 1; 0 0 0 1; 1 0 0 1; 1 1 0 1],
v = [367.9 249.9;
501.7 377.0;
658.5 266.2;
520.8 148.1;
377.3 368.9;
499.8 490.6;
645.8 384.6].
- Zkuste tuto matici:
K = [2273.7 4.2 365.4; 0 2285 426.8; 0 0 1].
Za nic z toho neručíme!
Po splnění tohoto úkolu tedy máme spočítané vnitřní parametry
první kamery K a rohy kostky Yi. Víme, že i ostatní kamery
mají ty samé vnitřní parametry K. Víme, že body Yi určují
soustavu souřadnou scény, která (přirozeně) bude také ta samá pro
všechny obrázky.
- Spočítejte rovinu obrázku s Rumcajsem (v souřadné soustavě
scény). Tuto rovinu spočítáte z toho, že v ní leží tři dolní rohy
kostky.
Rovinu representujte sloupcovým homogenním 4-vektorem A. Pokud
bod X (také sloupcový homogenní 4-vektor) leží v rovině A, platí A' X
= 0. Z toho rovinu spočítáte pomocí SVD.
- Z korespondencí, které máte z úlohy DU-02, vyberte 3 body
X1, X2, X3 s následujícími
vlastnostmi:
- Tyto body neleží v jedné přímce.
- Tyto body pokrývají co možná největší plochu obrázku s Rumcajsem.
- Tyto body jsou vidět v celé sekvenci (tj. odpovídající tracky vedou skrz celou sekvenci)
nebo alespoň v její co největší části.
Projekce těchto bodů v t-tém obrazu sekvence označme
ut1, ut2,
ut3 (homogenní 3-vektory).
Spočítejte 3D souřadnice těchto bodů, reprezentované homogenními
4-vektory X1, X2, X3. To uděláte
tak, že protnete rovinu A a paprsky z kamery odpovídající bodům
u11, u12,
u13.
- Pro každý obraz t=2...17 spočítejte vnější parametry
Rt, Tt. To lze udělat ze tří bodů X1,
X2, X3 a z jejich projekcí
ut1, ut2,
ut3, při znalosti vnitřních parametrů K. Tento
problém se jmenuje "P3P problém" (point-three-point problem).
Řešení P3P problému není zcela snadné, neb vede na soustavu tří
kvadratických rovnic o třech neznámých. Řešení bylo popsané na
přednášce PVR v pátek 27.4. Zde jsou z ní slajdy
a zde je článek ze kterého slajdy
vychází (nešířit!).
Všimněte si: Může být až 16 reálných řešení pro Rt,
Tt (viz slajdy). Vyberte správné řešení takto:
- Nalezené Rt, Tt otestujete na
jiných bodech než X1, X2, X3 a
ut1, ut2,
ut3.
- Vyžijete toho, že znáte znaménka &lambdai a det
Rt. V prvním obrazu je známe a v ostatních obrazech budou stejná.
Toto je dále popsané také ve slajdech.
- Pomocí Rt, Tt přenesete rohy kostky z
prvního obrazu do všech ostatních.
- Pomocí algoritmu z DU-01 přenesete texturu z obrazu
01+kostka.jpg do ostatních obrazů. K tomu se vám nejspíše bude hodit
matlabská funkce 'poly2mask'.
Upozornění
Oproti DU-02 bude potřeba méně programování, ale bude třeba rozumět
geometrii. Je třeba každý kousek kódu pečlivě testovat a být zcela
jistý/á, že je správně. Opět, kdo si nechá úlohu na poslední chvíli,
nemá šanci to stihnout (čímž nesplní podmínky pro absolvování
předmětu). Proto doporučujeme průběžnou kontrolu
implementovaných výsledků v následujících třech cvičeních takto:
- Na 10. cvičení nám ukážete výsledek prvního bodu, tj. intrinsické
parametry kamery.
- Na dalším ukážete řešení P3P problému a drátový model kostek v jiných obrazech.
- Dále ukážete kostky i s texturou.