KMOP-1.1.2-08/1-2008-0002 jelű pályázat kutatási részjelentése (IRIS rendszer)
Szendrei Rudolf 2011. január
Tartalomjegyzék Előszó..........................................................................................................................................3 Felhasználói dokumentáció.........................................................................................................3 A GeoFilterBank kezelőfelületének ismertetése....................................................................3 Nyomkövetési opció fejlesztéshez.........................................................................................6 A program moduljai közötti XML információk struktúrája...................................................8 Többnyelvűség támogatása a programban.............................................................................8 Példák.....................................................................................................................................9 Példa Import modul fejlesztésére.......................................................................................9 Példa Export modul fejlesztésére.....................................................................................10 Példa Szűrő modul készítésére........................................................................................11 Fejlesztői dokumentáció...........................................................................................................13 A rendszer – áttekintés.........................................................................................................13 Import bővítmények.........................................................................................................14 Export bővítmények.........................................................................................................15 Szűrő bővítmények..........................................................................................................17 A keretrendszer.....................................................................................................................22 GeoFilterBank – GeoViewer komponens........................................................................22 GeoFilterBank – Keretrendszer.......................................................................................27 Modulok közötti XML információk struktúrája..............................................................40
Előszó A felhasználói dokumentáció az IRIS szoftver GeoFilterBank alkalmazásának felhasználói eseteit tartalmazza, valamint az Import, Export és Filter modulok felhasználói fejlesztéséhez szükséges példákat. A dokumentáció nem tartalmazza a speciális szűrőmodulok használatának leírását.
Felhasználói dokumentáció
A GeoFilterBank kezelőfelületének ismertetése
1. ábra A program főablaka A program főablaka egy keretet biztosít a megnyitott képek számára, melyek ezen belül külön ablakokban jelennek meg. A fájlokkal kapcsolatos műveletek a Fájl menüpontban vannak csoportosítva (megnyitás, mentés, megnyitott kép bezárása, kilépés a programból, lásd 1. ábra). A képek megnyitása és mentése a program Import, illetve Export moduljainak segítségével történik, így a támogatott formátumok ezek függvényében változhatnak.
2. ábra Kép megnyitása a programban A kép megnyitása után a főprogram keretablakán belül egy új ablak jön létre, amely tartalmazza a megnyitott képet, valamint olyan alapvető képkezelési funkciókat lát el, mint a kép vonszolása, nagyítása, kijelölés a képen.
3. ábra Megnyitott kép a program gyerekablakában A megnyitott kép információi a Nézet menüpont Kép információ pontjában érhető el (lásd 5. ábra). A megnyitott képpel kapcsolatos műveletek három menüpontba kerültek csoportosításra. Az első a Szerkesztés menüpont, ahol két parancs található: a képi kijelölések megszüntetése, illetve a kijelölt téglalap alakú területből egy új kép létrehozása (lásd 4. ábra).
4. ábra A szerkesztés menüpont parancsai Az interaktív képeszközök a Nézet menüpontból érhető el (lásd 5. ábra). Az Eszköztárra kattintva megjelenik az aktuális képhez tartozó eszköztár, míg a Kijelölések és Gördítősávok menüpontokra kattintva elrejthetők, illetve láthatóvá tehetők az aktuális kép ablakjában a megfelelő vezérlőelemek.
5. ábra Nézet menü Az eszköztárban négy művelet, valamint a kép nagyítása/kicsinyítése funkció érhető el. A műveletek sorrendben a következők: A képen korábban végzett kijelölés kiválasztása, kép vonszolása, téglalap kijelölés készítése a képen, poligon kijelölés készítése a képen. A poligon kijelöléssel kapcsolatban csak olyan kijelölést enged meg a program, amelyben az oldalak nem metszik egymást. Az eszköztáron a kiválasztott funkció, illetve a nagyítási méret a megnyitott képek közötti átváltásnak az aktuális képhez tartozó beállításokra automatikusan átáll.
6. ábra Eszköztár (Toolbox) A megnyitott képpel végezhető műveletek harmadik csoportja a Szűrők menüben került elhelyezésre. Ebben a menüpontban azok a képfeldolgozó szűrők találhatóak meg, amelyek a program futtatási könyvtárában rendelkezésre állnak.
7. ábra A Szűrők menüpont és a szűrők alkalmazásának alapbeállításai
A szűrők végrehajtási módját a keretprogramban további lehetőségek alapján lehet befolyásolni. Mielőtt a felülírási mód beállításairól szólnánk, a kifejezést úgy definiáljuk, hogy egy szűrő támogatja a felülírást, ha a kép megváltozik, amelyen a szűrőt végrehajtjuk (az eredmény ezen a képen jön létre). Amennyiben a felülírást nem szeretnénk, akkor az eredeti kép megmarad a programban és egy új kép jön létre a végrehajtás eredményeképp. A programban ez a beállítás úgy befolyásolható, hogy a Felülírási mód almenüjében kiválasztjuk a nekünk megfelelőt. Mivel nem minden szűrő támogatja a felülírási lehetőséget, így csak azt várhatjuk el, hogy ha rendelkezésre áll ez a lehetőség, akkor kívánjuk-e használni, valamint azt, hogy a szűrő végrehajtása előtt erre rákérdezzen-e a program. A Szűrők menüpont szintén szűrővégrehajtást befolyásoló opciója az nCore! MultiThreading. Ennek használatával lehet megengedni, illetve letiltani azt, hogy egy szűrő futhat-e többprocesszoros üzemmódban. Megjegyezzük, hogy nem minden szűrő rendelkezik feltétlenül többprocesszoros üzemmóddal, ilyenkor ezek egy processzoros üzemmódban kerülnek végrehajtásra. Szintén lehetséges, hogy egy szűrőnek a fejlesztője kizárólag többszálúként implementálta a szűrőjét, így ez az opció nincs hatással a szűrőre. Fejlesztői felhasználók számára fontos lehetőség lehet a Szűrők menüpontban a Szűrőlista frissítése. Ez akkor használható, ha új szűrő kerül be a program könyvtárába, miután a program már elindult. A program futásakor betöltött szűrők fájljai nem írhatók felül amíg a program fut.
Nyomkövetési opció fejlesztéshez A program lehetőséget biztosít a felhasználóknak arra, hogy az általuk fejlesztett modulok működését a programban nyomon tudják követni. A nyomkövetés a főprogram, illetve a modul közötti információáramlás megjelenítését jelenti, amelyet ki/be lehet kapcsolni a Nézet menüpont Fejlesztői üzemmód opciójával. Az információcsere egy XML nézőben tekinthető meg (lásd 8. ábra).
8. ábra XML információk megtekintése Fejlesztői üzemmódban
A program moduljai közötti XML információk struktúrája Felülírási mód engedélyezve van-e: 0/1Párhuzamosítás interferenciaparamétere Multithreading engedélyezett-e: 0/1 A szűrő leállítási jelének memóriacíme A szűrő folyamatának előrehaladta A szűrő által végzendő teljes „munka”
Bemenő képek száma Kimenő képek száma
1. bemenő kép tulajdonságai <Width> Kép szélessége Kép magassága <Stride> Kép egy sorának bájtmérete <Packed> Pixel csatornaértékei szoros egymásutánban vannak-e Csatornák adatai össze vannak-e fésülve Hány bites egy pixel Kép memóriacíme Kép csatornáinak száma Csatorna hány bites ... Csatorna hány bites . . . Utolsó bemenő kép tulajdonságai ... Felépítése megegyezik az 1. kép tulajdonságleírásáéval 1. kimenő kép tulajdonságai ... Felépítése megegyezik az 1. bemenő kép tulajdonságleírásáéval . . . Utolsó kimenő kép tulajdonságai ... Felépítése megegyezik az 1. bemenő kép tulajdonságleírásáéval
Többnyelvűség támogatása a programban A program támogatja a többnyelvűséget, melyet nyelvi XML fájlok készítésével valósíthatunk meg. A programhoz mellékelt magyar és angol nyelvi fájlok alapján jegyzettömbben elkészíthetjük a fordítást egy általunk választott nyelvre. A nyelvi fájlok elnevezése pl. Magyar.lang magyar nyelv esetén.
Példák Példa Import modul fejlesztésére A fejlesztés első lépéseként ajánljuk a már meglévő import modulok forráskódjának tanulmányozását. A fejlesztést Visual Studio .Net 2005 alatt végezzük, de lehetséges ennek későbbi verziójával is. 1. Töltsük le a GeoFilterBank program honlapjáról a BMP modul forráskódját és nyissuk meg a projektet. 2. A képbetöltő modul interfészét definiáló osztályt az in_bmp.h -ban találjuk meg. Az itt szereplő három publikus függvényt kell megvalósítanunk: SupportedFileExtensions() egy fájlkiterjesztést kell visszaadjon, amely definiálja a modullal beolvasható képformátum fájlkiterjesztését (jelen esetben BMP). GetImageProperties() egy XML struktúra címét kell visszaadja, ahol az XML struktúrát az xml_node osztály segítségével építhetjük fel (API szolgáltatja: xml_node.h). Ebben a struktúrában kell elhelyezni a beolvasandó kép tulajdonságait anélkül, hogy magát a képet betöltenénk. Load_Image(String^ filename, IntPtr ptr, IntPtr size, IntPtr buffer) valósítja meg a képbeolvasást (amely lehet akár vektoros kép, shp fájl stb. is…). A ptr, size és buffer változók pointerek, ahol size megmondja, hogy összesen hány lépésből áll a beolvasás, míg ptr azt, hogy hányadiknál tart a függvény. Egyszerűbb esetben állíthatjuk size értékét 1-re, és a beolvasás végeztével a ptr-t is 1-re. Szintén lehetséges és egyszerű megoldás, ha size értéke a kép pixeleinek száma, ptr értéke pedig az, hogy hány pixelt olvastunk már be. Sikeres beolvasáskor ptr és size értéke meg kell egyezzen. A buffer értéke kell, hogy tartalmazza a lefoglalt memóriaterület címét. Mivel bizonyos esetekben a bemenő fájl hibás lehet, ezért a modul által adott visszatérési érték bizonytalan lehet. Ilyenkor a főprogram a lefoglalt memóriát a buffer változó segítségével szabadítja fel. Mivel minden képformátum más módon épül fel, ezért ajánljuk ezek specifikációjának elolvasását mielőtt import modult szeretne készíteni. Néhány képformátumhoz már meglévő library-k is léteznek, így ezek is beágyazhatók. A harmadik féltől származó library-k saját modulban történő felhasználásával kapcsolatban kérjük olvassa el annak licensz-szerződését.
Példa Export modul fejlesztésére A fejlesztés első lépéseként ajánljuk a már meglévő export modulok forráskódjának tanulmányozását. A fejlesztést Visual Studio .Net 2005 alatt végezzük, de lehetséges ennek későbbi verziójával is. 1. Töltsük le a GeoFilterBank program honlapjáról a BMP modul forráskódját és nyissuk meg a projektet. 2. A modul interfészét definiáló osztályt az out_bmp.h -ban találjuk meg. Az itt szereplő négy publikus függvényt kell megvalósítanunk: GetExportModuleName() ez megmondja, hogy a modul milyen néven jelenjen meg a Fájl/Mentés menüpont alatt (jelen esetben BMP Bitmap). GetExportFormatType() értékeként egy String-et kell visszaadni, RASTER vagy VECTOR értékkel, a mentés formátumától függően. Save_Image(String^ filename, IntPtr ptr, IntPtr size, IntPtr xml) valósítja meg a kép mentését. A paraméterek az Import modulnál látott paraméterekkel egyeznek meg az utolsó paraméter kivételével. Az utolsó paraméter értéke egy xml_node címe, amely egy XML fa gyökere. Ebben a struktúrában van letárolva a mentésre szánt kép minden paramétere. GetApiVersion() értéke egy egész szám, melyet az API IMAGEFILTER_API_VERSION konstansa definiál, mely megtalálható az ImageFilter_1200.h fájlban. Ez garantálja azt, hogy a keretprogrammal kompatibilis-e a modul.
Példa Szűrő modul készítésére A fejlesztés első lépéseként ajánljuk a már meglévő export modulok forráskódjának tanulmányozását. A fejlesztést Visual Studio .Net 2005 alatt végezzük, de lehetséges ennek későbbi verziójával is. 1. Töltsük le a GeoFilterBank program honlapjáról a Brightness/Contrast/Gamma modul forráskódját és nyissuk meg a projektet. 2. Nyissuk meg az ImageFilterSettings.h fájlt. // CHOICES: IMAGEFILTER_PIXELWISE, IMAGEFILTER_BOX, IMAGEFILTER_BLOCK, IMAGEFILTER_RECURSIVE
#define FILTER_TYPE IMAGEFILTER_PIXELWISE #define FILTER_NAME "Brightness / Contrast / Gamma" #define FILTER_VERSION VER_GEN(1,0,0,0) struct filtersettings { // DO NOT MODIFY int width; int height; int stridein; int strideout; int channelcountin; int channelcountout; int pixelsizein; int pixelsizeout; byte* mask; byte* datain; byte* dataout; int* processing_ptr; int* processing_size; int nCoreEnabled; int* nCoreKillSignal; int nCoreExecutionSize;
};
// BOX: radius, PIXELWISE: 1, BLOCK: blocksize
// Extension int brightness; int contrast; int gamma;
Definiáljuk a szűrő típusát (jelen esetben PIXELWISE, azaz képpontonként dolgozzuk fel a képet). Adjuk meg a szűrő nevét: „Brightness / Contrast / Gamma”, valamint adjuk meg a szűrő verzióját (ez NEM az API verziója!). Vegyük fel az esetleges extra adattagokat az interfész strukturájának Extension részébe. 3. Nyissuk meg az ImageFilter.cpp fájlt és készítsük el az extra adattagokhoz tartozó szükséges beállításokat. GetSupportedFormats() függvény eredményeképpen adjuk vissza azt az XML fát, amely definiálja a szűrő követelményeit a bemeneti és kimeneti adatainak formátumával kapcsolatban. Ebben nyugodtan felhasználhatjuk az API által nyújtott XML kezelő függvényeket. A főprogram ennek a függvénynek a hívásakor kapott XML struktúrát tölti ki a
feldolgozandó kép valós paramétereivel, amennyiben azok megfelelnek követelményeinek, majd meghívja a CreateFilterSettings(…) függvényt.
a szűrő
CreateFilterSettings(...) Ez a függvény kapja meg a keretprogramtól a feldolgozandó képet, hogy azzal kapcsolatban a szűrő beállításait elvégezhessük. A képi adatokat egy szerializált XML formátumban kapjuk meg, amelyből az xml_node osztály konstruktura automatikusan felépíti az XML fastruktúrát. Implementálnunk kell ekkor az XmlToMyStruct(...) függvényt, hogy az előzőekben specializált filtersettings struktúránkat kitölthessük az XML alapján. Eztuán a szükséges beállításokat elvégezzük, a változásokat visszavezetjük a meglévő XML fába, majd pedig szerializációval visszaadjuk a főprogramnak. A CreateFilterSettings(...) függvényben a kényelmes használat kedvéért a példában egy beállítóablakot hoztunk létre, előnézeti funkcióval, mely új szűrő készítésekor hasznos kiindulási alapként szolgál. XmlToMyStruct(...) ebben a függvényben kell megvalósítanunk az XML fában tárolt képi információk és szűrő beállítások átmásolását a saját, specializált struktúránkba. FilterCore(...) függvény valósítja meg magát a szűrőt. A szűrő paramétereinél figyelembe kell venni a szűrés tartományait deklaráló sx, sy, sw, sh paramétereket, melyek megmondják a feldolgozandó terület vízszintes és függőleges kezdő koordinátáját, valamint szélességét és magasságát. A szűrő beállításait a saját specializált struktúránkban kapjuk meg, valamint kapunk egy Semaphore változót is, amely a szálak koordinációjáért felelős, amennyiben többszálú szűrőt akarunk írni. A függvény igaz/hamis visszatérési értéke mondja meg, hogy a szűrő sikeresen lefutott-e.
Fejlesztői dokumentáció
A rendszer – áttekintés A GeoFilterBank keretrendszer a GeoFilterBank főprogramból és a képek megjelenítését támogató GeoViewer komponensből tevődik össze. A főprogram a megvalósítandó funkciók koordinálásáért és a felhasználói felület létrehozásáért és kezeléséért felel. Az adatok betöltését, mentését és szűrését a főprogram bővítmények használatával oldja meg. A bővítményeknek három fő sablonját biztosítja a rendszer: Import, Export, Filter. A keretrendszer és a bővítmények közötti információcsere XML nyelven történik, melynek részletes tárgyalását az egyes bővítménytípusok leírása tartalmazza. Az XML struktúrák feldolgozását, szerializációját és további műveleteit az xml_node nevű osztály valósítja meg, amely ebből adódóan minden projektben szerepel, így tárgyalása külön fejezetben található meg.
1. ábra A GeoFilterBank szűrőbank felépítése
Import bővítmények A GeoFilterBank rendszer a raszteres és vektoros adatok betöltését az Import bővítményein keresztül valósítja meg. A keretprogram az import bővítmények image_loader névterében keresi az image_loader osztályt. Ez az osztály biztosítja az importtal kapcsolatos funkciókat.
2. ábra Az import típusú bővítmények felépítése
image_loader osztály Betölti az adott fájlnevű képet, illetve le lehet vele kérdezni egy képfájl tulajdonságait publikus: IntPtr Load_Image(String^ filename, IntPtr ptr, IntPtr size, IntPtr buffer) Betölti a filename paraméterben megadott nevű képet a buffer-be. Eközben visszajelzi a ptr, size paramétereken keresztül a betöltés folyamatának állapotát. Az állapotjelzők használata nem kötelező. A betöltés végén a ptr értéke meg kell egyezzen a size értékével. Visszatérési értéke a betöltött kép teljes XML leírása. IntPtr GetImageProperties(String^ filename) A kapott fájlnevű kép információit visszaadja XML formátumban. String^ SupportedFileExtension() Visszatérési értékében megadja a modul által betölthető fájltípusokat. privát: char* StringToCharstring(String^ s) A managed String típus értékét char bufferbe másolja.
Export bővítmények A GeoFilterBank rendszer a raszteres és vektoros adatok mentését az Export bővítményein keresztül valósítja meg. A keretprogram az export bővítmények ImageSaver névterében keresi az ImageSaver osztályt. Ez az osztály biztosítja az exporttal kapcsolatos funkciókat.
3. ábra Az export típusú bővítmények felépítése
ImageSaver osztály Elmenti a képet a megadott fájlnévvel publikus: bool Save_Image( String^ filename, IntPtr ptr, IntPtr size, IntPtr xml) Elmenti a filename paraméterben megadott névvel az xml paraméterben kapott képet. Eközben visszajelzi a ptr, size paramétereken keresztül a betöltés folyamatának állapotát. Az állapotjelzők használata nem kötelező. A betöltés végén a ptr értéke meg kell egyezzen a size értékével. Visszatérési értéke a mentés sikerességét jelzi. String^ GetExportModuleName() Megadja, hogy milyen névvel jelenjen meg a keretprogramban az export modul. String^ GetExportFormatType() Megadja, hogy az export modul milyen fájlkiterjesztést használ mentéskor. int GetAPIVersion() Megadja, hogy milyen verziójú API-val készült a modul. privát:
char* StringToCharstring(String^ s) A managed String típus értékét char bufferbe másolja.
ImageFilter osztály A mentéssel kapcsolatos műveletekben lévő XML feldolgozást valósítja meg publikus: void CreateImageSetting(xml_node^ fs, int Width, int Height, int Stride, int Packed, int Interleaved, int ChannelCount, int PixelSize, byte* Data) Létrehoz egy teljes XML struktúrát a megadott képi attribútumok alapján. int GetOneImageSetting( xml_node^ fs, int& Width, int& Height, int& Stride, int& Packed, int& Interleaved, int& ChannelCount, int& PixelSize, byte*& Data) Lekérdezi egy kép teljes attribútum készletét a megadott XML struktúrából. Visszatérési értéke a művelet sikerességét jelzi. void SetChannelBitAllocation( xml_node^ fs, int Channel, int BitAllocation) Beállítja egy kép megadott csatornájának a bitkiosztását.
Szűrő bővítmények A GeoFilterBank rendszer a raszteres és vektoros feldolgozását a Filter bővítményein keresztül támogatja. A keretprogram a szűrő bővítmények FilterSpace névterében lévő ImageFilter osztályt használja. Ez az osztály biztosítja a feldolgozással kapcsolatos funkciókat.
4. ábra A szűrő típusú bővítmények felépítése SettingsForm : Form osztály Sablon beállító ablakot biztosít a felhasználó számára, melyet tetszőlegesen módosíthat publikus: void RefreshPreview(bool applyfilter) Előnézeti kép frissítése. Igaz érték esetén szűrés alkalmazása, egyébként a forrásképből mutatja az előnézetet. privát: void ButtonApply_Click(...) Szűrő alkalmazása void ButtonCancel_Click(...) Kilépés a szűrőből a végrehajtás előtt void Preview_MouseDown(...) Előnézeti kép húzd-ejtsd módjának kezelése void Preview_MouseMove(...) Előnézeti kép húzd-ejtsd módjának kezelése
void Preview_MouseUp(...) Előnézeti kép húzd-ejtsd módjának kezelése void Preview_OnPaint(...) Előnézeti kép Az osztályhoz tetszőleges vezérlőelemek és további függvények adhatók hozzá.
polygon_node struktúra Két dimenziós pontot valósít meg.
filtersettings struktúra Ezt a struktúrát az API biztosítja, azonban szabadon bővíthető. Teljesen egyedi szűrő esetén akár le is cserélhető, vagy elhagyható. int int int int int int int int byte* byte* byte* int* int* int int* int
Kép szélessége Kép magassága Forráskép egy sorának bájtmérete Célkép egy sorának bájtmérete Forráskép csatornáinak száma Célkép csatornáinak száma Forráskép pixeleinek bitmélysége Célkép pixeleinek bitmélysége Opcionális képi maszkréteg a feldolgozáshoz Forráskép Célkép Feldolgozott adat mennyisége Feldolgozandó adat mennyisége Engedélyezi-e a keretprogram az nCore-t Keretprogram kényszeríti-e a leállítást Interferenciasugár a szűrőmag szálai között BOX: sugár, PIXELWISE: 1, BLOCK: blokkméret
MultiThreadTaskVariables struktúra Tárolja az összes párhuzamosan futó szűrőmag kontextusát int m, n; int r; int w, h; int s; int bpp; int *SpanRowStarts; int *SpanColumnStarts; int *BlockRowStarts; int *BlockColumnStarts; byte *img; byte *FirstPassResultRows; byte *FirstPassResultColumns; filtersettings *CpuCoresSettings;
Kép logikai vízszintes, fűggőleges felosztása A párhuzamosítás interferencia sugara A kép szélessége, magassága A kép sormérete bájtban A kép színmélysége bájtban Interferenciamentesítő vízszintes szeletek kezdőcímei Interferenciamentesítő függőleges szeletek kezdőcímei Logikai képblokkok függőleges kezdőcímei Logikai képblokkok vízszintes kezdőcímei A forráskép címe Interferenciamentesítő vízszintes pufferek Interferenciamentesítő függőleges pufferek Független, párhuzamos szűrőmagok paraméterei
ImageFilterBase osztály Biztosítja az XML-es információcserével kapcsolatos segédfüggvényeket, a párhuzamosítással kapcsolatos kontextusok kezelését és a párhuzamosítást. publikus: int GetOneImageSetting( xml_node^ fs, int& Width, int& Height, int& Stride, int& Packed, int& Interleaved, int& ChannelCount, int& PixelSize, byte*& Data) Lekérdezi egy kép teljes attribútum készletét a megadott XML struktúrából. Visszatérési értéke a művelet sikerességét jelzi. void CreateImageSetting(xml_node^ fs, String^ pin_name, int Width, int Height, int Stride, int Packed, int Interleaved, int ChannelCount, int PixelSize, byte* Data) Létrehoz egy teljes XML struktúrát a megadott képi attribútumok alapján. void SetChannelsBitAllocation(xml_node^ fs, int Channel, int BitAllocation) Beállítja egy kép megadott csatornájának a bitkiosztását. bool GetMaskPtr(xml_node^ fs, byte*& mask) Visszaadja az XML struktúrából a benne tárolt maszk pointert. void ClipImage(xml_node^ fs, int sx, int sy, int sw, int sh) A forráskép egy részletet átmásolja a célképbe. void ClipImage(
filtersettings* f, int sx, int sy, int sw, int sh) A forráskép egy részletet átmásolja a célképbe. void UpdateDestinationPointer(xml_node^ filtersetting, int stride, IntPtr data) Az XML-ben módosítja a célkép pointerét és sorméretét. void InitMTTaskVariables(
MultiThreadTaskVariables* mttv, int m, int n, int radius, int width, int height, byte* image, int bytesperpixel, int stride) Létrehozza a többprocesszoros üzemmód kontextusait. void ReleaseMTTaskVariables(MultiThreadTaskVariables* mttv) Felszabadítja a többprocesszoros üzemmód kontextusait. bool ExecuteFilterBlock(
filtersettings* fsets, filter_core_func FilterCorePtr) A kapott szűrőfüggvényt blokkszűrőként párhuzamosan hajtja végre. bool ExecuteFilterBox( filtersettings* fsets, filter_core_func
FilterCorePtr) A kapott szűrőfüggvényt kernel alapú szűrőként párhuzamosan hajtja végre. void CalculateProcessorSplit( int& m, int& n, int width, int height) Kiszámolja az adott architektúra esetén optimális párhuzamosítási felosztást.
ImageFilter : ImageFilterBase osztály Kezeli az XML-ben kapott képinformációkat és megvalósítja a szűrősablont.
publikus: int GetAPIVersion() A szűrő készítéséhez használt API verziója String^ GetFilterName() A szűrő neve int GetFilterVersion() A szűrő verziószáma bool CanLocalize() Szűrő alkalmazásakor megengedett-e, hogy a forrás- és célkép memóriaterülete megegyezzen IntPtr GetSupportedFormats() Milyen képattribútumokat támogat a szűrő (XML értékű) IntPtr CreateFilterSettings(Byte* fs, bool silent) A megadott kép (szerializált XML) alapján a szűrőbeállítások elvégzése (akár GUI-n). silent esetén nincs GUI, valamint az alapértékek lépnek érvénybe ahol nincsenek beállítva paraméter értékek. bool ExecuteFilter(Byte* fs) A szűrő végrehajtása a teljes felparaméterezéssel (szerializált XML). bool FilterCore(
filtersettings* f, int sx, int sy, int sw, int sh) A szűrő magja, amelyet a felhasználó implementál. A beállításokat a filtersettings struktúra adja. Ennek felépítése változtatható, ehhez kell igazítani az XmlToMyStruct függvényt. Az sx, sy, sw, sh paraméterek megadják a kapott kép mely területét kell feldolgozni. privát: filtersettings* XmlToMyStruct(xml_node^ fs, bool creating) A kapott XML struktúrát átkonvertálja filtersettings struktúrába. A felhasználónak ezt a függvényt hozzá kell igazítania a saját filtersettings struktúrájához.
nCoreProcessor osztály Leválaszt egy szűrőmagot egy önálló szálra. publikus: nCoreProcessor(
Semaphore^ synchronizer, Semaphore^ updater, filter_core_func _func, filtersettings* _fset, int _x, int _y, int _w, int _h) Létrehoz egy processzort egy párhuzamosan futó szűrőmaghoz. privát: void ThreadEntryPoint() Elindítja a szűrőmagot a szálban és várakozik a befejezésére.
ImageFilterAccelerator osztály A megegyező forrás- és célképcím esetén történő végrehajtás támogatása. publikus: ImageFilterAccelerator( filtersettings* f, int& sx, int& sy, int& sw, int& sh, int _radius) Létrehoz egy transzparens köztes cache réteget, mint virtuális képet. void StepImageScanLine() Következő sorra lép a virtuális képen, frissíti a cache-t. byte** GetVirtualImage() A létrehozott virtuális képet adja vissza. int GetPreX() Megadja, hogy az aktuális sor előtt hány sor létezik. int GetPreY() Megadja, hogy az aktuális oszlop előtt hány oszlop létezik. int GetPostX() Megadja, hogy az aktuális sor után hány sor létezik. int GetPostY() Megadja, hogy az aktuális oszlop után hány oszlop létezik.
A keretrendszer A keretrendszer feladata az import modulok segítségével beolvasni az adatokat, feldolgozni azokat a felhasználó által választott szűrő bővítményekkel, illetve az eredmények mentése az export modulok révén.
5. ábra A GeoFilterBank keretrendszer osztálydiagramja
GeoFilterBank – GeoViewer komponens
SelectionStruct struktúra Az aktuális kijelölési típust és kijelölést tartalmazza.
VectorModel struktúra Tárolja a vektoros adatmodell adatait.
GeoViewer : UserControl osztály Megjeleníti a kapott XML struktúrát
publikus: void ClearSelections() Törli a kijelöléseket void FreeUpBitmapResources() void FreeUpVectorResources() Raszteres, illetve vektoros adatok memóriafoglalásának felszabadítása void SetFunctionality(int func) int GetFunctionality() Nézőke funkciójának beállítása/lekérdezése int GetZoom() void SetZoom(float zoom) Zoom beállítás lekérdezése, módosítása void SetVectorImage(xml_node^ image_desc) void SetVectorImageLiveOnFreeUp(bool b) void SetBitmapImage(xml_node^ image_desc) Vektoros, raszteres kép beállítása void RebindBitmap() Bitmap újra betöltése void SetBitmapImageLiveOnFreeUp(bool b) bool IsImageDataLoaded() bool IsVectorDataLoaded() Be van-e töltve a raszteres, vektoros adat void SetGeoreference(RectangleF r) Beállítja a georeferálási adatokat bool GetScrollVisibility() void SetScrollVisibility(bool visible) Lekérdezi, illetve beállítja a gördítősávok láthatóságát bool GetSelectionsVisibility() void SetSelectionsVisibility(bool visible) Lekérdezi, illetve beállítja a kijelölőeszköz láthatóságát
Point ClientToSourcePoint(Point p) Point SourceToClientPoint(Point p) void ClientToSourceRectangle(Rectangle& r) void SourceToClientRectangle(Rectangle& r) Konverziók kliens és képi koordináta között Point ValidatePoint(Point p) Képen belülre validálja a pontot Point SortRectangleCorners(Point p0, Point p1, int i) Rendezi a téglalap sarkait Rectangle CreateRectangleFromPoints(Point p0, Point p1) Téglalapot készít sarokpontokból Point IntersectLines(Point a0, Point a1, Point b0, Point b1) Kiszámolja két vonal metszetét bool IsPolygonSelfIntersected() Önátlapoló-e a poligon bool IsPointInPolygon(Point p, Object^ polygonn) Pont a poligonban van-e void InitThumbnail() Kép miniatűrjének inicializálása void FormReSize() Ablak átméretezése void refreshSliders() Gördítősávok változásának követése
xml_node osztály Megjeleníti a kapott XML struktúrát
publikus: xml_node(void* marshalled) XML-be konvertál egy szerializált XML struktúrát. xml_node(xml_node^ _parent, String^ _name, String^ _attrs, String^ _value) Létrehoz egy XML struktúrát. bool XmlIsChildExist(String^ tag) Teszteli, hogy létezik-e egy adott tag az aktuális XML szinten. bool XmlGetIntValue(int& ivalue) Visszaadja az XML node-ban tárolt egész értéket. void XmlSetIntValue(int& ivalue) Módosítja az XML node-ban tárolt egész értéket. bool XmlGetIntPtrValue(IntPtr& ip) Visszaadja az XML node-ban tárolt egész pointert. void XmlSetIntPtrValue(IntPtr ip) Módosítja az XML node-ban tárolt egész pointert. void XmlAddTag(String^ tag) Hozzáad az XML node-hoz egy (gyerek) tag-et. bool XmlGetChildByName(xml_node^& node, String^ tag) Lekéri az XML node egy gyerek node-ját a neve alapján. void XmlRemoveChildByName(String^ tag) Törli az XML node egy gyerek node-ját a neve alapján. bool XmlGetChildValueByName(String^ tag, int& value) bool XmlGetChildValueByName(String^ tag, String^& value) String^ XmlGetChildStringValueByName(String^ tag) Lekéri az XML node egy gyerek node-jának értékét a neve alapján. void XmlSetChildValueByName(String^ tag, int value) void XmlSetChildValueByName(String^ tag, int value, bool keepprevious) void XmlSetChildValueByName(String^ tag, String^ value, bool keepprevious) Beállítja az XML node egy gyerek node-jának értékét a neve alapján.
keepprevious = true esetén ha létezett a tag, az eredeti értéke megmarad. int DangerousGetSize() Kiszámítja a szerializáció utáni méretet. byte* XML_Tree_Marshal() Szerializálja az XML struktúrát. void XML_Tree_DeMarshal(byte* source) A szerializált adatból visszaállítja az XML struktúrát.
void XML_Tree_MarshalHelper(byte*& target) A szerializációt segítő segédfüggvény. void XML_Tree_DeMarshalHelper(byte*& source, int& size) A szerializált adat visszaállítását segítő segédfüggvény. privát: void XML_Tree_MarshalInt(byte*& target, int i) Szerializál egy egész értéket. int XML_Tree_DeMarshalInt(byte*& source, int& size) Deszerializál egy egész értéket. void XML_Tree_MarshalString(byte*& target, String^ s) Szerializál egy String értéket. String^ XML_Tree_DeMarshalString(byte*& source, int& size) Deszerializál egy String értéket.
GeoFilterBank – Keretrendszer
XML_Editor : Form osztály Megjeleníti a kapott XML struktúrát
publikus: void CreateXMLTree(xml_node^ root) Megjeleníti az XML fastruktúrát. privát: void XmlFormatTag(TreeNode^ node, String^ name, int level) Formázza, szinezi a fában az egyes XML tag-eket. void XmlRecursiveTreeBuilder( TreeNodeCollection^ current_treenode, xml_node^ current_xmlnode, int level) Segédfüggvény az XML fa rekurzív felépítéséhez a megjelenítőben. void XML_Editor_Resize(...) A form átméretezésére átméretezi a megjelenítőt.
xml_parser osztály Megjeleníti a kapott XML struktúrát
publikus: void write_xmltree_into_file( StreamWriter^ sw, xml_node^ node, String^ tabs) Fájlbaír egy teljes XML struktúrát void read_xml_into_xmlsubtree(StreamReader^ sr, xml_node^ node) Beolvas fájlból egy teljes XML struktúrát privát:
int interpret_tag(String^& xml_tag, String^& name, String^& attributes) Értelmez egy XML tag-et. int read_tag(StreamReader^ xml, String^& name, String^& attributes) Beolvas egy XML tag-et. void read_value(StreamReader^ xml, String^& value) Beolvas egy XML értéket.
MainWindow : Form osztály A keretprogram főablaka, amely kezeli az összes bővítményt és gyerekablakot.