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 4.1. Szegmentálás, élsimítás......................................... 2 4.2. A váz vizsgálata............................................. 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ó 7 1. 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 kompaktságot egy összefügg halmaz esetén a K2 T 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 szegmentálása Eredménye: bináris kép, a szegmentált kézzel 1
2. vázkijelölés + tisztítás Eredménye: a kéz váza 3. 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 végigjárjuk az utakat (hosszmérés) Eredmény: lehetséges ujjak megtalálása 5. a túl rövid utakat gyelmen kívül hagyjuk, a megmaradt utak száma adja meg a felmutatott ujjak számát Eredmény: az ujjak száma 4. 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ázisa: 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ázisban, 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): Real-time Hand Tracking and Finger Tracking for Interaction (CSC2503F Project Report) http://www.cs.toronto.edu/ smalik/downloads/2503_project_report.pdf 7