Módszerek

  • módszer

    Először egy már publikált módszert implementáltunk[2], hogy lehetőségünk legyen a saját megvalósítási ötleteinket összehasonlítani. Ennek a módszernek lényege az alábbi ábrán látható:


    1. ábra: Az első módszer folyamatábrája.
    • Feature pont kiválasztás

      A videó képet 4×4 régióra bontjuk, és mindegyikben meghározunk egy feature pontot (FP). Az lesz a régióhoz tartozó FP, amelyiknek a környezetében maximális a horizontális és vertikális deriváltak összege. Egy (x,y) pontban jelölje G(x,y) a két parciális derivált összegét:

      Ezzel a jelöléssel a FP kiválasztás az alábbi kritérium alapján történik:
      ahol pi az i-edik FP, R az aktuális kép régió, Bi az i-edik FP-hez tartozó kép blokk, amely egy FP középpontú kis méretű négyzet alakú része a képnek (a mi esetünkben pl. 7×7 méretű).

    • FP elmozdulásának meghatározása

      Az FP-k kiválasztása után a következő képkockán meg kell határoznunk azok elmozdulását. Ehhez bevezetjük az i-edik FP-hez és v elmozduláshoz tartozó SSD mértéket, melyet az FP körüli Bi blokkban számítunk az alábbi képlet alapján:

      Azt az elmozdulást választjuk minden ponthoz, amely egy adott keresési ablakon (W) belül a minimális SSD értéket adja:
      Ezt a módszert nevezik block-matching-nek. Működését két teszt képpel illusztráljuk, melyeken piros keretekkel vannak jelölve az FP középpontú blokkok.


      2. ábra: Átlagos block-matching SSD értékek a 16 darab FP-tól számított -20...+20 távolságban (vízszintes tengelyek) két különböző input képen. A felső képen a FP-ok egyedi környezettel bírnak, míg az alsó képen periodikus mintázatban helyezkednek el.

      Jól látható módon ennek a módszernek az a hátránya, hogy a valós elmozduláshoz képest az SSD minimuma ettől eltérő helyre kerül, melynek oka egyrészt a kép diszkretizációja, másrészt a képen ismétlődő kisebb minták jelenléte. Ezért a legjobb blokk illeszkedésen kívül figyelembe vesszük azokat a pontokat is, amelyek még bizonyos valószínűséggel takarhatják a valós FP elmozdulást. pi-hez tartozó lehetséges elmozdulások halmaza legyen Vi:

      ahol G(Bi) a Bi blokkon belüli (x,y) pontok G(x,y) értékeinek összege. k1 és k2 konstansokat kísérleti úton határozzuk meg, a mi esetünkben a k1=0,6 és k2=4 értékek bizonyultak használhatónak. A szóbajövő elmozdulások illusztrálására bemutatjuk az alábbi négy képet, melyeken kékre színeztük azokat a pontokat, melyek lehetséges elmozdulásai a zöld-piros FP-oknak. Érdemes megfigyelni hogy a sarokpontok elmozdulását nagy biztonsággal meg tudjuk határozni, az éleken elhelyezkedő pontok elmozdulása az éllel párhuzamosan bizonytalan, míg a viszonylag homogén területen az elmozdulás meghatározása minden irányban bizonytalan, amit a nagy kiterjedésű kék területek jeleznek:


      3. ábra: A zöld-piros FP-k lehetséges elmozdulásait kék pontok jelölik.

      Vi halmaz eltárolása helyett, csak azok kovarianciamátrixát (kis módosítással) tároljuk:

      Ezt a formulát részletesen indokolják a szerzők egy korábbi munkájukban[9].

    • Globális transzformáció meghatározás

      Az elmozdulás leírására nem a hagyományos transzformációs mátrixokat használjuk (affin transzformáció esetén 2x2 méretű mátrix), hanem egy Θ-val jelölt 4x1 méretű mátrixot:

      Ebben a módszerben tehát elmozdulást (Θ1 és Θ2), valamint forgatást és skálázást (Θ3 és Θ4) határozunk meg, melyet globális transzformációnak nevezünk az egyes képkockák között.

  • módszer (saját ötletek alapján)

    A meglévő megoldások és az elérhető könyvtárak alapján a következő saját megvalósítást tervezzük a feladat megoldására:


    4. ábra: Az általunk fejlesztett HCI algoritmus vázlata.

    A feature pontok meghatározására jó és hatékony implementációt találtunk OpenCV-ben. A függvény neve GoodFeaturesToTrack. Ez a pontok közül azokat választja ki, melyeknek lokálisan a legnagyobbak a Hesse mátrix sajátértékei.

    A pontok Lukas-Kenade szerinti követése szintén meg van valósítva OpenCV függvényként (cvCalcOpticalFlowPyrLK). Ez hatékony, mivel a pontkövetést két-szintű képpiramison végzi, template matching segítségével.

    Mivel a pont megfeleltetések túldefiniálják a transzformációt, ezért először az outlier-eket ki kell szűrni, amire a RANSAC algoritmust használjuk. Véletlenszerűen kiválasztott pontok által meghatározott transzformációra megnézzük hogy a többi pontmegfeleltetést mennyire elégítik ki valamilyen küszöb alatti hibával.

    ahol p-k a véletlenszerűen kiválasztott pontok, T pedig az affin transzformáció.

    Az i-edik pont szavazatszáma a j1, j2, j3 pontokra:

    ahol K tapasztalati úton választott küszöbérték (pl. 15), d euklideszi távolság, E pedig a hiba mértéke.

    A legjobb pontokat és a rájuk szavazó pontokat tartjuk meg. A megmaradó pontokból még mindig túldefiniált egyenletrendszert kapunk:

    A jobboldalon található inverz számítást SVD felbontással közelítjük.

    A mozgás utófeldolgozását jelenleg a 3 utolsó elmozdulás átlagolásával oldjuk meg.

    • A fejlesztés technikai részletei

      Egyik célunk, hogy a fejlesztett forráskódban csak ingyenes, open-source eszközöket használjunk, valamint a kód változtatás nélkül fordítható legyen az különböző platformokon (Windows és Linux).

      A fordítás előkészítését CMake-kel végezzük, amely egy konfigurációs text file-ból különböző platformokra előkészíti a fordítást, pl. GCC-hez makefile-t csinál, Visual Studio-hoz projekt file-t.

      Fordítási környezetün részleteit a következő címen publikussá tettük:
      http://opencvlibrary.sourceforge.net/Getting_started

      A kamera képeinek beolvasása, képfeldolgozó műveletek és numerikus műveletek elvégzéséhez az OpenCV könyvtár függvényeit használjuk.

    • A program használata

      A programot parancsori terminálból neye.exe futtatásával indítjuk, mely egy kötelezo paramétert vár, a böngészni kívánt képfájl nevét. Második opcinális paraméterként teszt input videófájlt lehet megadni, ezesetben ennek a képeit használja webkamera helyett.

      Futtatás közben az alább funkcióbillentyuket használhatjuk:

      's' : pozíció alaphelyzetbe állítás; 'r' : forgatás engedélyezés/tiltás; 'x' : kilépés; +/- : zoomolás.

      A képben való navigáció a feladatkiírásnak megfeleloen a webkamera mozgatásával történik.

    • Tesztelő környzet

      Az általunk fejlesztett HCI minoségét az alábbi teszt segítségével mérjük. Az 5. ábrán látható képeket nyitjuk meg navigáció céljából. A HCI segítségével úgy kell navigálni a képeken hogy a zöld pontból eljussunk a piros pontig, miközben a látómezo csak a fekete és sárga mezoket érintheti (a kéket nem). A kék mezok érintése hibának számít. A fekete utakon úgy kell haladni hogy mindig legyen sárga mezo a látómezoben. Ha a sárga mezon hurok van, akkor azon a helyen az egész hurkot látómezobe kell hozni. A három képen végighaladva számoljuk a hibák számát.


      5. ábra: Tesztképek navigációhoz.

      Vissza a lap tetejére