270 likes | 368 Views
Számítógépes látás projekt. Match Move. Juhász Endre Muhi Kornél Urbán Szabolcs. Feladat.
E N D
Számítógépes látás projekt Match Move Juhász Endre Muhi Kornél Urbán Szabolcs
Feladat • Feladatunk egy mesterséges 3D objektum behelyezése egy rövid videófelvételbe úgy, hogy az a kamera mozgásának megfelelően együtt mozogjon a felvétel színterével. A cél, hogy a tárgy geometriailag illeszkedjen a környezetébe, nem szükséges valóban élethű megjelenést készíteni.
Változások a projektben • OpenCV 2.3 • Matlab R2008a • Az alkalmazás szeparálása 3 részre • Tracking • Kamera mátrixok, 3D pontok kiszámítása Matlabban • Szintetikus objektum megjelenítése, vegyítése OpenGL-ben • Próbálkozások: • Bundleadjustment paraméterezése • Előtér-szegmentációval történő takarás-kezelés
Algoritmus 1/3 • Kamera kalibrációja (a kamera belső mátrixának meghatározása) • Videó készítése a kalibrált kamerával • Jellemzőpontok detektálása - most a Shi-Tomasi módszerrel történik, amelyet a KLT algoritmussal követünk frame-rőlframre. • Minden frame-re: • a fundamentális mátrix meghatározása (Matlab-ban az előadáson vett módszerrel, illetve a Horn féle módszerrel) • a kamera projekciós mátrix meghatározása az esszenciális mátrixból • bundleadjustmentalkalmazása (jelen projektben csak egy framenkéntiLM-optimalizálás került be) • háttér-előtér pontok szűrése: frame-en detektált jellemzőpontok 3D mélység értékeit előállítva a jellemzőpontok klaszterezése előtér ill. háttér pontokra (mélység érték alapján) • a frame szegmentálása a [3] cikkben említett algoritmussal (az előző klaszterezés inputként történő felhasználásával) – mivel ehhez nem kaptunk implementációt, így a hasonló elven működő OpenCV-sGrabCutalg.-al
Algoritmus 2/3 • Objektum példányosítása, és elhelyezése az 1. frame-en (OpenGL-ben) • Első nekifutásra az objektum egyenes állású, a talapzata merőleges a képsíkra és egy fix Z mélységben van elhelyezve • A videó minden frame-jére, amelyhez rendelkezésünkre áll a kamera projekciós mátrix, hajtsuk végre a következőket: • Objektum kirajzolása OpenGL-ben a kamera megfelelő állása mellett • Kalibrált kamera szimulálása OpenGL-ben: • Az így kialakult kép kiolvasása: • Pixel értékek kiolvasása – eltárolása a pixelBuffer-ben
Algoritmus 3/3 • Minden frame-re készítsük el a frame és az objektum képének kompozitját - BlendedFrame • A szegmentációs algoritmusból kapott eredmény alapján az összevegyített kép pixeleit másoljuk, ha háttér pontról van szó, illetve az eredeti videóból másoljuk a pixelt ha előtért pontot vizsgálunk. Tehát minden OpenGL frame-re hajtsuk végre a következőt: • A BlendedFrame-t másoljuk az eredmény képre • A videó aktuális frame-jét a szegmentációs eredménnyel maszkolva másoljuk az eredmény frame-re (ahol a maszk 1-es volt, ott vannak előtér pontok, amik takarást jelentenek) • Az így kapott ResultFrame kép kimentése • Végül a kimentett ResultFrameképeket rakjuk össze egy folyamatos mozgóképpé (AVI video)
3D jellemzőpontok előtér-háttér szeparációja - konklúzió • A 3D jellemzőpontok pontosabb kiszámítása szükséges (esetleg nagyobb mértékű mozgás esetén pontosabban kiszámítható a háromszögelés, mint frame-rőlframe-re lépve), ekkor azonban csak X frame-enként állna rendelkezésünkre szegmentálási információ • Ötlet: minden frame-re az ő és a 10-el rákövetkező közötti elmozdulás alapján számolni, pl: • (1, 11) • (2, 12) • (3, 13) • é.í.t. (viszont ekkor szükséges, hogy a 10 frammel későbbi képen is legyen párja a jellemzőpontnak, egyébként nem működik) • Szofisztikáltabb küszöbölés szükséges (ha tudnánk a 3D objektum pontos helyzetét, ill. a térből nyert 3D pontok skálafaktorát) • Nem biztos, hogy az efajta szimpla küszöbölés elég, lehet azt kellene figyelni, hogy mely pontok azok amelyek viszonylag elől vannak, de mögöttük nincsenek más jellemző pontok (lásd később)
Következtetések • Helyes szegmentációs maszkokkal az ötlet életképesnek tűnik • Ehhez azonban finomítani kell még az első lépésen (előtér pontok kiszűrése). • A GrabCut algoritmus egyébként iteratív módon dolgozik, minél több iterációt engedünk meg neki, annál jobban finomítja az eredményt. Mivel ez az eljárás jelentősen lassítja az egész folyamatot (sokáig tart 1-1 frame szegmentálása), nagyobb teljesítményű számítógép sem ártana hozzá, illetve emiatt kénytelenek voltunk az iteráció számot minimálisra csökkenteni
Konklúzió a projektre • Az idő rövidsége alatt sajnos csak kezdetleges eredményeket tudtunk elérni • Sok gondunk volt a megfelelő részek integrációjával. Ennek ellenére megpróbáltuk a lehető legtöbbet kihozni a projektből, több vonalon elindulni, amennyiben egy megvalósítás nem bizonyult helyesnek • Hosszú távon úgy gondoljuk, hogy a projektet egységesen át kellene mozgatni Matlab-ba, ugyanis az OpenGL-es és OpenCV-s megoldás nehezen integrálható, és működésének helyessége is kérdéseket vet fel • Egyszerűbb lenne egy homogén rendszeren belül dolgozni • Az alap ötletek helyt álltak a projekt megvalósítása szempontjából, viszont a már említett implementációs nehézségek hátráltatták az igazán jó eredmények elérését