Ujjszámlálás Matlab segítségével Griechisch Erika, Juhász Miklós és Földi Antal 2008. november
Tartalomjegyzék
1. Bevezetés
1
2. Vizsgált módszerek
1
3. Az algoritmus
1
4. Megvalósítás
2
5. A finger_count_gui m¶ködés közben 1
5
6. A finger_count_gui m¶ködés közben 2
6
7. Összefoglaló
7
4.1. Szegmentálás, élsimítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2. A váz vizsgálata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.
2 4
Bevezetés
A továbbiakban bemutatott program 2008 ®szi szemeszterében készült a Szegedi Tudományegyetem programtervez® informatikus MSc szakján, a Képfeldolgozás haladóknak kurzus keretében. A feladatunk az volt, hogy készítsünk egy programot, mely egy homogén, sötét hátter¶, felfelfe mutató kezet ábrázoló képr®l megmondja, hány ujjat mutat a kéz tulajdonosa. 2.
Vizsgált módszerek
Többféle módszer is felmerült az ujjszámlálás megoldására. Az egyik völgy-hegy detektálás (peak and valley detection) néven ismert módszert használja, err®l b®vebben a [1] irodalomban olvashatunk. A módszer lokális minimum/maximum keresésen alapul és azért vetettük el, mert a közel vízszintesen tartott hüvelykujjat nem számolta ujjnak, és érzékeny volt a kontúr egyenetlenségeire. Egy másik módszer, ami felmerült, hogy kompaktságnak a mértékét vizsgáljunk. A 0-t mutató kéz közel kompakt, az 1 ujjat mutató már kevésbé, míg az a legkevésbé kompakt eset mikor mind az 5 ujjat felmutatjuk. E 2 kompaktságot egy összefügg® halmaz esetén a KT kifejezéssel számszer usíthetjük (ahol K a kerület, T a terület.) Ez a módszer a kéz esetén nem vált be, több képen kiszámoltuk az értékeket, de nem lehetett egyértelm¶ határvonalat húzni a különböz® ujjat mutató kezeknél kapott kompaktságot mutató értékekre. Végül a vázkijelölés alapú ujjfelismerés mellett döntöttünk. A következ® oldalon ezen módszert illetve algoritmus lényegét ismertetjük. 3.
Az algoritmus
1. homogén hátter¶ kép Eredménye:
szegmentálása
bináris kép, a szegmentált kézzel 1
2.
vázkijelölés + tisztítás Eredménye:
3.
a kéz váza
végpontok + vonalpontok + elágazások megkeresése Eredmény:
kijelölt vég- és elágazáspontok
4. végpontoktól az elágazásokig Eredmény:
5. a túl rövid számát Eredmény:
4.
végigjárjuk az utakat (hosszmérés)
lehetséges ujjak megtalálása
utakat gyelmen kívül hagyjuk, a megmaradt utak száma adja meg a felmutatott ujjak az ujjak száma
Megvalósítás
4.1.
Szegmentálás, élsimítás
Az alábbiakban végigkövetjük a kód futását lépésr®l lépésre, képekkel illusztrálva.
1. ábra. Az eredeti kép A kép beolvasása után, szürkeárnyalatúvá alakítjuk át (a beépített rgb2gray függvény segítségével ), majd a graythresh illetve im2bw függvények segítségével szegmentáljuk illetve binárissá alakítjuk:
threshold = graythresh(GRAY); BW = im2bw(GRAY, threshold); A szegmentálást követ®en élsimítást végzünk a képen. . .
se = strel('octagon',9); bw2 = imdilate(BW,se); bw3 = imfill(bw2,'holes'); bw4 = bwmorph(bw3,'close'); 2
2. ábra. a) Szürkeárnyalatos kép b) szegmentált kép c) élsimított kép
. . . majd elvégezzük a vázkijelölést
bw5 = bwmorph(bw4,'thin','inf'); A matlab beépített vázkijelöl® algoritmusával - bwmorph(BWIMAGE,'skel') - is próbálkoztunk, de az túl sok mellékágat eredményezett, a váz szálkás lett. A program gyorsabb futása érdekében a váz körüli felesleges üres területeket töröljük.
3. ábra. Váz
3
4.2.
A váz vizsgálata
Törlést követ®en pixelenként vizsgáljuk a vázat, minden pixelnek megszámoljuk hány szomszédja van (a vázban). Három csoportba oszthatóak a vázpontok:
• végpont: 1 szomszédja van • vonalpont: 2 szomszédja van • elágazási pont: több mint 2 szomszédja van Megjegyzés: a kép alsó 20%-ba es® végpontokat nem vettük végpontnak, mert a ott kezd®d® ágak a csuklóhoz tartoznak. Ezután következik az algoritmus 4. fázis a: a végpontokból kiindulva számba vesszük a következ® szomszédos pixelt, mindaddig míg elágazáshoz nem érünk. A végigjárt út hossza a végpontok és elágazási pontok közé es® pixelek száma. Az így kapott ágak lehetséges ujjak. Az 5. fázis ban, a korábbi fázis során kapott ághosszak alapján kisz¶rjük a rövid ágakat. Több kép átvizsgálása után azt a következtetést vontuk le, hogy egyetlen ujj váza sem lesz rövidebb a leghosszabb ág felénél. Ezt gyelembe véve sz¶rjük ki a felesleges ágakat. A megmaradt ágak ujjnak min®sülnek.
4. ábra. A váz, melyen jelölve vannak a végpontok (piros), az ujjak (kék) és az elágazási pontok (zöld)
4
5.
A
finger_count_gui
m¶ködés közben 1
5
6.
A
finger_count_gui
m¶ködés közben 2
6
7.
Összefoglaló
Az alkalmazott módszer célravezet® volt, a feldolgozott képeken az esetek 98% ban felismerte az algoritmus a mutatott ujjak számát. A project jelenlegi állapotában önállóan m¶köd® alkalmazás, mely azonban alapjául szolgálhat további munkáknak, nomhangolásoknak. Ilyen lehetne például a háttérszínt®l és a kéz pozíciójától függetlenül történ® ujjszám felismerés. Következ® lépésben az alkalmazást ki lehetne terjeszteni videofelismerésre is, magát a módszert egy hordozható, matlabtól részben vagy egészen független rendszerre átülteni. Leírás a finger_count_gui.m használatához: Ha elindítjuk a függvényt Matlabbal - az R2007a verzió ajánlott -, egy ablakot kapunk, melyen bal oldalon kiválaszhatjuk melyik leon szeretnénk ujjszámlálást végezni. Ha kiválasztottuk a megfelel® let, a start gombra kattintva elindíthatjuk a számolást, majd a jobb oldali ablakban meg fog jelenni az eredeti kép illetve a váza, melyen külön színnel van jelölve a végpontok, az elágazási pontok és az ujjak. A bal alsó sarokban lesz olvasható, hogy hány ujj látható a képen. Hivatkozások
[1] Shahzad Malik (2003): Report)
Real-time Hand Tracking and Finger Tracking for Interaction
http://www.cs.toronto.edu/ smalik/downloads/2503_project_report.pdf
7
(CSC2503F Project