Eredmények


A megoldandó probléma

A single view metrology a számítógépes látás és képfeldolgozás egyik problémája, ahol egy perspektivikus fotó által ábrázolt jelenet térbeli mértékeit szeretnénk meghatározni. Ehhez szükséges megadni a kép egy referenciaobjektumának pontos méretét (pl. az alábbi képen az oszlop magasságát) és ezen ismert adat birtokában meghatározható a kép más objektumainak mérete (az ember magassága).

A két objektum kapcsolata a vanishing line-al


A rendszer működése

  1. A bemeneti képet (input image) paraméterként megkapja egyrészt a C++ nyelven megírt grafikus felülettel ellátott kezelőprogram (GUI+I/O), másrészt a MatLab.
  2. A MatLab egy algoritmus-szkriptet értelmezve meghatározza a kép vanishing point-jait, melyek koordinátáit egy szöveges fájlban (input data) elmentve paraméterként megkapja a kezelőprogram.
  3. A kezelőprogram irányítja az input/output műveleteket, a felhasználó számára interaktívan biztosítja a képen való objektumkijelöléseket valamint az esetleges input adatok -- referenciaobjektum mérete -- bevitelét.
  4. Az input data-t feldolgozza a program, majd egy listában megjeleníti a kép vanishing point-jait, melyből a felhasználó kijelölheti azt a kettőt, melyek együttese megadja a mérés alapjául szolgáló vanishing line-t.
  5. Amint a két vanishing point ki van jelölve, a GUI+I/O létrehoz egy MEASUREMENT objektumot a measurement konstruktor meghívásával.
  6. A képen kijelölünk egy referenciaobjektumot, megadjuk méreteit majd az adatokat átadjuk a MEASUREMENT objektumnak a setRefData metódus segítségével.
  7. Tetszőleges számban kijelöljük a mérendő objektumokat azok tető--, és talppontjaik megadásával, majd átadjuk az adatokat a MEASUREMENT objektumnak a setMeasureCoordinates metódussal.
  8. A MEASUREMENT objektum kiszámolja a mérendő objektum méretét. Az eredményt a calculateSize metódus segítségével szolgáltatja a GUI+I/O rendszernek, amely megjeleníti az eredményt. Az utolsó két lépés tetszőleges sokszor elvégezhető

Architektúra terv



MatLab szkript

A programunk által használt MatLab szkript internetes forrásból származik: http://www.dia.uniroma3.it/~iarusso/Seminari\%202004 2005/TesinePrededenti/aa0405. Feladata egy inputként megadott kép vanishing point-jainak detektálása és a GUI+I/O modul számára ezen adatok biztosítása egy fájlban eltárolva. A VP-detektálás lépései a következők:

  1. Az input kép Canny--éldetektálása ( findlines.m )
  2. Az él-képre Hough--transzformáció végrehajtása
  3. A Hough-trafó által generált egyenesek metszéspontjai közül a potenciális vanishing point-ok kigyűjtése
    ( findvanishingpoints.m )

A teljes algoritmus az (általunk implementált) vanishing_point.m szkript elindításával futtatható a következő paraméterezéssel:

  1. A beolvasandó kép neve
  2. Az output fájl; a detektálandó vanishing pointok tárolási helye (a fájl specifikációját lásd lejjebb)
  3. true színes kép esetén
    false szürkeárnyalatos kép esetén
    a paraméter feltüntetése azért szükséges, mert színes (RGB) képek esetén el kell végeznie a programnak egy szürkeárnyalatosra konvertálást.
  4. true ha a kép által ábrázolt jelenet zárt térben (egy szobában) fekszik
    false "szabadtéri" képek esetében

A szkript egy lehetséges paraméterezése a következő:
vanishing_point('fenykep1.jpg', 'fenykep1.dat', false, false);

Előállhat olyan eset amikor a vanishing point-ok nem jó poziciókban helyezkednek el a detektálás pontatlansága miatt. Ekkor a felhasználónak lehetősége adódik arra, hogy a vanishing line-t meghatározó pontokat kézzel, egérkattintással helyezze el.


Az előállított fájl formátumának specifikációja

A generált fájl egész számokat tartalmaz legalább 2 sorban. Minden sora két egész számot tartalmaz szóköz-karakterrel elválasztva. Az i-edik sor a kép i-edik vanishing point-jának pixeles koordinátáit tartalmazza Az x és y koordináták lehetnek bal alsó origó módszerrel (x balra, y fel) vagy mátrix (x. sor, y. oszlop) módszerrel generáltak, de mindenképp a GUI-nak legmegfelelőbb módon kell legenerálni őket. A jelölésmódot a GUI fejlesztője határozza meg az input data fájl generálója számára.


Egy példa adatfájl (A mellékelt Krakko20.jpg kép vanishing point-jai):

234 456
-1 356
120 765


MatLab szkript működési elve

A képre először végrehajtunk egy Canny-éldetektálást. A Canny-éldetektor a ma ismert éldetektorok egyik legjobbika. Mivel az eredménykép 1 pixel vastagságú vonalakat tartalmaz csupán, nem kell különbséget tenni vastag és vékony vonalak között.

Példa Canny éldetektorra

A Canny éldetektálás eredménye

Az éldetektált képre végre kell hajtani egy Hough-transzformációt.
A Hough-transzformáció eredményeként előállt egyeneseket halmazokba soroljuk. Ha két adott egyenes között a szög kicsi, akkor egy halmazba kerülnek, különben új halmazt nyitunk. A besorolás után töröljük azokat a halmazokat, amelyek nagyon kevés elemszámúak.

Halmazokba sorolt egyenesek

Egyenesek törlés után

A halmazokba sorolt egyenesek törlés előtt és törlés után

Az élekhez tartozó egyenesek egy perspektivikus képen általában nem egy pontban metszik egymást a raszteres ábrázolásból eredő pontatlanság miatt. Ezért az "egy pontban metszés" fogalmat úgy kell módosítanunk jelen esetben, hogy "egy adott sugarú körben metszés". E kör sugara annál nagyobb, minél távolabb esik a középpontja a kép középpontjától, mert annál nagyobb a pontatlanság. Ezzel nem kell törődnünk, mert minél távolabb vannak a metszéspontok, annál kevésbé számít a hibás pozíciójuk. Az isdoor - paramétert true -ra állítva az algoritmus feltételezi, hogy sokkal kevesebb egyenes áll rendelkezésre, így a körök méretei kisebbek. A módszer alkalmazásának hatására a vanishing point-ok azon körök középpontjai lesznek, melyek "nagyon sok" egyenes metszéspontjaiként állnak elő.

pontok

Középponttól távoli és közeli körök mérete

Az algoritmus a három legvalószínűbb vanishing point-ot adja eredményül. Egy VP annál valószínűbb, minél több egyenes metszéspontja.



Koordináta-geometriai alapok

A két ponton átmenő egyenes egyenlete

Mivel egy egyenes megadható az y=Mx+b általános alakban, a két összefüggés alapján meghatározható a következő két tulajdonság:

Függőleges egyenesek esetében a módszer ilyen formában nem alkalmazható a 0 nevező miatt. Ekkor vektoros vagy polárkoordinátás reprezentációt használva a probléma megoldódik.

Legyen két, egymással nem párhuzamos egyenes egyenlete a következő:

Ezek alapján meghatározható a két egyenes (x0,y0) metszéspontja, ahol


Mérés

A fenti koordináta-geometriai tulajdonságokat felhasználva meghatározható a referencia objektum paramétereinek ismeretében a mérendő objektum magassága. Legyen

  • meretMerendo a mérendő objektum mérete pixelben,
  • meretMerendoVanish a mérendő objektum talppontja és az (x_MV,y_MV) pont távolsága pixelben,
  • refsize az általunk megadott referenciaobjektum méret

Ekkor a mérő algoritmus a következő:

Abnormális eredmények generálódhatnak majdnem párhuzamos egyenesek mérésekor. Vegyük azt a speciális esetet, amikor a mérendő--, és a referenciaobjektum talppontjainak y koordinátái között csupán 1 pixelnyi eltérés van. Ekkor -- kellően nagy méretű kép esetén -- előfordulhat, hogy a talppontokat összekötő egyenes és a vanishing line metszéspontjának x koordinátája nagyobb (kisebb) lesz, mint az adott C++ fordító által ábrázolható legnagyobb (legkisebb) szám.

Ilyenkor szintén feltesszük, hogy a két objektum egymás mellett áll. Az elfogadott metszéspont értékét MIN_LONGINT és MAX_LONGINT között határoztuk meg, így biztos minden fordítóval generált kód helyesen fut.


A program hiányosságai

Nem kellően ideális képek esetén a MatLab szkript túl sok hamis vanishing point-ot generál, ami nehézkessé teszi a program használatát.

Abban az esetben is probléma adódik, ha referenciaobjektum a vanishing line-on "áll", vagyis talppontja megegyezik (x_t, y_t)-vel Ugyanilyen helyzet áll elő, ha a mérendő objektum áll a vanishing line-on.. Ekkor a mérendő objektum magassága mindig végtelen lesz a referenciaobjektum méretétől függetlenül:


Továbbfejlesztési lehetőségek

A program több irányba is továbbfejleszthető:

  • A program jelen változata a vanishing line-ra merőleges irányt veszi "függőleges"-nek, a számításokban nem veszi figyelembe a függőleges vanishing point elhelyezkedéséből adódó perspektivikus torzítást.
  • MatLab szkript automatikus elindítása a C++ programból egy wrapper felület alkalmazásával. Így a felhasználónak csak egy felületet kell kezelnie.
  • A kijelölendő objektumok határainak pontosabb megadásához hasznos lehet a zoomolás-funkció bevezetése.
  • A program fordításához Microsoft Visual Studio 6.0 szükséges, ezért a végeredmény nem platformfüggetlen. Kialakítható lehet egy Linux operációs rendszer alatt futó változat is.


A MEASUREMENT osztály specifikációja

class measurement{
private:
    int width; //kép szélessége
    int height; //kép magassága

    int vp1_x; //1. vanishing point x koordinátája
    int vp1_y; //1. vanishing point y koordinátája

    int vp2_x; //2. vanishing point x koordinátája
    int vp2_y; //2. vanishing point y koordinátája

    int reftop_x; //ref.obj. tetejének x koordinátája
    int reftop_y; //ref.obj. tetejánek y koordinátája

    int refdown_x; //ref.obj. aljának x koordinátája
    int refdown_y; //ref.obj. aljának y koordinátája

    float refsize; //referencia objektum mérete

 public:
    measurement (int w, int h, int vp1_x, int vp1_y, int vp2_x, int vp2_y);

    void setRefData (int reftop_x,
                                   int reftop_y,
                                   int refdown_x,
                                   int refdown_y,
                                   float refsize);

    void setMeasureCoordinates (int mtop_x, //mérendő tetejének x koord.
                                   int mtop_y, //mérendő tetejének y koord.
                                   int mdown_x, //mérendő aljának x koord.
                                   int mdown_y); //mérendő aljának y koord.

    float calculateSize (); //mérendő objektum méretét meghatározó metódus

};


A program fordítása

A program fordításához Visual Studio 6.0 fejlesztőkörnyezetre és a WxWindows (vagy WxWidgets) API-ra van szükség. A Visual C++ Project Settings menüpontjában a következő paramétereket kell beállítani.

  • C/C++ => Preprocessor => Additional Include Directories - Írjuk be a Wx Windows könyvtáron belül /include és /lib/msv könyvtárak elérési útjait
  • Link => Input => Object/Library Modules - a következő bejegyzéseket írjuk ide:
    .../lib/zib.lib.../lib/regex.lib.../lib/tiff.lib.../lib/png.lib.../lib/jpeg.lib.../lib/wxmsw.lib
  • Resources => Additional Resource Include Directories - Írjuk be: .../include

A fenti beállítások csak Release módra érvényesek. Debug módnál annyi különbség van, hogy a megfelelő helyeken msw helyett mswd bejegyzést kell írni, valamint minden lib--név végére egy "d"-karakter kerül (pl.: lib/jpegd.lib ).


A program használati utasítása

A program elindulása után be kell tölteni a képet (File/Open image) illetve a vanishing point-okat tartalmazó fájlt (File/Open VP File).
A kép betöltése után a pontokat nemcsak fájlból tölthetjük be, hanem kézzel is megadhatjuk a kezelőfelület jobb oldalán található Add Vanishing Points gombra kattintva. Ebből a funkcióból a Stop Adding gomb megnyomására léphetünk ki.

A mérés megkezdéséhez szükségünk van a vanishing line-ra, amit két vanishing point kiválasztásával jelölhetünk ki a programablak jobb oldalán található listából. A képen ekkor megjelenik a két VP zöld kereszt formájában (amennyiben a képen van), valamint az általuk meghatározott vanishing line, ami egy zöld egyenesként ábrázolódik.

Ezután kattintsunk a kijelölendő referenciaobjektum tetőpontjára, majd az egér gombját lenyomva tartva húzzuk a mutatót az objektum talppontjához és engedjül fel a gombot. A megjelenő kék szakasz mutatja a kijelölt objektum képbeli pozícióját. Most a Ref. object size mezőbe írjuk be az objektum egy metrikus egységbeli méretét. Kattintsunk a Define ref.object nyomógombra, aminek hatására a szakasz piros színűre változik, a végpontjainál keresztek jelennek meg. Ezzel a referenciaobjektum definiálását befejeztük.

A mérendő objektum kijelölése az előzőekhez hasonló módon történik annyi különbséggel, hogy neki nem kell méretet megadni (ugyanis épp erre vagyunk kiváncsiak), és definiálni sem kell RF-ként az erre szolgáló gombbal. Az objektum -- kijelölése után -- kék szakaszként látszik.

Ezt követően a Measure gombra kattintva hajtódik végre a mérés, aminek eredménye a gomb alatti
Measurement mezőben jelenik meg piros színnel.


Letöltések

Futtatható program letöltése itt

Program forrásának letöltése itt

A program fordítási beállításainak - használati útmutatójának letöltése itt

Prezentáció a védéshez letölthető innen

Példaképek és adatfájlok letölthetők innen


A teljes PDF dokumentáció (milestone1) letölthető innen.

A teljes PDF dokumentáció (milestone2) letölthető innen.

A teljes PDF dokumentáció (milestone3) letölthető innen.


Valid CSS!    Valid XHTML 1.0 Transitional