A megoldandó probléma
A rendszer működése
Architektúra terv
MatLab szkript
Előállított fájl formátumának specifikációja
Matlab szkript működési elve
Koordináta-geometriai alapok
Mérés
A program hiányosságai
Továbbfejlesztési lehetőségek
A MEASUREMENT osztály specifikációja
A program fordítása
A program használati utasítása
Letöltések
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 rendszer működése
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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:
- Az input kép Canny--éldetektálása ( findlines.m )
- Az él-képre Hough--transzformáció végrehajtása
- 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:
- A beolvasandó kép neve
- Az output fájl; a detektálandó vanishing pointok tárolási helye (a fájl specifikációját lásd lejjebb)
- 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.
- 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.

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.


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ő.

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.
|