Budapesti Műszaki Főiskola Neumann János Informatikai Kar Szoftvertechnológia Intézet
„ HANDS UP! ” - GITÁR EMULÁCIÓS RENDSZER
Szerzők:
Bónis Balázs Gyöngyi Lajos Szabó Attila
Konzulens: Vámossy Zoltán
Budapest, 2010-01-04
1
1 Tartalomjegyzék 1 2
3
4 5
6
7
TARTALOMJEGYZÉK............................................................................................................................. 5 RÖVID TARTALMI ÖSSZEFOGLALÓ ................................................................................................. 7 2.1 MAGYAR VERZIÓ ....................................................................................................................................... 7 2.2 ENGLISH VERSION ..................................................................................................................................... 7 A MEGOLDANDÓ PROBLÉMA MEGFOGALMAZÁSA ÉS FELOSZTÁSA .................................. 8 3.1 MOTIVÁCIÓ ............................................................................................................................................... 8 3.2 BEVEZETÉS ................................................................................................................................................ 8 3.3 A PROBLÉMA ELEMZÉSE ÉS A SPECIFIKÁCIÓ KIDOLGOZÁSA ..................................................................... 10 MUNKAMEGOSZTÁS A PROJEKT SORÁN .......................................................................................12 IRODALOMKUTATÁS ............................................................................................................................13 5.1 BEVEZETÉS .............................................................................................................................................. 13 5.2 ZENEI ALAPOK ......................................................................................................................................... 13 5.2.1 Hangtani alapok ............................................................................................................................ 13 5.2.2 Hanglejátszás ................................................................................................................................ 14 5.3 SZÍNTEREK .............................................................................................................................................. 15 5.3.1 Bevezetés ....................................................................................................................................... 15 5.3.2 RGB színtér ................................................................................................................................... 15 5.3.3 HSV színtér .................................................................................................................................... 15 5.3.4 Konverzió HSV és RGB között....................................................................................................... 16 5.4 ELŐFELDOLGOZÁS SORÁN HASZNÁLATOS MÓDSZEREK ........................................................................... 16 5.4.1 Szűrés ............................................................................................................................................ 16 5.4.2 Szegmentálás ................................................................................................................................. 17 5.5 OBJEKTUMKERESÉS ................................................................................................................................. 17 5.5.1 Éldetektálás ................................................................................................................................... 17 5.5.2 Aktív kontúr ................................................................................................................................... 18 5.6 OBJEKTUMKÖVETÉS ................................................................................................................................ 20 5.6.1 Kálmán szűrő ................................................................................................................................ 20 5.7 SZÍN ALAPÚ MOZGÁSKÖVETÉS................................................................................................................. 21 5.7.1 CamShift algoritmus ...................................................................................................................... 21 5.8 VIOLA-JONES FÉLE OBJEKTUMDETEKTÁLÁS ............................................................................................ 23 5.8.1 Jellemzők ....................................................................................................................................... 23 5.8.2 Integrális kép ................................................................................................................................. 24 5.8.3 Osztályozó függvény tanítása ........................................................................................................ 25 5.8.4 Kaszkád ......................................................................................................................................... 26 5.8.5 Viola-Jones objektumdetektáló összefoglalás ............................................................................... 30 5.9 ÖSSZEFOGLALÁS ..................................................................................................................................... 30 GLOBÁLIS RENDSZER BEMUTATÁSA..............................................................................................31 6.1 KIVÁLASZTOTT MÓDSZER........................................................................................................................ 32 6.2 INDOKLÁS ................................................................................................................................................ 32 A RÉSZLETES SPECIFIKÁCIÓ .............................................................................................................33 7.1 ELŐFELDOLGOZÁS ................................................................................................................................... 33 7.1.1 Ablakpozíciók inicializálása .......................................................................................................... 33 7.1.2 Képsimítás ..................................................................................................................................... 33 7.1.3 Színkonverzió................................................................................................................................. 34 7.1.4 Szegmentálás ................................................................................................................................. 34 7.2 KÉPINFORMÁCIÓK ÉRTELMEZÉSE ............................................................................................................ 35 7.2.1 Gitár modell .................................................................................................................................. 36 7.2.2 Kéz és fej keresés ........................................................................................................................... 37 7.2.3 Gitár modell inicializálása ............................................................................................................ 41 7.2.4 Kéz és fejpont követése - mozgáskövetés ....................................................................................... 41 7.2.5 Belső modell módosítása ............................................................................................................... 43 7.2.6 Lefogott hang megállapítása ......................................................................................................... 43 7.2.7 Pengetés esemény megállapítása .................................................................................................. 43 7.3 HANG ELŐÁLLÍTÁSA ................................................................................................................................ 44 7.3.1 Gitárnyak szimulálás (érintők számolása) .................................................................................... 45 7.3.2 Kiválasztott gitárnyak, skála, elrendezés ...................................................................................... 45
5
7.3.3 Megfelelő hangfájl kiválasztása és lejátszás ................................................................................. 46 7.3.4 Effektezés ....................................................................................................................................... 47 7.3.5 Hangszínszabályzás....................................................................................................................... 52 8 A TERVEZÉS SORÁN VÉGZETT MUNKAFÁZISOK ÉS TAPASZTALATOK .............................54 9 A MEGVALÓSÍTÁS ELEMZÉSE ÉS ALKALMAZÁSÁNAK SZÁMBAVÉTELE ..........................55 9.1 RENDSZER INTEGRÁCIÓ ........................................................................................................................... 55 9.1.1 Mentés és betöltés ......................................................................................................................... 55 9.1.2 Gitár emuláció megvalósítása ....................................................................................................... 57 9.1.3 Rendszerben található extra funkciók ........................................................................................... 59 9.2 KÉPFELDOLGOZÓ MODUL MEGVALÓSÍTÁSA ............................................................................................ 60 9.2.1 Bőrszín mintavételezés .................................................................................................................. 60 9.2.2 Előre meghatározott bőrszín felhasználása................................................................................... 62 9.2.3 Kézdetektálás................................................................................................................................. 62 9.2.4 Sarokpont keresés .......................................................................................................................... 64 9.2.5 Mozgáskövetés optikai folyammal ................................................................................................. 64 9.2.6 Szín alapú mozgáskövetés ............................................................................................................. 65 9.2.7 Megvalósított inicalizációs folyamat ............................................................................................. 66 9.2.8 Megvalósított kézdetektálás ........................................................................................................... 66 9.2.9 Fejdetektálás ................................................................................................................................. 67 9.2.10 Megvalósított színalapú mozgáskövetés ................................................................................... 67 9.2.11 Hibakezelés ............................................................................................................................... 68 9.2.12 Lefogott hang megállapítása .................................................................................................... 69 9.2.13 Pengetési esemény generálása ................................................................................................. 69 9.2.14 Összefoglalás ............................................................................................................................ 70 9.3 HANGLEJÁTSZÁS MEGVALÓSÍTÁSA ......................................................................................................... 72 9.3.1 DirectSound logika........................................................................................................................ 72 9.3.2 Testreszabhatóság, beállítási opciók ............................................................................................. 73 9.3.3 Zenelejátszás és a DirectX további lehetőségei ............................................................................. 74 10 TESZTELÉSI EREDMÉNYEK................................................................................................................75 10.1 FELDOLGOZÁSI IDŐRE VONATKOZÓ MÉRÉSEK .................................................................................... 75 10.2 HATÉKONYSÁGRA VONATKOZÓ MÉRÉSEK .......................................................................................... 77 10.2.1 Arcdetektálás hatékonyságára irányuló mérések ..................................................................... 77 10.2.2 Kézdetektálás és arc illetve kézkövetés hatékonyságára vonatkozó mérési eredmények .......... 78 10.2.3 Hang tömörítési eljárások hatékonyságának mérése ............................................................... 80 10.3 MÉRÉSI ADATOK ÖSSZEFOGLALÁS ...................................................................................................... 81 11 TOVÁBBFEJLESZTÉSI GONDOLATOK.............................................................................................82 12 ÖSSZEFOGLALÁS ...................................................................................................................................84 12.1 KÉPFELDOLGOZÓ MODUL ................................................................................................................... 84 12.2 HANG MODUL ..................................................................................................................................... 85 13 IRODALOMJEGYZÉK ............................................................................................................................86 14 MELLÉKLET ............................................................................................................................................88 14.1 HASZNÁLATI ÚTMUTATÓ .................................................................................................................... 88 14.1.1 Rendszerkövetelmények ............................................................................................................ 88 14.1.2 Szimuláció indításának első lépései ......................................................................................... 88 14.2 OSZTÁLYDIAGRAM ............................................................................................................................. 93
6
2 Rövid tartalmi összefoglaló 2.1 Magyar verzió A projekt célja egy olyan rendszer létrehozása, mely egy hangszer megszólaltatásának folyamatát szimulálja, mindössze egy webkamera képéből kiindulva. A hangszer egy tiszta csatornán megszólaltatott elektromos gitár hangján szólal meg, a webkamera előtt léggitározó (gitározást szimuláló, eljátszó) ember mozgásának hatására. A gitár megszólaltatásához a két kéz pozícióját határozza meg, illetve mozgásukat követi. Ezen probléma megvalósítására sok különböző algoritmus, metodika közül sorozatos tesztelésekkel kerül kiválasztásra a célnak leginkább megfelelő, így vizsgálat tárgyát képezi a Haar-féle jellemzőket használó detektáló algoritmus, vagy a gradiens hisztogramok használata is. A projekt jelen állása szerint a HSV színtérben való bőrszín detektálás bizonyul a legbiztosabbnak, de ezen kívül felhasználásra kerül a Lucas-Kanade optikai folyam algoritmus is. Az eredmény a gitár virtuális nyakán lefogott érintő száma, mely alapján a program képes kiszámolni az adott érintőnek megfelelő hangot, melyet egy előre kiválasztott zenei skála határoz meg. A tisztán felvett gitárhang és az alkalmazott DirectSound lejátszás előnye, hogy az adott hangot különböző effektekkel lehet modulálni, mint például túlvezérlés, visszhang, késleltetés, amplitúdó- és fázis moduláció. Miután így a hang, melyet külön tömörített hangfájlokból hívunk elő, megfelelő előfeldolgozáson megy keresztül, majd lejátszásra kerül.
2.2 English version The aim of the project is to create a system that is capable of simulating the playing of an instrument, using only a web camera image as an input. The instrument is an electric guitar on a clean channel that is sounded by the user that plays air guitar in front of the camera. To get the correct information that is needed for the right tune the program acquires the position of the hands, and follows their movements. For this issue several algorithms and methods are under investigation with in-depth testing to determine their performance, e.g. the Haar-feature detection, or the examination of gradient histograms. Recent state shows that skin colour perception is the most optimal for this case, but the optical flow algorithm of Lucas-Kanade is used. The result is the number of the fret on the virtual guitar neck from which the application – with the attributes that the chosen musical scale sets up – is able to get the exact note that a real physical guitar would emit. The recording on clean channel and DirectSound pay off the ability to change the voice with several distinguished effects, e.g. overdrive, reverbation, echo, delay, amplitude and phase modulation. After this pre-processing is done, the note is sounded.
7
3 A megoldandó probléma megfogalmazása és felosztása 3.1 Motiváció Célunk egy olyan rendszer fejlesztése, ami mindenki számára elérhető kézdetektálást nyújt játékos formában. A kéz mozgásának felismerését és értelmezését valós időben fogjuk elvégezni, minimális költségű eszközök felhasználásával, mindezt szórakoztató és interaktív formába öntve. A felhasználó a kezével gitározást szimulálhat egyszerűen úgy, hogy a kezébe képzel egy gitárt és ugyanúgy pengeti, mintha az valójában ott lenne. Ezeket a mozdulatsorokat az alkalmazás detektálja, a különböző változásokat figyeli és reagál rájuk. A reakció a kiválasztott gitártól függő hangesemény. A végső tervünk egy hangszer szimulációs alkalmazás megvalósítása. A gitározás összetett művelet, ezért kezdetben csak a kéz felismerésével, valamint annak helyzetével és mozgásának követésével fogunk foglalkozni. Később tovább fogjuk fejleszteni a projektet és nemcsak gitározásra, hanem sok más hangszer emulációjára alkalmassá tesszük. Ilyen alkalmazások léteznek a mai piacon [4], de mindegyikük igényel valamilyen speciális eszközt (például kontrollert, kesztyűt, vagy speciális kamerát), ezekkel szemben a mi alkalmazásunkat egyszerűnek és költség hatékonynak tervezzük. A felhasználónak mindössze egy számítógépre és egy webkamerára lesz szüksége a használathoz. A kamera által adott képet úgy bővítjük ki, hogy a felhasználó lásson a monitoron egy gitárnyakat, hogy jobban érzékelje, amit csinál, ezzel teljesen bele tudja magát élni a program használatába. A gitározás szimuláláshoz pedig eredeti gitárhangokat fogunk használni, melyeket tárolt zenefájlokból álló adatbázisból fogunk előhívni a realisztikusabb élmény miatt, és hogy a későbbi bővíthetőségről könnyebben lehessen gondoskodni. A fejlesztés jövőbeli szakaszában több új választási lehetőséggel bővítjük az eddigi alkalmazást, amivel a fiatalokat akarjuk megnyerni. Egy olyan játékmóddal, amiben az emberi reflexeket kihasználva egy zeneszám utánozására tevődne a program lényege és egyben a játékos figyelme. Ennek egy másik változataként valósítanánk meg a tanító módot, amelyben a megfelelő pozíciók jelölésével sajátíthatnák el a kezdő felhasználók a dalok lejátszását. Reméljük, hogy a végső program megmozgatja annyira az emberek fantáziáját és természetesen a testét is, hogy úgy fognak rá tekinteni, mint a szórakozás legújabb formája, mely akár kiegészítheti a karaoke-t és a hasonló zenei szimulációs játékokat is.
3.2 Bevezetés A számítástechnika történetében sorra-másra jelentek meg újabb és újabb perifériák, vezérlők, mellyel a számítógépünket irányítjuk, másokkal kommunikálunk, vagy csak egyszerűen saját magunkat szórakoztatjuk. Ezek között viszonylag új keletűnek számítanak a rohamosan terjedő webkamerák. Egy ilyen eszköz felhasználásával kapnánk képet a felhasználóról és ennek a lehetőségeit kiaknázva működtetnénk alkalmazásunkat, tehát videó alapon ismernénk fel a különböző kézmozdulatokat, gesztusokat. A webkamera alapkövetelményének tekintjük a 20 FPS (Frame Per Second - másodpercenkénti képkockák száma) feldolgozási sebességet, 640*480-es felbontás mellett, mivel speciális részek megfigyelésére nincs szükségünk, pusztán a kezek mozgásait és pozícióját figyeljük, de ezt realisztikusan és gyorsan kell megtenni, ezért szükséges minél magasabb FPS. Első lépés a kéz detektálása valós időben, a pontos helyzetének meghatározása és szegmentálása a kép többi részétől. Problémát jelenthet a bejövő információ nagy mennyisége, ez megnehezítheti a feldolgozást. Az előfeldolgozás első lépéseként a képet kell megszűrnünk, hogy könnyebben el tudjuk különíteni a kép különböző elemeit. Ez után a 8
konkrét szegmentálást bőrszín alapján végezzük, hogy az éldetektálás pontosabb képet adjon a kézről. A kontúrok detektálásnál az alap szisztéma, hogy ahol intenzitásváltozás történik, ott nagy valószínűséggel él van. Az adott élek megkeresésével tudjuk meghatározni a kezek helyét a bejövő képen és meg tudjuk mondani, hogy melyik kéznek hol van a pozíciója a „gitárhoz” képest. Ezek után a legfőbb szerep a kezek követése lesz és a helyzetük folyamatos analizálása. Az alapján meg tudjuk határozni a változást, és ha ezek egy meghatározott tartományba lépnek, bizonyos eseményeket indukálnak a program futásában – esetünkben megszólaltunk egy vagy több hangot. Mivel a gitározásnál a két kéz különböző feladatokat lát el, ezért bal és jobbkezesek számára is kompatibilissé tesszük a rendszert, ezt a felhasználó fogja az alkalmazás elején beállítani. A kezek elmozdulását figyeljük, ezek alapján következtetünk a gitár nyakán elfoglalt helyre és ez által megszabott hangmagasságra, illetve a megszólaltatás időzítésére a másik kéz esetén. Ehhez a kezeket, mint objektumokat követnünk kell. Erre a feladatra a Kálmán-szűrő nyújthat majd segítséget illetve a kéz területének folyamatos súypontszámításával is követhetjük az objektumot. Elgondolásaink szerint a gitár nyakát két részre osztjuk fel: Az egyik rész felel a hangmagasság szabályozásáért, úgymond az „érintő kéz” megfelelője. Ezt a szakaszt tovább bontjuk adott számú kis részre, és amelyik részben található meg ez a kéz, annak megfelelő hangot fogunk lejátszatni. A felosztást több módon végezhetnénk el, opcionálisan lehet majd választani a gitár alaphangját és hogy onnan számítva kromatikusan (minden félhangnak külön rész), vagy valamilyen skála szerint (például dúr, moll) bontsuk több részre. A másik rész a „pengetés” időzítéséért felel. Ezen a szakaszon azt vizsgáljuk, hogy a másik, a pengető kéz, mikor halad el fölötte, ugyanis ekkor kell, mint ahogy a gitározásnál a pengetéskor, megszólaltatnunk a hangot. Ezt is felosztjuk több részre, amely a hang jellegét adja majd meg (például a tompítás mértékét, tehát hogy a gitár milyen időtartam hosszáig szól), ezáltal nagyobb variációs lehetőséget biztosítva a felhasználónak. Amennyiben a képen nem detektálható egyik kéz sem, például ha a felhasználó kiviszi a képből, vagy a háta mögé rejti, akkor a hangok lejátszása azonnal befejeződik. A gitár hangjait egy adatbankból nyerjük ki, így lehetőség lesz többféle hangszín, stílus emulálására, amiből a felhasználó ízlés szerint választhat és lehetőséget adunk rá, hogy egyénileg bővíthesse. Első elképzelésben három különböző módot tervezünk implementálni. Az első mód, a szabad játék, ahol a fentiek alapján a felhasználó játszhat a gitáron, kötöttségek nélkül. A második a játékmód. Ebben egy elhangzó dalt kell a felhasználónak „kísérnie” a gitáron. Ezt úgy képzeljük el, hogy egy alapzenére kell a felhasználónak adott időben, a megadott jelzések alapján (például a megfelelő pozíciók a gitár nyakán a megfelelő időben más színben tűnnek fel) a megfelelő hangot megszólaltatnia. Sikeres találat esetén pontot kap a játékos, ezáltal lehetőséget teremtünk a kompetitív felhasználásra. A harmadik módban a játékost tanítjuk a program használatára, részben demonstrációs jellegben, azaz animációt követve mutatjuk be a játékot és a virtuális gitár használatát.
9
3.3 A probléma elemzése és a specifikáció kidolgozása A korábbi kézdetektálással foglalkozó rendszereket két csoportba lehet osztani. Az egyik csoportban azok az alkalmazások találhatók, melyek a kézmozdulatok detektálásával foglalkoznak és ehhez pusztán képfeldolgozó algoritmusokat használnak. A másik kategóriába pedig olyan rendszerek tartoznak, melyek valamilyen cél eszköz segítségével gyűjtenek be információt a felhasználó kezeiről vagy azok mozgásának megállapításáról. A két kategória között helyezkedik el a Helsinki Egyetemen kifejlesztett rendszer a Virtual Air Guitar [4] (3.1. ábra). Itt nem a pusztán képfolyamból származó információ feldolgozással valósítják meg a működést, hanem egy speciális kesztyű használatával, mely egyedi színének köszönhetően gyorsítja az alkalmazást.
3.1. ábra Hasonló projekt a Helsinki egyetemen: Virtual Air Hand [4] Hasonló projekt a Helsinki egyetemen: Virtual Air Hand [4] Célunk, hogy kiküszöböljük a webkamerán kívüli interfészeket, hogy még élvezhetőbb hatást kapjunk. A megvalósításhoz kizárólag a manapság egyre gyorsabban fejlődő számítógépes képfeldolgozó algoritmusokat használjuk fel így nem kell semmilyen különleges felszerelést magunkra ölteni a rendszer működtetéséhez. Első elképzelésünk a kezek elkülönítésére a bőrszín alapú szegmentáció. A mozgáskövetéshez az optikai folyam technológiáját fogjuk használni, illetve egyéb súlypontszámítás alapú követési technikát is ki fogunk próbálni. A rendszer alapja egy hagyományos webkamera lesz és semmi egyéb különleges perifériára nem lesz szükség. Az elektromos gitározás legnagyobb hátránya a gitárhoz kapcsolódó kábel, mely eltörhet, útban lehet, korlátozhatja a használó mozgásterét. A mi szimulációs rendszerünkkel ezt a problémát szeretnénk feloldani. Első elképzelésünk alapján a rendszert három fő modul fogja alkotni, melyek a végrehajtási sorrendjük szerint következők:
előfeldolgozás értelmezés hang előállítás
Az előfeldolgozás a kamera inicializálásából, a kezdeti paraméterek felvételéből (például a bőrszín alapú szegmentáláshoz maszkot készítünk a háttérről) valamint a bőrszín alapú szegmentációból fog állni. A végeredménye egy szegmentált kép lesz, melyen a kezek valamint a fej lesz látható, minden egyéb részt megpróbálunk eltávolítani. A test elmozdulásának követésére és egyben a gitár testhez rögzítése miatt van szükség a fej megkeresésére és követésére (úgy látszódjon a kimeneti képen, mintha a gitár valójában a
10
felhasználó nyakára lenne akasztva). A következő modul, az értelmezés, legnagyobb részben a kezek követését fogja végrehajtani képkockáról képkockára. Előzetes kutatásaink alapján ezt a módszert optikai folyammal fogjuk megvalósítani illetve súlypontszámítás alapú technikákat találjuk használhatónak. A modul kimenete egy esemény lesz, melyet a képkocka egy megadott helyén lévő kézmozdulat fog kiváltani. A harmadik modul, azaz a hang modul feladata pedig, hogy a megadott esemény hatására megszólaljon a megfelelő hang. A hangadatbázist felhasználó által is könnyen bővíthetővé tesszük, hogy minél több gitár hangját lehessen utánozni.
11
4 Munkamegosztás a projekt során A részben arról lesz szó, hogy a projekt során milyen tevékenységekben vettem részt, melyek voltak azok a feladatok, amelyeket elvégeztem.
Irodalomkutatás: Az irodalomkutatási részben a SZÍNTEREK, ELŐFELDOLGÁZOZÁS SORÁN HASZNÁLATOS MÓDSZEREK illetve az OBJEKTUM KERESÉS kigyűjtése volt az én feladatom. Dokumentáció: 5.3, 5.4, 5.5 fejezetek. Rendszerterv: A rendszer tervezési részben a GLOBÁLIS RENDSZER BEMUTATÁSA, valamint az ELŐFELDOLGOZÁS modul megkonstruálását végeztem el. Dokumentáció: 6, 7.1 fejezet. Megvalósítás: A megvalósítási részben a TERVEZÉS SORÁN VÉGZETT MUNKAFÁZISOK ÉS TAPASZTALATOK, valamint a KÉPFELDOLGOZÓ MODUL megvalósításában vettem részt, a rendszerintegráció volt a feladatom. Dokumentáció: 8, 9.1, 9.2.9, 9.2.12-9.2.13 fejezetek. Tesztelés: A képfeldolgozó modul tesztelése volt a feladatom és TESZTELÉSI EREDMÉNYEK részben rögzítettem az elért eredményeket. Dokumentáció: 10. fejezet. Használati útmutató
12
5 Irodalomkutatás A körbejárandó témát már nagyon sokan feldolgozták, mi megpróbáltuk úgy összeállítani az anyagot, hogy logikailag kövessék egymást az egyes részek és alrészek. A projekt során elsődleges célunk a kéz mozgásának futás idejű figyelése és a minél gyorsabb reakció. Alapnak tekintjük az alábbi munkát: Gonzales R. C., Woods R. E. - Digital Image Processing [3], mely sok kiindulási információt ad ezen a területen.
5.1 Bevezetés A kézdetektáló rendszerek jelentős részére jellemző, hogy egy kamera segítségével tudnak kommunikálni a számítógéppel. A legtöbb rendszer hasonló séma alapján épül fel ezt a modellt próbáltuk mi is átvenni a rendszer alapjának megalkotása közben. Az első fázis az előfeldolgozás, melynek során a célunk a bejövő információ szűrése, azaz a kép „tisztítása”, esetleg simítása, vagy egyes esetekben kezdetleges felismerés, rendszer előkalibrálása, melynél beállítjuk a kezdő értékeket. A következő fázis a keresés, szegmentálás. Itt a feladatunk, hogy megkeressük a figyelni kívánt objektumot és azt elkülönítsük a környezetében lévő egyéb dolgoktól. Az ezt követő fázis a követés. A már megtalált és elkülönített objektumunkat figyelni kell és annak mozgását esetlegesen rögzíteni. Szükséges az állapotok meghatározása és rögzítése, hogy tisztában legyünk az egyes pillanatokban végbemenő műveletekkel, folyamatokkal. Ezt követő lépés az értelmezés, mely során az egyes objektumok mozgásából valamilyen eseményt csinálunk. A dokumentációban szereplő információk kigyűjtését e fázisok alapján állítottuk össze.
5.2 Zenei alapok 5.2.1 Hangtani alapok A gitár a húros hangszerek családjába tartozó zenei eszköz, azon belül pedig a pengetett típusúak közé soroljuk. Az igazi gitároknak több fajtájuk van, erősítéstől, húrok számától, hangmagasságtól függően, de a hang megszólaltatásának módja megegyezik. Maga a gitárhúr a gitár fejétől, az úgynevezett húrlábig kifeszítve található meg a hangszeren, ennek egyik részén a hang magasságát tudja szabályozni a játékos, a másik részén (hagyományos esetben) penget, ezzel szólaltatva meg a hangot. A kiadott hang magassága az adott acélhúr fizikai tulajdonságaitól, a hosszától, vastagságától és feszességétől függ, mivel ezek szabályozzák a hang frekvenciáját. Játék közben e hangszernél a húr pengetett részének hosszát változtatja a zenész azzal a módszerrel, hogy bizonyos helyen az adott húrt lenyomja a gitár nyakánál található fém szerelékhez, érintőhöz. Minél rövidebbé teszi ez által a húr pengetett részét, annál magasabb lesz a kiadott hang. Ha egy hang frekvenciájának kétszeresét vesszük, úgy ugyanazt a hangot kapjuk meg, csak egy oktávval magasabban. Egy oktáv 8 teljes hang távolságát adja meg (innen ered a neve is, a latin octo: 8 szóból), ezek között találhatóak meg a félhangok. Egy oktávban félhangokkal együtt 12 hang van. Egy érintőnyi távolság egy félhangnyit jelent a gitáron. Érintőkből hagyományos gitáron 18-24 számú van, persze eltérések előfordulnak mindkét irányba (több-kevesebb). Ahhoz, hogy annak a hangnak zenei értéke legyen, az adott húrt egy bizonyos alaphangra kell játék előtt hangolni. Mivel egy gitáron alapesetben több húr van, a húrokat egymáshoz képest különböző hangtávolságokra szokták ilyen módon kalibrálni. Hathúros, hagyományos gitár esetén a standard hangolás a húrokra az 5.1. táblázat szerinti hangtávolságokat jelenti. 13
5.1. táblázat Hangtávolságok Húr száma 6 5 4 3 2 1
Húr alaphangja E A D G b e
Előző húrtól vett hangtávolság +4 +4 +4 +3 +4
Ez a legvastagabb húr
Ez a „legmagasabb” húr, két oktávval szól a legmélyebb fölött.
Persze egy gitárt máshogy is szoktak hangolni, pl. reneszánsz zenékben a 3. húrt, vagy G-húrt, egy félhanggal lejjebb, F#-re hangolják, de country stílusban szeretnek előszeretettel ún. nyílt hangolásokat használni, ahol a hat húr üresen megszólaltatva egy tiszta harmóniát, akkordot ad ki, pl. C-dúrt. Harmóniának, vagy akkordnak hívjuk három, vagy több hang egyidejű megszólaltatását. Ezt gitáron több húr megpengetésével érjük el. Egy akkord hangzását két dolog határozza meg: az alaphang és a többi hang attól vett távolsága. Ennek alapján tudunk megkülönböztetni bizonyos típusú akkordokat, pl. ha egy hangot, egy tiszta tercével (3 hangtávolságra eső) és egy kvintjével (5 hangtávolság) együtt szólaltatunk meg, úgy dúr hangzatot kapunk. Ezen hangokhoz, ha hozzávesszük a velük harmonizáló hangokat, tehát amelyek konszonánsan szólnak együtt, megkapjuk egy adott hang, adott akkordbeli skáláját, avagy azon hangok sorát, amelyekkel az adott alaphang „szépen” együtt szól [8] [9].
5.2.2 Hanglejátszás A programban a hang megszólaltatását egy „hangbank” segítségével oldjuk meg. Ez egy adatbázist takar, amiben eltároljuk egy gitár hangját különböző hangmagasságokat játszva. Ezzel a módszerrel lehetőség nyílik több gitár/hangszín hozzáadására, sőt lehetővé tesszük, hogy a felhasználó is bővítse az adatbázist a saját hangjaival, amennyiben erre jelentkezik igénye. Mivel a gitár hangját nem csak az épp megszólaltatott hang magassága, hanem a beállított hangszín is nagyban befolyásolja, ezért elsősorban többféle hangszínnel felvéve bővítenénk az adatbankot. Ezen felül, mivel a gitár jelét digitalizáljuk, különböző effektusokkal módosítva azt, újabb hangzásokat hozhatunk létre. Ilyen effektusok lesznek a torzítás (túlvezérelt és négyszögesítési), visszhangos, zengetett, kórus hanghatású hangok. Ugyanígy lehetőség nyílik akkordos visszajátszásra, ahol egy pengetés a virtuális gitáron egy egész akkordot szólaltat meg. A felhasználó az adott akkord alaphangját jelöli ki a kezével, a program kiszámolja abból, hogy mely hangok tartoznak a beállított akkordtípushoz és a megfelelő hangokat egyszerre szólaltatja meg. Beállítható lesz, hogy az adott gitárnyakon kromatikus skála legyen elérhető, tehát egy teljes gitárnyakat, vagy gitárnyakrészt kapjunk, vagy esetleg egy skála hangjai legyenek a bejegyzéseknél, ezáltal harmonikusabb hangzást tud a felhasználó produkálni, kellemesebb kíséretet adva, könnyebb játék lehetőségével. Játék módban egy adott alapdallamra kell rájátszani majd a gitár sávját élőben, az alapján, hogy éppen milyen hangnak kell megszólalnia. Ezt a program mutatni fogja az adott érintőknél, hogy épp melyiknek kell következnie a helyes hangzásért és egyezés alapján pontokat kap. A pontosság lemérhetősége miatt és ez által kompetitív lehetőség nyílik. Bővíthetővé tesszük az alapzenék tárát is, hogy a játékos eljátszhassa kedvenc dalait, vagy kísérhesse őket, akár egyfajta gitár-karaokeszerűen.
14
Mivel az adatbank nagy tárterületet igényelhet, ezért a hangokat mindenképp tömörítve fogjuk tárolni, de a lehető legjobb minőséget megőrizve [10] [11].
5.3 Színterek 5.3.1 Bevezetés A színterekre a bőrszín detektálása miatt van szükségünk. RBG színtérben végezzük az előszűrést, mivel a bejövő képünk ebben a színtérben van megadva. Önmagában ez az előszűrés nem ad megfelelő eredményt, mivel a bőrszínt nem lehet benne elég pontosan meghatározni, ezt kijavítandóan van szükség a HSV színtérre, melyet az RGB konverziójának eredményéből kapunk.
5.3.2 RGB színtér Az RGB színtér olyan additív színtér, mely alapvetően három színből áll a piros, a zöld és a kék színekből. Azért érdemes róla beszélnünk, mert mind a monitor mind pedig a videokamerák RGB kimenetű színtérrel rendelkeznek [24]. Az 5.1. ábrán látható, hogy piros zöld kék szín keveréséből milyen egyéb mellék színeket tudunk előállítani. A kép közepén észrevehetjük, hogy a három 5.1. ábra szín maximális telítettségen kiadja a fehér színt, míg ha RGB színtér [16] egyik sem szerepel az a fekete, mely a színek körül helyezkedik el. Az 5.2. táblázaton megfigyelhetjük a három színnek megfelelő hullámhosszt, valamint az intenzitásukat (mely nagyon fontos tulajdonság és érdemes figyelni rá az egyes színterek konvertálásánál). R G B Hullámhossz [nm] 700,00 546,10 435,80 Intenzitás [rel] 1,00 4,59 0,06 5.2. táblázat (CIE (Commission Internationale d'Éclairage) 1931 [5])
5.3.3 HSV színtér A HSV színtér szintén három összetevővel írható fel, melyek az 5.2. ábrán is láthatóak [3]: Hue – színárnyalat, megmutatja, hogy melyik színértéket választottuk (R, Y, G, C, B, M). Saturation – telítettség, meghatározza, hogy az adott szín mennyire intenzíven jelenjen meg (pl.: nagyon sárga legyen, vagy csak kevésbé). Value – érték, mely azt mutatja, hogy mennyire helyezkedik közel a szín a feketéhez (kúp alja), vagy a fehérhez (kúp teteje). Ezzel a három értékkel sokkal inkább úgy tudjuk leírni a színeket, ahogy érzékeljük. A HSV színtér a bejövő képek előfeldolgozásánál fog nekünk nagy
15
5.2. ábra HSV színtér [17]
segítséget nyújtani, mivel pontosabban határozható meg benne a bőr színe [1].
5.3.4 Konverzió HSV és RGB között A konverzió időigényes művelet, de szükséges, mivel a bemeneti képünk RBG kép, nekünk viszont szükségünk lesz a HSV színtérre a bőrszín detektálás megkönnyítése érdekében. Gyorsíthatjuk a feldolgozásunkat, ha először RGB szűrést végzünk, majd a kézgyanús helyeken elvégezzük a HSV konverziót és vizsgálatot, mert így nem kell az egész képet konvertálnunk a helyes eredmény érdekében. A képfeldolgozási terület elterjedt eljárása, mely nem bonyolult, viszont bőrszín detektálásnál sűrűn használt, ezért igen sok helyen fellelhető [6]. Az algoritmus transzformációs mátrix nélkül alakítja át és vissza a két színteret, általában a telítettség és az érték 0-1 közé eső double típusú szám, az intenzitás értéke pedig 0-360 közé eső egész érték.
5.4 Előfeldolgozás során használatos módszerek 5.4.1 Szűrés Ezek az eljárások a kép valamilyen zajmentesítését végzik. A kép előzetes feldolgozására azért van szükség, hogy a későbbi eljárások, mint az éldetektálás, objektumkövetés már helyesen és gyorsabban működjenek. A szűréshez maszkokat használunk. Ezeket ráhelyezzük a kép minden egyes pixelére úgy, hogy annak origója az adott pixelre essék és a maszk alatti területet megszorozzuk a maszkban szereplő súllyal [2].
5.4.1.1 Átlagoló szűrő A maszk elemei pozitívak, a maszk mérete határozza meg a simítás mértékét. Finom részleteket eltűnteti, elmossa a képet. Zajszűrésre megfelelő.
5.4.1.2 Gauss szűrő Simító maszk képlete: 𝑒
𝑥 2 +𝑦 2 2∗𝜃 2
−
A maszkolás után az átlagoló szűrőnél több időt vesz igényben a futása, de értékesebb eredményt kapunk, mivel jobban eltűnteti a zajt [3],[7].
5.4.1.3 Medián szűrő A medián szűrés használata alatt a kép szomszédos pixelein haladnak végig és egy súlyozott mátrixszal számolják ki a kimeneti pixeleket. Az aktuális értéket a környező értékek mediánjával helyettesíti. Véletlenszerűen elhelyezkedő, de nem túl nagy terjedelmű (Pl.: mint a Gauss féle zaj) zaj kiszűrésénél hatékony.
16
5.4.2 Szegmentálás Szegmentálás során meg kell határoznunk, hogy mi az, ami szükséges lesz számunkra a továbbiakban. Ezzel csökkentjük a feldolgozandó adatok mennyiségét és elérjük, hogy gyorsítjuk az összfeldolgozást. Valamint meg kell találnunk a zavaró részeket, melyek hasonlíthatnak a keresendő objektumunkra, hogy el tudjuk őket távolítani.
5.3. ábra RGB hisztogram csatornánként ábrázolva
A részekre bontás az az eljárás, amely a képen található objektumokat és a hátteret elkülöníti. Az 5.3. ábrán látható egy RGB hisztogram, melyen különböző színekkel vannak az egyes csatornák jelölve. A hisztogram segítségével könnyen leolvashatók az azonos intenzivitású objektumok. A képről látszanak a völgyek és hegyek, melyeket gyakran szoktak küszöbértékként használni. Természetesen ez a szerencsés eset, miszerint könnyedén elválaszthatók az objektumok a háttértől, valójában viszont ez igencsak ritka. Mint említettük a szegmentálási folyamat alappillére a jól elkülöníthető objektumok és ideális esetben ezeket a képen közel azonos intenzivitású pixelekkel lehet azonosítani. Mivel esetünkben ezek az objektumok nem homogén háttér előtt szerepelnek a szegmentálás még nehezebb lesz. Hisztogram alapú szegmentálásnál a hátrány, hogy a szegmentálás ugyan gyors, de viszonylag nagy a hibaszázalék a zajnak köszönhetően. Ez a zaj lehet a megvilágításból keletkező árnyék, vagy ha több, ráadásul mozgó fényforrás is akad a helyen, amikor a szegmentálást végezzük nagyobb lesz a zaj előfordulása a feldolgozandó képen. A részterület alapú szegmentálás, melynél a küszöbérték lokálisan változhat, jó megoldásnak tűnhet, ám nem biztos, hogy kellőképpen gyorsan fogunk eredményhez jutni. Előnyünk származik viszont abból, hogy előre ismerjük az objektumot és vannak értékeink, melyek jó közelítéssel megadják a megfelelő intenzitás tartományokat, melyekbe a bőrszín nagy valószínűséggel beleesik. A megfelelő küszöbértéknek a bőrszín által meghatározott intenzitás tartományoknak a közelében kell lennie, hogy jól el tudjuk majd különíteni a kezeket a háttértől [18].
5.5 Objektumkeresés Célunk, hogy az előfeldolgozott képen megtaláljuk a kívánt objektumot, jelen esetben a két kezet. Ehhez gradiens alapú hisztogramot és optikai folyam technikát fogunk használni, melyet az irodalomkutatás során szintén ismertetünk.
5.5.1 Éldetektálás Az éldetektálás az a folyamat, mely során az objektumokat és háttért határoló éleket elkülönítjük. Élek a képen ott keletkeznek, ahol hirtelen intenzivitásváltozás történik. Matematikailag ez úgy írható le, hogy az intenzivitás gradiensből következtethetünk az élek helyére és nem utolsó sorban azok irányára. Ezek segítségével meg tudjuk határozni, a keresett objektumunk helyzetét a képen és következtetni tudunk az alakjára is [3]. Éldetektálásra rengeteg módszer és sablon létezik, ezek közül néhányat felsorolnánk:
17
Gradiens módszer Sobel operátor az 5.5. ábrán található Laplace operátor az 5.4. ábrán látható Marr-Hildreth operátor DoG operátor Canny éldetektáló 5.6. ábrán [12], [13]
Az éldetektálásnak több hátránya is van, de legjelentősebb talán az, hogy sok paraméter igen pontos beállítása szükséges az elvárt eredményhez és az élek ismerete számunkra nem ad elég információt a kezekről. További technikákkal kombinálva viszont jó eredményt kaphatunk.
5.4. ábra Best Laplace [13]
5.5. ábra Best Sobel [13]
5.6. ábra Canny [13]
5.5.2 Aktív kontúr A snake egy energia minimalizációs spline, amit külső kényszererők vezetnek és a képjellemzők felé mozgatnak. Ezt a módszert szokták objektumok követésére is használni, mivel a kontúr követi az objektum körvonalainak változását, tehát, ha a körvonal a képkockán távolabb kerül az eredeti helytől, akkor a snake is el fog mozdulni vele együtt [34]. Az aktív kontúr modell használatának első lépésénél a felhasználó egy magas szintű eljárást, vagy egy kezdeti görbét ad meg, ami közel helyezkedik el az objektum határához. A snake ezután elkezd deformálódni és fokozatosan a célobjektum határaira húzódik. Végül teljesen körbeveszi az objektumot. Az aktív kontúr modellben az objektum határait parametrikus görbével írjuk le, melyhez egy E energia funkcionál kapcsolható. Az objektum határainak megtalálásának feladatát egy energiaminimalizációs feladattá alakíthatjuk. A kép speciális (x, y) pontjait, melyek a kontúrt alkotják, egy paraméteres görbének tekintjük: v(s) = (x(s), y(s)) A kontúr egy bizonyos energiával rendelkezik (Esnake), amely három energiatag segítségével definiált [19]: 1
𝐸𝑠𝑛𝑎𝑘𝑒 =
𝐸𝑖𝑛𝑡𝑒𝑟𝑛𝑎𝑙 𝑣 𝑠 + 𝐸𝑒𝑥𝑡𝑒𝑟𝑛𝑎𝑙 𝑣 𝑠 + 𝐸𝑐𝑜𝑛𝑠𝑡𝑟𝑎𝑖𝑛𝑡 𝑣 𝑠 𝑑𝑠 0
Az energiatagokat úgy definiáljuk, hogy a görbe végső pozíciója a kontúron legyen minimális energiájú (Emin).
18
A belső energia (Einternal) a görbe belső paraméteritől függ. Két fontos paraméterrel rendelkezik:
elasztikus energia (Eelastic) hajlító energia (Ebending)
Ezek összege adja meg a végleges belső energiát. Az elasztikus energiát leginkább egy rugalmas gumiszalagként kell elképzelni, amely elasztikus potenciális energiával rendelkezik, növekvő feszültséggel csökkenti a megnyúlást: 1
𝐸𝑒𝑙𝑎𝑠𝑡𝑖𝑐 = 2
1 𝛼(𝑠)|𝑣𝑠 |2 𝑑𝑠 𝑠
𝑣𝑠 =
𝑑𝑣 (𝑠) 𝑑𝑠
Az α(s) súlyok teszik lehetővé az elasztikus energia szabályozását a kontúr mentén. α gyakran konstans, mely a kontúr összezsugorodásáért felelős. A másik tag a hajlító energia, melyet leginkább egy fémszalagként kell elképzelni, melynek merevsége adja ezt az energiát. A kontúr görbületek négyzetösszegeként definiálják:
𝐸𝑏𝑒𝑛𝑑𝑖𝑛𝑔
1 = 2
1
𝛽(𝑠)|𝑣𝑠𝑠 |2 𝑑𝑠 𝑠
A hajlító energia minimális, ha az objektum kör alakú. A fenti összefüggések alapján a snake teljes belső energiája: 1
𝐸𝑖𝑛𝑡𝑒𝑟𝑛𝑎𝑙
1 = (𝛼 𝑠 𝑣𝑠 2
2
+ 𝛽(𝑠) 𝑣𝑠𝑠 2 )𝑑𝑠
𝑠
A kontúr külső energiája (Eexternal) a képből határozható meg, melynek értéke statikus. Definiáljunk egy Eimage(x,y) függvényt, hogy a kisebb értékeit a számunkra érdekes jellemzőknél (a határoknál) vegye fel: 1
𝐸𝑒𝑥𝑡𝑒𝑟𝑛𝑎𝑙 =
𝐸𝑖𝑚𝑎𝑔𝑒 (𝑣(𝑠))𝑑𝑠 𝑠
A probléma megoldása egy olyan v(s) görbe, amely minimalizálja az energiát: 1
𝐸𝑠𝑛𝑎𝑘𝑒
1 = ( 𝛼 𝑠 𝑣𝑠 2
2
+ 𝛽 𝑠 𝑣𝑠𝑠
2
+ 𝐸𝑖𝑚𝑎𝑔𝑒 (𝑣(𝑠)))𝑑𝑠
𝑠
A variációszámítási feladatot figyelembe véve és az Euler-Lagrange differenciálegyenletből: 𝛼𝑣𝑠𝑠 − 𝛽𝑣𝑠𝑠𝑠𝑠 − 𝛬𝐸𝑖𝑚𝑎𝑔𝑒 Az egyenlet úgy interpretálható, mint erők egyensúlya. A kontúr ezen erők hatására változik. A kontúr v(s) vezérlőpontok halmazával reprezentálható, a görbe szakaszonként lineáris és a vezérlőpontokban csatlakozik. Az erő egyenleteket minden kontrolpontra külön alkalmazzuk. Ennek a következménye lesz, hogy minden kontrolpont az erők hatására mozog.
19
Az energia és az erőtagok esetében a diszkretizálás a deriváltak differenciákkal történő közelítésével történik. Az objektumdetektálás problémája, hogy energia minimum meghatározásra redukálódik, valamint a kezdeti görbe felvétele nagyban befolyásolja az algoritmus jóságát, valamint kis hatótávolsággal rendelkezik (határtól messze lévő pontokra nem hat a külső erő).
5.6 Objektumkövetés Az objektumkövetés az a folyamat, amelynek során egy a háttértől jól elkülöníthető objektum mozgását követi a rendszer. Ennek az eljárásnak nagy szerepe van a projektben, mert ez alapján generálja rendszerünk a kibocsátandó hangokat. Több lehetőség is adott arra, hogy egy objektumot kövessünk a mozgóképen. Alapesetben megtehetnénk azt, hogy minden egyes képkockára külön-külön szegmentáló algoritmussal vizsgálatot indítunk, és ez által írjuk le egy megadott objektum mozgását. Ez viszont elég lassúvá válhat folyamatos kép esetén, úgyhogy más módszerhez folyamodunk. Megoldást jelenthetne, hogy kettő vagy több, egymást követő képkocka különbségét tekintenénk, és a változásokból következtetnénk egy adott objektum elmozdulására. Ezzel a legfőbb gond a zaj megjelenése lehet, mivel az sosem állandó, így képről-képre azt is objektumként érzékelnénk, ami helytelen következtetésekre adna alapot. Lehet továbbá egy konstans hátteret elkülönítve az azon bekövetkező változásokat figyelni és ez által leírni a mozgásokat. A gond magának a konstans háttérnek az előállításánál jelentkezik, mivel nem tudjuk, hogy a kamera képén jelentkező első képkockát tekinthetjük-e háttérnek, vagy sem. Ha egy képkockán megtaláltuk a követendő objektumot, avagy jelen esetben a játékos kezét, onnantól fogva nagyban gyorsíthatja a program működését, ha nem az egész képet nézzük át a kéz megkereséséért, hanem csak azt a régiót, ahol az előző képkockán a kezeket megtaláltuk. Ezáltal a program futását optimalizálhatjuk, mivel nem egy n*m felbontású képet kell másodpercenként 24-szer kielemezni, hanem csak két kisebb régiót az eredeti képen belül. Természetesen, mivel ezekből a régiókból a kéz kimozdulhat, így ezt a figyelendő területet is képről-képre, a megfelelő új pozícióra kell vinni, ami pár lépésnyi plusz számítást jelent majd a programon belül, de biztosan elhanyagolható a teljes kép átvizsgálásához képest. Természetesen egy objektum konkrét detektálására több algoritmus is létezik, ám kritikus szempont mindegyiknél a zajszűrés [2],[3],[14].
5.6.1 Kálmán szűrő A Kálmán szűrő egy kétlépéses, rekurzív algoritmus, mely segítséget nyújt abban, hogy olyan környezetben, ahol a „fehér zaj” jelentős, képesek legyünk egy bizonyos objektum mozgását jó közelítéssel megmondani. A Kálmán-szűrő ezt két lépésben valósítja meg. Első lépésként a jelenlegi képkockából felírja az adott megfigyelendő objektum lehetséges mozgási egyenletét, tehát egyfajta becslést adunk a bekövetkező mozgásra. Fontos megjegyezni, hogy a Kálmán-szűrő pontszerű objektumok lineáris mozgását képes leírni, összetettebb esetben a kiterjesztett Kálmán-szűrő segítségével visszavezetjük a helyzetet ilyenre. Második lépésként megnézzük, hogy a valóságban, ténylegesen mi változott és a különbséggel súlyozva megváltoztatjuk a kiinduló egyenletünket, ezáltal egyre pontosabb leírást kapva az adott mozgásról [2],[3],[15].
20
5.7 Szín alapú mozgáskövetés 5.7.1 CamShift algoritmus
5.7.1.1 Mean Shift A CamShift [30], [31] algoritmus eredete visszavezethető Fukanaga és Hostetler által bemutatott Mean Shift eljárásra. Ez egy paraméter nélküli gradiens becslő eljárás, amely egy diszkrét feltételes valószínűségi képen dolgozik. Az algoritmus a kép egy részletén fut, melyet kereső ablaknak nevezünk. Ez az ablak a feltételes valószínűségi kép súlypontjában helyezkedik el. Az algoritmus működésének lépéseit az alábbi módon lehet összefoglalni: 1. 2. 3. 4. 5.
Megadjuk a kereső ablak méreteit. Megválasztjuk a kereső ablak helyét a képen. Kiszámoljuk a kereső ablakban a súlypontot. A kereső ablak középpontját igazítsuk az előző lépésben meghatározott súlypontra. Ismételjük a 3. és 4. lépést mindaddig, amíg a követő ablak középpontja és a súlypont közti távolság egy megadott érték alá nem csökken.
5.7.1.2 CamShift A CamShift egy paraméter nélküli modell vezérelt vizuális követőrendszer, melynek működése hasonló a Mean Shift algoritmushoz, ezen felül ez eljárás alkalmazkodó és a valószínűségi eloszlást az idő függvényében változtatja. A követendő objektum ebben az esetben egy statikus szín alapú hisztogrammal van modellezve. Minden egyes frame esetén az algoritmus a kép egy részletén, vagyis a kép pontjainak egy részhalmazán dolgozik. Eltárolja az eloszlás súlypontját és az adott régióra vonatkozó nulladik momentumot. A nulladik momentum a feltételes valószínűségi értékek összege. A kereső ablak méretét és pozícióját az aktuális képkockán úgy határozzuk meg, hogy az előző képkocka nulladik momentumát és súlypont elhelyezkedését vesszük alapul. Ezért tehát ez az algoritmus egy visszacsatolt ciklus alapján működik. Az eljárás lépései a követők: Állítsuk a figyelemmel kísért területet az egész képre. Válasszunk egy kiindulási pontot a Mean Shift algoritmus kereső ablakának. A kiválasztott helyen található az a bizonyos eloszlás, amit követni szeretnénk 10.3. Számoljuk ki a Mean Shift algoritmus kereső ablaka által kijelölt területen a színre vonatkozó feltételes valószínűségi eloszlást. 10.4. Iteráljuk a Mean Shift algoritmust annak érdekében, hogy megtaláljuk a feltételes valószínűségi kép súlypontját. Tároljuk el az eloszlási terület nulladik momentumát és a súlypont elhelyezkedését. 10.5. A következő képkockánál helyezz a kereső ablak középpontját az előző lépésben meghatározott pozícióba és állítsuk be az ablak méretét nulladik momentumnak megfelelően. 10.1. 10.2.
5.7.1.3 Színterek felhasználása A CamShift algoritmus a mozgó objektumok követéséhez a színteret veszi alapul. Mint ahogy azt már fentebb is említettük az egyes színek az értékeiket a színterekből vehetik fel, tipikusan 3 illetve 4 csatornán. A camshift a lehetséges színterek közül a HSV-t használja fel működésének alapjául, ahol jól el tudjuk különíteni az egyes színeket. 21
5.7.1.4 Objektum modell A CamShift algoritmus objektum modellként a szín alapú hisztogramokat használja. A szín alapú hisztogram a színes kép színeinek eloszlását reprezentálja. A színalapú hisztogramot a pixelek számából származtatjuk, amelyek a színhalmaz egyes értékeit veszik fel. A hisztogram dimenziója megegyezik azon színtér csatornáinak számával, amelyben le szeretnénk írni az adott objektumot. Például arckövetésre tipikusan csak egy csatornát alkalmaznak, mégpedig a HSV színtér H értékeit. Általános esetben objektumkövetésre a HSV mind három csatornáját igénybe veszik. Akárhány dimenzióban megadhatjuk a hisztogramot, viszont a modellhez az is hozzá tartozik, hogy hány vödörre osztjuk az adott dimenziókat.
5.7.1.5 Színes kép valószínűségi eloszlása Legnagyobb részben a CamShift algoritmus a színes kép feltételes valószínűségének egy részhalmazán dolgozik, amit a gyakorlatban kereső ablaknak nevezünk. A feltételes valószínűséget Bayes tétel segítségével számoljuk ki az általunk érdekelt területen, vagyis a kereső ablakban a következő módon: 𝑃 𝑂𝐶 =
𝑃 𝐶𝑂 𝑃 𝑂 𝑃 𝐶
P(O|C) az adott pixelhez megadja azt a valószínűséget, hogy milyen mértékben tartozik a számunkra érdekelt objektum színéhez. A P(C|O) ebben a kifejezésben nem más, mint az objektum modell, más szóval az objektumhoz tartozó színalapú hisztogram. Illetőleg a P(O) és P(C) azt valószínűséget adja meg, hogy a pixel mennyiben reprezentálja a keresett objektumot és mennyiben tartozik annak színéhez.
5.7.1.6 Súlypontszámítás A camshift algoritmus az által tudja követni az objektumot, hogy kereső ablakot minden képkockánál beállítjuk a feltételes valószínűségi eloszlás adott régiójának középpontjába. A régió középpontja, vagyis súlypontja a két dimenziós diszkrét feltételes valószínűségi képen az alábbi módon számolható: Első lépésben számoljuk ki a régióra vonatkozó nulladik momentumot másképp kifejezve a területet, amely a feltételes valószínűségi értékek összegzésével érhető el: 𝑀00 =
𝐼 𝑥, 𝑦 𝑥
𝑦
Következő lépésben határozzuk meg az x és az y tengelyre vonatkozó első momentumokat: 𝑀10 =
𝑥𝐼 𝑥, 𝑦 𝑥
𝑦
𝑀01 =
𝑦𝐼 𝑥, 𝑦 𝑥
𝑦
22
Végül a kereső ablakhoz tartozó súlypont koordináták a felírt egyenletek hányadosaként számolható ki: 𝑥𝑐 =
𝑀10 𝑀01 ; 𝑦𝑐 = , 𝑀00 𝑀00
ahol I(x, y) az adott pixel feltételes valószínűségi értéke az eredeti kép (x,y) pontjában és x valamin y a kereső ablak koordináta tengelyei.
5.8 Viola-Jones féle objektumdetektálás Fejdetektálásra Paul Viola és Michael J. Jones [29] által fejlesztett robosztus, azaz a feldolgozandó kép minőségére érzéketlen, valós idejű objektum detektort használjuk. A detektor szürkeárnyalatos képekből kapott információk alapján dolgozik és magas képfeldolgozási arányt képes elérni. A rendszer működésének első fontos megközelítése az új képreprezentáció, melyet integrális képnek nevezzünk. A rendszer a képrégiók jellemzőivel dolgozik, nem pedig közvetlenül a képintenzitásokkal. Az integrális kép abban segít, hogy gyors jellemző kiértékelés legyen elérhető, az integrális kép előállításához pedig pontonként csak néhány elemi művelet szükséges. A második fontos alkotóeleme a rendszernek egy osztályozó létrehozása, a lényeges jellemzők kis halmazának megállapításával. Ehhez a folyamathoz az AdaBoost-on alapuló tanuló algoritmus használandó. A jellemzők száma egy képrészleten belül sokkal nagyobb, mint a pixelek száma. A gyors osztályozás elérésének érdekében, a tanuló folyamatnak a kritikus jellemzők kis halmazára kell koncentrálnia. A harmadik lényeges része a rendszernek az egyre bonyolultabb osztályozó egymás után kombinálása, azaz kaszkád struktúrába szervezése, mely azzal növeli a rendszer sebességét, hogy a kép azon területeire tudunk fókuszálni, amelyek sokat ígéretesebbek. A rendszer vizsgálatának szemszögéből lényeges a hamis negatívok, azaz a nem detektált objektumok aránya.
5.8.1 Jellemzők A rendszer egyszerű úgynevezett Haar féle jellemzők alapján valósítja meg az osztályzást. A Viola-Jones rendszer ezeknek a jellemzőknek három fajtáját használja. Az egyik jellemző a „két-téglalap jellemző”, értéke a pixelek összegének különbsége két téglalap terület között. Az 5.7. ábrán ezt a jellemzőt az ’A’ illetve ’B’ téglalapok illusztrálják. A területeknek ugyanakkora a mérete és alakja és függőlegesen vagy vízszintesen szomszédosak. A második jellemző a „három-téglalap jellemző”, amelynél a két szélső téglalap pixeleinek összegét vonjuk le a középső téglalap pixeleinek összegéből. Végül pedig a „négy-téglalap jellemző”, melynél diagonális téglalap párok közötti különbséget számítjuk. Ezt az utóbbi két jellemzőt az 5.7.-es ábrán a ’C’ valamint a ’D’ téglalapok szemléltetik.
23
5.7. ábra Téglalap jellemzők
5.8.2 Integrális kép Az integrális kép a kép közbülső reprezentálására szolgál, amelyből a téglalap jellemzőket könnyen és gyorsan ki lehet számolni. Az integrális kép minden pontja a tőle balra fent levő téglalapban elhelyezkedő pixelek intenzitásértékeinek összegét tartalmazza. Az integrális kép - ii(x; y) – az eredeti képből - i(x; y) – az alábbi egyenlettel írható fel: 𝑖 𝑥′ , 𝑦′
𝑖𝑖 𝑥, 𝑦 = 𝑥 ′ ≤𝑥,𝑦 ′ ≤𝑦
Az 5.8 ábra azt szemlélteti, hogy az integrális kép adott (x, y) pontjának értéke meghatározható az eredeti képből, az (x, y) ponttól balra fent levő téglalapban elhelyezkedő pixelek intenzitásértékeinek összegeként.
5.8. ábra Az integrális kép meghatározása az eredeti képből
Az integrális képet így egyszer kell csak számolni az eredeti képből, majd a későbbiekben a jellemző kiértékelésben használjuk. Az integrális képet használva egy téglalap összeg négy tömbhivatkozással számítható. Az 5.9. ábra azt szemlélteti, hogyan határozható meg D-be eső képpontok összege az integrális kép négyszeri elérésével. Tehát az integrális kép értéke az 1-es számmal jelölt pozícióban az ’A’ téglalapba eső képpontok intenzitásösszege. 2-essel jelölt pontban az érték A + B, 3-ban A + C, 4-ben A + B + C + D. Így a D-vel jelölt téglalapba eső pixelintenzitások
24
összeg az integrális képből a 4 + 1 - (2 + 3) pontok értékeinek összegzésével határozható meg.
5.9. ábra Az integrális kép használata
A fentiekből az következik, hogy a „két-téglalap jellemző” kiszámítható hat tömbhivatkozással, a „három-téglalap jellemző” nyolccal, a „négy-téglalap jellemző” pedig kilenc hivatkozással.
5.8.3 Osztályozó függvény tanítása Az előző lépésben meghatározott integrális kép segítségével már hatékonyan számolhatók a jellemzők. Ha adottak a jellemzők, továbbá a pozitív és a negatív tanítópéldák halmaza, a gépi tanulás bármely megközelítése használható az osztályozó függvények tanításához. A kép egy ablakában körülbelül 45.000 téglalap jellemző van. Ez a szám jóval nagyobb, mint a képpontok száma. A jellemzők teljes halmazának számítása megengedhetetlen, annak ellenére, hogy a jellemzők számítása hatékonyan megoldható az integrális kép segítségével. Viszont e jellemzők egy kisebb részhalmaza már elegendő egy hatékony osztályozó létrehozásához. A feladat ezen osztályozók megtalálása. A rendszerben a jellemzők kiválasztására és az osztályozók tanítására, az AdaBoost egy változatát használják. Az AdaBoost eredetileg gyenge osztályozó függvények kombinálásával egy erős osztályozót képes előállítani, ami azt eredményezi, hogy tetszőleges tanuló algoritmus javítására használható. A gyenge osztályozót lefuttatjuk egy tanítóhalmazon, majd a teljes tanítóhalmaz osztályozása után az előző osztályozó által hibásan osztályozott példákat újra súlyozzuk, végül újra elvégezzük a tanítást. A gyenge osztályozók lineáris kombinációja egy erős osztályozót eredményez, egy küszöbértékkel kiegészítve. A hagyományos AdaBoost folyamatot könnyen értelmezhetjük egy mohó jellemző kiválasztó folyamatként, amely egy hatékony eljárás jó osztályozók kis halmazának kiválasztására, amik jelentősen eltérőek lehetnek. Az eljárás úgy van megvalósítva, hogy a gyenge tanuló meg van szorítva az osztályozó függvényeknek arra a halmazára, melyek csak egyszerű jellemzőktől függnek. A gyenge tanuló algoritmust úgy tervezték meg, hogy válasszon egy egyszerű téglalap jellemzőt, mely a legjobban tudja szétválasztani a pozitív illetve a negatív példákat. Minden jellemzőhöz a gyenge tanuló meghatározza az optimális küszöb osztályozó függvényt, ami a példák minimális számú halmazát osztályozza rosszul. Így egy gyenge osztályozó (hj(x)) egy jellemzőből (fj), egy küszöbből (𝜃j) és egy paritásból (pj) áll, ahol a paritás az egyenlőtlenség jel irányát jelöli és a bemeneti x egy a képnek egy részablaka, mely 24x24 pixel felbontású:
25
𝑗 𝑥 =
1, 0,
𝑝𝑗 𝑓𝑗 𝑥 < 𝑝𝑗 𝜃𝑗 𝑘ü𝑙ö𝑛𝑏𝑒𝑛
Alacsony hiba eléréséhez nem lehet egyszerű jellemzővel megvalósítani az osztályozást. A folyamat korai szakaszában kiválasztott jellemzőkkel 0.1 és 0.3 közötti hibaarány érhető el. A későbbi körökben választott jellemzők, melyek egyre bonyolultabbak, 0.4 és 0.5 közötti hibaarányt produkálnak. A tanuló algoritmus T hipotéziseket definiál, ahol minden hipotézis egy egyszerű jellemzőt használ. A végső hipotézis a T hipotézisek egy súlyozott lineáris kombinációja, ahol a súlyok fordítottan arányosak a tanulási hibával. Az algoritmus leírása a következő:
Adottak n darab tanítóminta 𝑥𝑖 , 𝑦𝑖 , … , (𝑥𝑛 , 𝑦𝑛 ), ahol 𝑦𝑖 = 0,1 a negatív és a pozitív képeknél. 1 1 A kezdeti súlyok 𝑤1,𝑖 = 2𝑚 , 2𝑛 minden 𝑦𝑖 = 0,1-nek megfelelően, ahol m és l a negatív és pozitív példák száma. Minden t = 1,…, T-re 1. Normalizáljuk a súlyokat úgy, hogy 𝑤𝑡,𝑖 a valószínűségi eloszlás legyen: 𝑤𝑡,𝑖 𝑤𝑡,𝑖 ← 𝑛 𝑗 =1 𝑤𝑡,𝑖 2. Minden egyes 𝑗 jellemzőre tanítsunk egy 𝑗 osztályozót, ami csak egyetlen egyszerű jellemzőt használhat. A 𝑤𝑡 -vel súlyozott hiba: 𝜖𝑗 =
𝑤𝑖 𝑗 𝑥𝑗 − 𝑦𝑖 𝑖
3. Válasszuk ki 𝑡 osztályozót, melynek a legkisebb 𝜖𝑡 hibája van. 4. Súlyozzuk át a tanítóhalmazt a következő féle módon: 1−𝑒 𝑤𝑡+1,𝑖 = 𝑤𝑡,𝑖 𝛽𝑡 𝑗 , ahol 𝑒𝑗 = 0, ha az 𝑥𝑖 példát helyesen osztályoztuk, 𝑒𝑖 különben és 𝛽𝑡 =
𝜖𝑡 1−𝜖 𝑡
.
5. A végső erős osztályozó az így kapott gyenge T darab 𝑡 osztályzó kombinációja: 𝑇 1 𝑇 1 1, 𝛼𝑡 𝑡 𝑥 ≥ 𝛼 𝑥 = 2 𝑡−1 𝑡 , ahol 𝛼𝑡 = log . 𝑡−1 𝛽𝑡 0, 𝑘ü𝑙ö𝑛𝑏𝑒𝑛
5.8.4 Kaszkád A következő lépésben arról lesz szó, hogyan lehet az osztályozókat kaszkádba szervezni, ami növeli a detektálási arányt és jelentősen csökkenti a számítási időt. Az eljárás arra alapszik, hogy könnyű olyan egyszerű osztályozókat készíteni, melyek a hamis ablakok többségét elutasítják, míg majdnem minden pozitív példát detektálnak. Tehát egyszerű osztályozókat használnak a negatív példák elutasítására és az összetettebbeket azokon a területeken, amelyek ígéretesebbek, annak érdekében, hogy minél alacsonyabb pozitív hamis arányt érjenek el. A kaszkád szintjei az AdaBoostot használó osztályozók tanulása során jönnek létre. Két-jellemzős erős osztályozó már hatékony arcszűrőt eredményez az erős osztályozó küszöbének olyan beállításával, amely minimalizálja a hamis negatívok számát. Az AdaBoost 1 kezdeti küszöbértéke (2 𝑇𝑡=1 𝛼𝑡 ), minimalizálja a tanítóhalmazon a hibaarányt. Alacsonyabb küszöb magasabb detektálási arányt és magasabb hamis pozitív arányt eredményez. Egy érvényes tanítóhalmazt használva, a két jellemzős osztályozó beállítható, úgy hogy az arcok 100%-át detektálja 40% hamis pozitív eredmény mellett.
26
A két jellemzős osztályozónak detektálási teljesítménye még nem elfogadható. Mindamellett az osztályozó kevés művelettel jelentősen csökkenti azoknak az alablakoknak a számát, melyek további feldolgozást igényelnek: 1. A téglalap jellemzők kiértékelése (jellemzőnként 6-9 tömbhivatkozás). 2. A gyenge osztályozó kiszámítása (minden jellemzőre egy műveletet, egy küszöbölést igényel). 3. A gyenge osztályozók kombinálása (jellemzőnként egy szorzást, egy összeadást és végül egy küszöbölést igényel). A két-jellemzős osztályozó számításigénye körülbelül 60 mikroprocesszor utasításba kerül. Bármilyen egyszerűbb szűrővel nem lehet magasabb elutasítási arányt elérni. Összehasonlítva egy egyszerű képletapogatással, vagy egy egyrétegű perceptronnal, 20-szor kevesebb időt vesz igénybe a két jellemzős módszer képablakonként. Az általános formája a detektálási folyamatnak egy degenerált döntési fa, melyet kaszkádnak nevezünk (5.10. ábra). Egy pozitív eredmény az első osztályozóból kiváltja a második osztályozó kiértékelését, mely szintén úgy van beállítva, hogy magas detektálási arányt érjen el. Egy pozitív eredmény a második osztályozóból kiváltja a harmadik osztályozó kiértékelését és így tovább. Egy negatív eredmény bármely szinten az alablak azonnali elutasításához vezet.
5.10.
ábra Kaszkád
A kaszkád struktúra azt a tényt tükrözi, hogy egy kép túlnyomó többségű képablaka negatív. Ezért a kaszkád minél több negatívot próbál elutasítani a legkorábbi szinteken. Mivel egy pozitív egyed kiváltja az összes szint kiértékelését, ez egy rendkívül ritka esemény. Hasonlóan egy döntési fához, a részsorozat egy osztályozóját azokkal a példákkal taníjuk, melyeket az előző szakaszokon átmentek. Ezt azt eredményezi, hogy a második osztályozó sokkal bonyolultabb, mint az első. A példák, melyek átmennek az első szinten, összetettebbek, mint az általános példák.
27
5.8.4.1 A kaszkád szintjeinek tanítása A kaszkád előállító folyamat minél magasabb detektálási arányt és minél alacsonyabb detektálási műveletigényt próbál meg elérni. A régebbi rendszerek az arcdetektálás terén jó eredményt értek el (85 és 95% közötti detektálási arányt) és nagyon alacsony hamis pozitív arányt (10-5 és 10-6 között). A kaszkád szintek számának és a szintek méretének elegendő nagynak kell lennie, hogy a régebbi rendszerekhez hasonló detektálási teljesítményt tudjon elérni, miközben a számításigényt csökken. Az osztályozók kaszkádja, melynek hamis pozitív aránya: 𝐾
𝐹=
𝑓𝑖 , 𝑖=1
ahol F a kaszkád hamis pozitív aránya, K az osztályozók száma és fi az i-edik osztályozó hamis pozitív aránya a példákon, melyek eljutnak az adott szintig. A detektálási arány: 𝐾
𝐷=
𝑑𝑖 , 𝑖=1
ahol D a kaszkád detektálási aránya, K az osztályozók száma és di az i-edik osztályozó detektálási aránya a példákon, melyek eljutnak az adott szintig. Meghatározhatók a célarányok a kaszkád minden szintjéhez, annak érdekében, hogy adott hamis pozitív- és detektálási-arány legyen elérhető. Például 0.9 detektálási arány egy 10 szintes osztályozóval elérhető, ha minden szint detektálási aránya 0.99, mivel 0.9 ≈ 0.9910 Ennek a detektálási aránynak az elérése ijesztő, viszont jelentősen könnyít a dolgon, hogy minden szintnek megközelítőleg csak 30%-os hamis pozitív arányt kell elérnie (0. 3310 ≈ 6 × 10−6 ). A kiértékelt jellemzők száma a kép pásztázása során egy valószínűségi folyamat függvénye. Bármely alablak addig halad a kaszkádon, egyszerre csak egy osztályozón át, míg ki nem derül, hogy az ablak negatív, vagy ritka pozitív eredményt ad. A folyamat várt viselkedését meghatározza a kép ablakok szétosztása egy tipikus teszt halmazon. Minden osztályozó kulcsmértéke a „pozitív arány”, mely azoknak az ablakoknak az aránya, amikre az osztályozó pozitív választ ad. A kiértékelt jellemzők számának várható értéke: 𝐾
𝑁 = 𝑛0 +
𝑛𝑖 𝑖=1
𝑝𝑗 , 𝑗 <𝑖
ahol N a kiértékelt jellemzők várható értéke, K az osztályozók száma, 𝑝𝑖 az i-edik osztályozó pozitív aránya és 𝑛𝑖 a jellemzők száma az i: osztályban. Érdekes módon, attól fogva, hogy az objektumok nagyon ritkák, a "pozitív arány" egyenlő a hamis pozitív aránnyal. A kaszkád elemeit tanító folyamat odafigyelést igényel. Az AdaBoost tanító algoritmus a hibák minimalizálására törekszik, nem úgy tervezték, hogy magas detektálási arányt érjen el magas hamis pozitív arányok költsége mellett. A hibák elkerülés úgy érhető el, hogy az AdaBoost által létrehozott perceptron küszöb értékét beállítjuk. Magas küszöb kevesebb hamis pozitívat detektáló osztályozót eredményez, alacsonyabb detektálási aránnyal. Alacsony küszöbbel pedig olyan osztályozót kapunk, mely több hamis pozitívat és magasabb detektálási arányt ér el. 28
A teljes tanítási folyamat két különböző, egymásnak ellentmondó kritérium optimalizálását igényli. A legtöbb esetben egy osztályozó több jellemzővel magasabb detektálási arányt és alacsonyabb hamis pozitív arányt ér el. Ugyanakkor egy több jellemzővel rendelkező osztályozó több számítási időt igényel. Egy optimalizációs keret definiálható, amelyben az osztályozó szintek száma, a jellemzők száma, 𝑛𝑖 , minden szinten, minden szinthez a küszöbérték úgy kivitelezett, hogy minimalizálja a jellemzők N számát, adott F és D célértékek mellett. Ennek a minimumnak a megtalálása viszont igen nehéz feladat. A gyakorlatban a hatékony osztályozók előállításához egy nagyon egyszerű alkalmazást használnak. A felhasználó kiválasztja a minimum elfogadható 𝑓𝑖 , valamint 𝑑𝑖 arányokat. A kaszkád minden szintjét AdaBoost-tal tanítják, úgy hogy a jellemzők számát addig növelik, míg a célul kitűzött detektálási és hamis pozitív arányokat el nem érik. Az arányokat egy érvényes halmazon a detektor tesztelésével kapják meg. Ha még nem érték el a célul kitűzött hamis pozitív arányt, további szinteket adnak a detektorhoz. A negatív halmazt a következő szintek tanításához az aktuális detektor futtatása során kapott hamis pozitív eredményekből kapható. Az algoritmus a következő: A felhasználó meghatározza a kaszkád minden szintjéhez az f értéket, azaz a maximálisan elfogadható hamis pozitív arányt és d értéket, vagyis a minimálisan elfogadható találati arányt. Ezután a felhasználó meghatározza a teljes kaszkádra vonatkozó hamis pozitív arányt, amit 𝐹𝑐é𝑙 -vel fogunk jelölni. a pozitív példák halmaza: P a negatív példák halmaza: N 𝐹0 = 1.0; 𝐷0 = 1.0 𝑖=0 amíg 𝐹𝑖 > 𝐹𝑐é𝑙 - 𝑖 ←𝑖+1 - 𝑛𝑖 = 0; 𝐹𝑖 = 𝐹𝑖−1 - 𝐹𝑖 > 𝑓 × 𝐹𝑖−1 𝑛𝑖 ← 𝑛𝑖 + 1 P és N halmazok felhasználásával tanítsunk egy 𝑛𝑖 jellemzős osztályozót az AdaBoostot algoritmussal. Értékeljük ki az aktuális kaszkád osztályozót az érvényességi halmazon az 𝐹𝑖 és 𝐷𝑖 meghatározásához. Csökkentsük az i-edik osztályozó küszöb értékét, amíg az aktuális kaszkád osztályozó eléri a minimum 𝑑 × 𝐷𝑖−1 detektálási arányt (ez befolyásolja 𝐹𝑖 értékét is). - 𝑁←∅ - Ha 𝐹𝑖 > 𝐹𝑐é𝑙 , akkor értékeljük ki az aktuális kaszkád detektort azokon a képeken, melyek nem tartalmaznak arcokat és tegyünk minden hamis detektálást az N halmazba.
29
5.8.5 Viola-Jones objektumdetektáló összefoglalás A Viola-Jones objektum detektor robosztus valósidejű objektumdetektálásra képes. Érzéketlenek a zajra és gyorsfeldolgozásra képesek magas detektálási arány mellett. A detektorok tanítása során a szimmetria beállítása, a pozitív példák mérete, száma és a negatív példák száma erősen befolyásolja a detektálási és a hamis találati arányt. A detektálási arány és a hamis találati arány csökken a szimmetria hamisra állításával, a pozitív példák méretének csökkentésével, számuk növelésével és a negatív példák számának növelésével.
5.9 Összefoglalás A fentiekben tehát felsoroltuk az összes technikát, algoritmust, amit a programunk megvalósítása közben felhasználunk, vagy felhasználhatónak vélünk a jelenlegi fázisban. Ezekből építkezve alkotjuk meg az alkalmazásunkat, aminek segítségével, egy hagyományos webkamera képéből a gitárszimulálásig jutunk, ezáltal egy új, szórakoztató programot készítve. A következő részben egy átfogó tervet adunk arról, hogyan is szeretnénk az ebben a fejezetben taglalt technikák segítségével ezt az alkalmazást megvalósítani.
30
6 Globális rendszer bemutatása
Előfeldolgozás
Kamera kép
Előfeldolgozott kép
Értelmezés Pengetés esemény
Hang előállítás
Előállt hang
6.1. ábra Globális rendszerterv fázisai, be és kimenetei
A rendszer megvalósításának alappillére a webkamera, melytől a bemeneti adatokat, jelen esetben a képfolyamot kapjuk. A kamera képeinek feldolgozásánál elsődleges fontosságú a sebesség gyorsítása, hogy a felhasználóinak minél realisztikusabb élményben lehessen része. Ez okból kifolyólag a cél egy valós idejű rendszer tervezése. Ezen megfontolások alapján a rendszer vázát három fő modul képzi, amelyek a kamerából nyert kép alapján képesek a fej, illetve a kezek detektálására, valamint azok pozíciójára. Ezen adatok segítségével elindul egy olyan folyamat, mely során a rendszer a legmegfelelőbb hangot szólaltatja meg a hangkártya kimenetén. A legtöbb hasonló alkalmazás legnagyobb hátránya, hogy csak speciális körülmények között használható, például valamilyen kontrasztos háttér, vagy speciális eszköz, ezért nálunk elsődleges szerepe van a gyors és hatékony képfeldolgozásnak, hogy bármilyen háttér előtt működjön a rendszer. A tervezés során az eddigiekben ismertet módszerek közül többet is megvalósítunk, ezek közül a végleges alkalmazás a gyorsaság szempontjából legjobbnak bizonyult eljárásokat kell, hogy használja, amelyek a következő fejezetekben kerülnek ismertetésre.
31
6.1 Kiválasztott módszer Rendszerünk megírására C# nyelvet választottuk, mivel az eddigi tanulmányaink során ebben a programozási környezetben igen sok tapasztalatot szereztünk, ráadásul elég sok előre megírt algoritmus létezik, melyek nagyban segíthetik a rendszerfejlesztést. Előre lefektetett fejlesztési mintákat fogunk alkalmazni és minden fontos metódust kommenttel látunk el a csapatmunka elősegítésére. A kamera kezelése egy OpenCV-s [22] wrapper, a DirectCV [23] segítségével történik. A wrapper egy C#-os átirat, mivel az OpenCV eredetileg C++ nyelven került megírásra. Támogatott a sztereo kamerakezelés, ezen kívül nagyon sok beállítást lehet igen egyszerűen elérni, valamint az OpenCV-nek köszönhetően igen sok előre megírt képfeldolgozási alapalgoritmus áll a használók rendelkezésére. Az egyes moduloknál használt módszerek a következők: Előfeldolgozásnál bőrszín alapú szegmentálást fogunk végrehajtani és egyéb hisztogram alapú technikával segítjük a kezek megtalálását, hogy ezzel is csökkentsük az előforduló hibák számát melyek ronthatják a kezek felismerését. Értelmezésnél a Lucal-Kanade féle optikai folyam megoldás mellett döntöttünk. A mozgás követésére számunkra ez lesz az optimális megoldás. Saját átalakításaink után a módszer hátrányait kiküszöbölve remélhetőleg elég gyors és pontos módszerhez fogunk jutni, amennyiben mégsem válna be, alternatívákat is fogunk keresni, de egyelőre a fent említett technikát fogjuk használni. Hang előállításnál a legtöbbek által használt DirectSound-ot választottuk, mivel nagyon egyszerű megvalósítani bármilyen hang megszólaltatását, ám az egyszerűség mellett nagyon sok effekttel bővíthető a lejátszás és támogatott a párhuzamos hangképzési lehetőség is. Emellett nem elhanyagolható előnye, hogy a hangok lejátszásához szükséges erőforrásokat a számítógép hangkártyájától veszi el, ezzel is tehermentesítve a processzort, ezáltal simább futtatást elérve.
6.2 Indoklás Alapvetően olyan technikákat választottunk, melyek viszonylag könnyen implementálhatók és már régebbről ismertek. A gyors fejlesztés fogja elősegíteni, hogy előre megírt kódokat tudunk a rendszerben felhasználni, mellyel reményeink szerint sok időt tudunk megspórolni és így több energia marad a rendszer kritikus részeinek tesztelésével és esetleges módosításaival, finomításaival. A három főből álló csapat közötti kommunikációt nagyban elősegíti a megfelelő kommentezés és az előre meghatározott programozási konvenciók összefoglalása, melyeket a projekt kezdetén közösen beszéltünk át. Az OpenCV-t a folyamatos bővülése miatt, valamint a benne lévő sok tapasztalat felhalmozása miatt választottuk. Nagyon sok ismert algoritmus van előre megírva és stabilan működik tehát a megbízhatóság biztosított. Ráadásul a webkamera kezelése nagyon egyszerűen van megvalósítva és könnyen kezelhetőek az egyes frame-ek. A DirectSound nagyon sok helyen használt fejlesztési eszköz, mely a legelterjedtebb a játékiparban. Az alkalmazás későbbi fejlesztési irányvonalát pedig erősen szeretnénk a játék kategória felé terelni, ezért a DirectX technológia ilyesfajta korai megismerése további előnyökhöz juttathat minket.
32
7 A részletes specifikáció 7.1 Előfeldolgozás
Előfeldolgozás
Kamera kép
Ablakok pozícionálása Simítás HSV konverzió Előfeldolgozott kép
Szegmentálás
Pengetés esemény
Értelmezés
Előállt hang
Hang előállítás 7.1. ábra Előfeldolgozás egyes lépései
7.1.1 Ablakpozíciók inicializálása Az előfeldolgozó modul első feladata, hogy a kezdeti paramétereket beállítja. A teljes folyamat során a kezeket egy-egy ablakban figyeli a rendszer, így kevesebb időt igényelnek a műveletek. A rendszer indításakor meg kell keresni a kezeket, aminek következtében a teljes képmérettel megegyeznek a kereső ablakok méretei. A következő fázisok után az alkalmazás még vissza fog térni ehhez a ponthoz, hogy az ablakméretet átállítsa akkorára, mely a megtalált kéz méreténél nem sokkal nagyobb. Ugyanebben a fázisban történik a gitár modell inicializálása is, mely a gitár kezdeti pozíciójának felvételéről, valamint a lefogók távolságának beállításából áll.
7.1.2 Képsimítás Mint minden hasonló témájú alkalmazásnál, ennél is a kimagasló szerepet követel a zajszűrés, mely folyamán a kép simítása kerül előtérbe. Ez alapján az előfeldolgozás modul második feladata a hibák korrigálása, ezt követően pedig a képinformáció csökkentése. A rendszerben a hibák korrigálását egy Gauss maszkot használó simító szűrő, esetenként egy átlagoló szűrő végzi (mindkét esetet részletesen megvizsgáltuk és a sebességnövelés függvényében alkalmazzuk őket).
33
7.1.3 Színkonverzió V = MAX(R, G, B); delta = MAX(R, G, MIN(R, G, B); S = delta / V; IF (R == MAX(R, G, B)) H = (G - B) / S IF (G == MAX(R, G, B)) H = 2 + (B – R) / IF (B == MAX(R, G, B)) H = 4 + (R – G) / H = H / 6 7.2. ábra RGB-HSV konverzió
B)
-
THEN THEN S THEN S
Esetünkben a kamera által megkapott kép RGB [16] színtérben kapjuk, mely nem a legalkalmasabb a bőrszín alapú felismerésre. Ezért szükségünk van a konverzióra egy számunkra megfelelőbb színtérre, mely ismereteink szerint a HSV [17]. Ebben a színtérben a bőr pigmentjének intenzitása jól elkülönült régióba képződik. Az RGB-HSV konverziójának kódját a 7.2. ábra mutatja. Eme nemlineáris leképzést követően a bőr színértékei a 7.3. ábrán látható régiókba esnek, ahol a H tengely a Hue, az S a Saturation és az V pedig a Value értéket jelöli 0 és 1 közé normalizálva [1]. 1
V
1
0.8
0.6 S
0.4
0.2
0
0
0.2
0.4
0.8
0.6
1
H
7.3. ábra Bőrszín eloszlása a HSV színtérben
7.1.4 Szegmentálás Miután a színkonverziót elvégeztük megkapjuk a szegmentáláshoz szükséges küszöbértéket. A binarizálást a rendszer a bőrszín alapján meghatározott küszöbbel fogja elvégezni. A folyamat végrehajtása után a kezek jól elkülönülnek a háttértől.
34
7.2 Képinformációk értelmezése
Kamera kép
Előfeldolgozás
Előfeldolgozott kép
Értelmezés Kéz és fejpont inicializálás
Kéz és fejpont követése
Gitármodell inicializálás
Gitármodell módosítása Gitár modell
Lefogott hang kiszámítása Pengetés esemény Pengetés esemény felismerése
Hang előállítás
Előállt hang
7.4. ábra Értelmezés modul lépései
A modul fő feladata az előfeldolgozott képen követni a kezek mozgását és mozgás esetén kiadni a megfelelő utasítást a következő modulnak. Legelső lépésben a bejövő képen meg kell találnia a játékos fejét illetve a kezeit, hogy aztán azoknak a mozgását kövesse. A mozgás követését optikai folyammal, illetve súlypontszámítás alapú technikával oldottunk meg, de egyéb módszereket is kipróbáltunk, melyeket még megemlítünk.
35
7.2.1 Gitár modell Az alkalmazáshoz legelső lépésben definiálnunk kell egy belső modellt, amely a virtuális gitárt valósítja meg. Ebben a modellben a játékos egyetlen hangot fog tudni csak megszólaltatni, de azt különböző magasságokban. A hang magasságát az határozza meg, hogy felhasználó hol fogja le a gitár nyakát. Ezt úgy tudjuk megállapítani, hogy a gitártest és a lefogó kéz között távolságot számolunk. A lefogó kezet tudjuk követni a képen, viszont a gitár testét a játékos mozgatásához kell igazítani. A modell definiálása előtt le kell kötnünk a felhasználó mozgási lehetőségeit, amelyekkel a virtuális gitárt mozgatni tudja. Ezeket a mozgási lehetőségek kétdimenziós koordináta rendszerben értelmezzük. A gitárnak lehet függőleges és vízszintes kitérése, valamint egy dőlési szöge, amely forgástengelye a gitár teste alatt helyezkedhet el. Ezek után a modellünkben a gitár egy egyenesre fektetett szakasszal írjuk le. A szakasz leírásához egy forgási pontot és egy meredekséget definiálunk. A forgási pont a gitártest alatt helyezkedik el, a meredekséget a gitárnyak dőlési szöge írja le. A 7.5. ábra a gitár modellünket szemlélteti, ahol a forgási pontot, a gitár testet és nyakat jelöli egy valóságos gitáron.
7.5. ábra A gitár modell alkotóelemei [33]
A modellünkben a gitár három szabadsági fokkal rendelkezik. A hangszer vízszintesés és függőleges elmozdulást tehet meg, illetve a forgási pont körül különböző dőlési szögekben állhat. A 7.6. ábra a három szabadsági fokot szemlélteti.
36
7.6. ábra A gitár mozgási tere
Ezek alapján a gitár mozgását a felhasználó mozgása fogja befolyásolni. A gitár vízszintes illetve függőleges elmozdulással a játékos törzsét fogja követni. A törzs mozgását leegyszerűsített módon a fej mozgásához igazítjuk. A gitár dőlésszögét pedig a gitárnyak mozgatásával tudjuk leírni, amelyet a játékos a gitár nyakát markoló kezével tudja befolyásolni. Azok után, hogy tisztáztuk hogyan tudja a felhasználó a virtuális gitárunkat mozgatni, információt kell kinyernünk a képsorozatból a fej, illetve a lefogó kéz elmozdulásáról. Mielőtt elmozdulásokat számolnánk, meg kell keresni a kezet és a fejet folyamat elején. A következő pontban a kéz és fejkeresési probléma megoldását taglaljuk.
7.2.2 Kéz és fej keresés Legelső lépésben a cél a lefogó kéz, illetve a fej megtalálása a képsíkon, amit a továbbiakban egy-egy (x, y) koordinátaponttal fogunk jelölni. Ezeket a pontokat képkockáról képkockára folyamatosan követni fogjuk és a keresési funkciót elhagyjuk.
7.2.2.1 Kézdetektálás A lefogó kéz megtalálására egy olyan eljárást használunk, ami a bemeneti RGB színes képre, az előre megállapított bőrszín alapján kinyeri a kézfejhez tartozó koordináta pontokat.
37
7.7. ábra A kiinduló kép
Első lépésben a képnek csak egy bizonyos részletét tekintjük, azt a pontteret, ahol a lefogó kéz előfordulhat. Azért szűkítjük le a bejövő információt, mert az állva gitározó játékos mozgási tere kicsi.
7.8. ábra A kéz mozgási tere
Második lépében az RGB képen színcsatornánként egy gauss szűrővel elmossuk a részleteket. Ez a következő lépésben történő bőrszín alapú szegmentáláshoz lényeges.
7.2.2.1.1 Bőrszín alapú projekció Ennél a lépésnél az OpenCV függvénykönyvtár egy metódusát használjuk fel. Ez a metódus a paraméternek megadott kép minden egyes pontjához az előre megállapított bőrszín alapján, amely egy H-S hisztogramban van eltárolva, hozzárendeli a hisztogram adott helyen található értékét. Ha a hisztogram normalizált, akkor ez az érték a bőrszín adott helyen vett feltételes valószínűségét reprezentálja. Ehhez az OpenCV könyvtár egy metódusát használjuk fel, mely a paraméternek megadott kép A szegmentáláshoz szükséges bőrszínt már előre meghatároztuk és azt Hue-Saturation hisztogramban eltároltuk. A hisztogramot és annak értékeit a 7.9. ábra reprezentálja, ahol függőleges irányban a Saturation, vízszintesen pedig a Hue dimenziója látható.
38
7.9. ábra H-S hisztogram
A megadott értékek alapján a projekciós művelet eredményeként a 7.10. ábrán bemutatottakat kapjuk.
7.10. ábra A projekció után
7.2.2.1.2 Súlypont meghatározása A bináris kép már csak a kezet tartalmazza, így annak relatív helyzetét meghatározva kapjuk a kéz elhelyezkedését. Az objektum középpontjának meghatározásához súlypontot kell számolnunk az adott képre. A tömegközéppont meghatározásához legelső lépésben ki kell számolni a régió területét. Mindezt egyszerűen a pixel intenzitások összegzésével könnyen megtehető. 𝑚
𝑛
𝑇=
𝐹 𝑥, 𝑦 𝑥=0 𝑦=0
39
Vízszintes irányú komponens meghatározásához összeszámoljuk függőleges irányban vett pixelek intenzitás érétkét megszorozva a koordináta rendszer adott x tengelyén vett értékével. Az így kapott összeget elosztva a területtel megkapjuk a súlypontjának a vízszintes irányú összetevőjét. 𝑥=
𝑚 𝑥=0
𝑛 𝑦 =0 𝑥𝐹
𝑥, 𝑦
𝑇
A függőleges irányú összetevő meghatározásához mindezt a képen vízszintes irányban haladva számoljuk ki. 𝑦=
𝑚 𝑥=0
𝑛 𝑦=0 𝑦𝐹
𝑥, 𝑦
𝑇
Az így meghatározott pont fogja a továbbiakban reprezentálni a lefogó kezet a képsíkon.
7.11. ábra A súlypont meghatározása után
7.2.2.2 Fejdetektálás Fejdetektálásra Paul Viola és Michael J. Jones által fejlesztett robosztus [29], azaz a feldolgozandó kép minőségére érzéketlen, valós idejű objektum detektort használjuk. A detektor szürkeárnyalatos képekből kapott információk alapján dolgozik és magas képfeldolgozási arányt képes elérni. Viola-Jones által javasolt detektorral igen eredményes és viszonylag gyors arcdetektálást lehet megvalósítani. A továbbiakban ezt ez arcdetektort fogjuk alkalmazni az inicializálási folyamatban.
40
7.2.2.3 Kéz és fejkeresés összefoglalása Összefoglalva a lefogó kéz és a fej detektálásának folyamatát, a rendszer ezen adatok alapján tud dolgozni a továbbiakban. A következő lépés e pontok alapján a gitár modell fej és kéz attribútumok beállítása.
7.2.3 Gitár modell inicializálása Az elő két lépésben meghatározott fej illetve kézdetektálási funkció eredményeként kapott pontok függvényében inicializáljuk a gitár pozíciókat, valamint a modellben definiált kéz és fej elhelyezkedését. A továbbiakban, a modellben a gitár test mozgatásának meghatározásához a fej elmozdulása nyújt információt.
7.2.4 Kéz és fejpont követése - mozgáskövetés Az előző művelet eredményeként meghatároztuk a lefogó kéz pozícióját, így most már csak azok mozgását figyeljük és a kézdetektálás funkciót elhagyjuk. A lefogó kéz követését optikai folyam módszerrel oldjuk meg. Itt megjegyeznénk, hogy az előzőleg bemutatott technikát minden egyes képkockára alkalmazva is kielégítő eredményt kaphatnánk, feltéve, hogyha nem lenne zavaró tényező a fej (bár ezt valamilyen áthidaló megoldással ki lehetne maszkolni).
7.2.4.1 Optikai folyam Lucas-Kanade [20] módszer egy ritka optikai folyam technika. Ritka optikai folyam alatt azt értjük, hogy nem számoljuk ki a kép minden egyes pontjára az elmozdulás-vektort, hanem csak a pontok egy részhalmazára. E részhalmaz a kép azon pontjait tartalmazza, amelyek a követendő objektumot, mi esetünkben a lefogó kezet reprezentálja. E technikának a lényege, hogy a kép egy adott pontjára az előző képkocka függvényében meghatározza az elmozdulás-vektorát. Nagyon fontos, hogy a módszer a követendő pontnak az idő függvényében azonos intenzitás értéket feltételez. 𝐼 𝑥, 𝑦, 𝑡 = 𝐼(𝑥 + 𝑑𝑥, 𝑦 + 𝑑𝑦, 𝑡 + 𝑑𝑡)
(1)
További szempont, hogy nagy elmozdulásokra nem működik. Ez a probléma kiküszöbölhető képpiramissal, ahol a piramis magasabb szintjéről indulva az alacsonyabb szint felé haladva közelítünk, így a magasabb ponton a nagyobb elmozdulás is kellően kicsinek mérhető. Nagyon lényeges még a térbeli koherencia, amin azt értjük, hogy egy felülethez tartozó pixelek csoportja együtt mozog. Kis elmozdulások esetén az (1) pontban felírt egyenlet jobb oldalát Taylor sorba fejtve a következő kifejezés áll elő, ahol Ix, Iy és It az elmozdulás illetve idő szerinti deriváltak. 𝐼 𝑥 + 𝑑𝑥, 𝑦 + 𝑑𝑦, 𝑡 + 𝑑𝑡 = 𝐼 𝑥, 𝑦, 𝑡 + 𝑑𝑥𝐼𝑥 + 𝑑𝑦𝐼𝑦 + 𝑑𝑡𝐼𝑡 Az (1) egyenletbe való behelyettesítés és átrendezés után az alábbi képletet kapjuk, ahol konstans intenzitást feltételezve kifejezhető a sebességvektor.
41
𝑑𝑥 𝑑𝑦 𝐼𝑥 + 𝐼 + 𝐼𝑡 = 0 𝑑𝑡 𝑑𝑡 𝑦 Az x és y irányú sebességvektorra a következő jelölést vezetjük be: 𝑣=
𝑑𝑥 𝑑𝑡
𝑢=
𝑑𝑦 𝑑𝑡
Az u illetve v irányú komponens meghatározásához a környező pontokat is figyelembe kell venni. Ez az alapján tehető meg, mint ahogy fentebb is említettük, hogy azonos felülethez tartozó pontok együtt mozognak, azonos lesz a sebesség vektoruk. 𝑢𝐼𝑥 + 𝑣𝐼𝑦 + 𝐼𝑡 = 0 Azonos felülethez tartozó pontokra felírható egy másodrendű egyenlet, aminek a minimumát kell meghatározni. (𝑢𝐼𝑥 + 𝑣𝐼𝑦 + 𝐼𝑡 )2
𝐸=
Az egyenlet minimumának meghatározásához u illetve v szerinti deriváltat kell kifejezni. 𝑑𝐸 = 𝑑𝑢
2𝐼𝑥 𝑢𝐼𝑥 + 𝑣𝐼𝑦 + 𝐼𝑡 = 0
𝑑𝐸 = 𝑑𝑣
2𝐼𝑦 𝑢𝐼𝑥 + 𝑣𝐼𝑦 + 𝐼𝑡 = 0
Az alábbi két egyenlet átrendezve felírható mátrixos formában. 𝐼𝑥 𝐼𝑥
𝐼𝑥 𝐼𝑦
𝐼𝑥 𝐼𝑦
𝐼𝑦 𝐼𝑦
𝐼𝑥 𝐼𝑡
𝑢 =− 𝑣
𝐼𝑥 𝐼𝑡
A sebességvektor meghatározható az egyenlet átrendezésével. −1
𝑢 = 𝑣
𝐼𝑥 𝐼𝑥
𝐼𝑥 𝐼𝑦
−
𝐼𝑥 𝐼𝑡
𝐼𝑥 𝐼𝑦
𝐼𝑦 𝐼𝑦
−
𝐼𝑥 𝐼𝑡
A technika továbbiakban a kép-piramis módszerrel egészül ki, ami lehetővé teszi, hogy nagyobb változások is figyelembe vehetők legyenek. Ennek a módszernek a lényege, hogy egy magasabb szinten becsült elmozdulás kiinduló pontként szolgál egy alacsonyabb szinten mért elmozduláshoz.
42
7.2.4.2 Sarokpont detektálás Lucas–Kanade technika akkor működik hatásosan, ha a bemenetként szolgáltatott pontok, amelyek elmozdulását a folyamat során képről képre követünk, valamilyen jellemző tulajdonsággal bírnak. Ilyen jellemző tulajdonság a hirtelen intenzitásváltozás, melyet mindkét irányban egymásra merőlegesen kell biztosítani. A továbbiakban sarokpontokat fogunk keresni. A legelterjedtebb megoldás a sarokpontok megkeresésére a Harris [21] sarokpont kereső módszer. Ennek a megoldásnak az a lényege, hogy a képen végigfuttatva egy ablakot kiszámoljuk a másodrendű deriváltakat és azokat egy autókorrelációs mátrixba rendezzük.
𝑀𝐻 =
𝐼𝑥 2
𝐼𝑥 𝐼𝑦
𝐼𝑥 𝐼𝑦
𝐼𝑦 2
Ennek a mátrixnak a sajátvektorai az egymásra merőleges élek irányát, a sajátértékei az élek nagyságát jelentik Ahol elég nagyok ezek a sajátértékek, ott egymást metsző élek, azaz sarokpont található. Ez a megoldás, forgatásra invariáns. Ezzel a technikával a kézdetektálási módszer eredményeként meghatározott pont ahol a kezet megtaláltuk - egy környezetében sarokpontokat keresünk. Ezen pontok segítségével tudjuk követni a lefogó kéz mozgását.
7.2.5 Belső modell módosítása Az előző lépésben meghatároztuk a kéz illetve a fej elmozdulását. A továbbiakban ezeket az elmozdulásokat használjuk fel annak érdekében, hogy módosítsuk a modellünkben a gitárpozíciókat.
7.2.6 Lefogott hang megállapítása Az objektumok elhelyezkedésének új koordinátáiból számolva az esetleges változásokat figyeljük. Elmozdulások sorozatát tekintve egy pengetésnek megfelelő mozdulatsorozatból egy eseményt generál a rendszer. A pengetési esemény előtt meg kell határoznunk, hogy milyen hangot is kell megszólaltatni. A lefogott hangot úgy állapítjuk meg, hogy a lefogó kéz és a gitár teste közti távolságot mérjük. Ennek megállapítására pitagorasz tételt írunk fel a két pozícióra és a lefogóknál is ugyan így számolunk.
7.2.7 Pengetés esemény megállapítása A pengetés eseményt az váltja ki, ha a pengető kéz elhalad a pengető felett. Ennek a megállapítására elég, ha csak a pengető körülötti részt figyeljük. Olyan technikára van szükség, ami alapján meg tudjuk különböztetni a kezet a háttértől. Erre a problémára a kézdetektálási funkciónál említett bőrszín alapú projekciós művelettel adhatunk megoldást. A pengető körüli részen futtatjuk az algoritmust és a visszaadott szürkeárnyalatos képen egy alacsony küszöbbel történő binarizálás után megszámoljuk az aktív pontokat. A továbbiakban ebből következtetni tudunk arra, hogy a pengető fölött elhaladta felhasználó keze.
43
7.3 Hang előállítása
Kamera kép
Előfeldolgozás
Előfeldolgozott kép Pengetés esemény
Értelmezés Hang előállítás Gitárnyak szimulálás (érintőkre számolás)
Kiválasztott gitárnyak, skála, elrendezés
Hangmagasság, megfelelő fájl kiválasztása
()))
Hangbank
((
7.12. ábra Hang előállítás modul lépései
Ennek a modulnak a fő feladata, az előző lépésben meghatározott kéz pozíciója alapján a megfelelő hangfájl kiválasztása és lejátszása, ezáltal megszólaltatva a számítógépet és a gitár szimulációját végrehajtva. Ehhez szüksége van a két kéz távolságára, pozíciójukra, továbbá az előzetesen kiválasztott gitárnyak skálájának meghatározására, illetve a hangbankra, ami a lehetségesen lejátszható fájlok egy adatbázisa.
44
7.3.1 Gitárnyak szimulálás (érintők számolása)
7.14. ábra 6. érintő magasságában lefogott húr
7.13. ábra 1. érintő magasságában lefogott húr
A két kéz pozíciójából képes a program meghatározni, hogy egy virtuális gitárnyakon a játékos játszó keze hol helyezkedne el. Mivel a valóságban is annak segítségével változtatja a kiadott hang magasságát, hogy hol fogja le a gitár nyakát, így itt is ezt az elvet követjük. Minél közelebb van a két kéz egymáshoz, tehát a játékos minél közelebb a gitár testéhez fogja le a húrokat, annál magasabb hangot tud megszólaltatni. A programban ez a két kéz távolságát jelenti, minél kisebb, annál magasabb hangot kell alatta értelmeznünk. Egy általános gitár nyakán a különböző hangmagasságú hangokat az érintők (bundok) jelölik meg, ezekhez nyomják oda a húrt, ennek analógiájára a két kéz pozíciójából kiszámoljuk, hogy a valóságban ez hányadik érintőnek felelne meg. A 7.13. ábrán és a 7.14. ábrán látható lefogás hangja között egy kvartnyi (4 hangnyi) különbség van, a 6. érintőnél lefogott hang (A#) ennyivel szól magasabban, mint az 1. (F). Természetesen ez a két fenti kép csak illusztráció, a program nem csak egy kéz pozicionálását végzi, de az érintők távolságát jól bemutatják.
7.3.2 Kiválasztott gitárnyak, skála, elrendezés A valóságban a gitárnyakon az érintők nem azonos távolságokra helyezkednek el, hanem logaritmikus skálán követik egymást, mivel a hullámhossz és az így megszólaltatott hang is ilyen módon aránylik egymáshoz. Minél magasabb hangot szeretnénk kiadni, ez a távolság egyre kisebbé válik. Ezt az elrendezést a programban választható opcióként implementáljuk, hogy a kezdőbbek számára könnyebben befogadható lineáris elrendezés is megvalósítható legyen. Továbbá beállítható lesz, hogy az adott gitáron hány darab érintő legyen és így tulajdonképpen megadva a hangok lehetséges számát is. A tényleges környezetben ez rendkívül nagy határok között változhat. A tanuló gitárok 16-18 érintőjétől kezdve, az elektromos gitárok általánosan 21-24, de létezik akár 36 érintővel rendelkező gitár is (bár itt az érintők távolságának és az ujjak méretének aránya meglehetősen előnytelen játékmódot eredményez). Ezen felül már csak azt kell megadnunk, hogy az adott érintőtávolságok milyen hangtávolságot jelentsenek. A gitár nyaka úgynevezett „kromatikus” skálát mutat, tehát mind a 12 hang megtalálható rajta. Egy érintő távolság egy félhangnyi különbséget eredményez, így a nyugati kultúrában jelenlévő zenei skálákon előadott összes hangot meg tudjuk szólaltatni rajta. Viszont ez magával hordozza azt a tényt, hogy azok a hangok is lejátszhatóak, melyek egymással disszonánsak, azaz nem szólnak kellemesen az emberi fülnek. Ennek orvoslására a programban kiválaszthatjuk, hogy az alapértelmezett kromatikus skála helyett, valamilyen harmonikusabb hangtávolságokat jelentsenek az érintők távolságai, így például: dúr, moll, pentaton, blues, melodikus-moll.
45
érintők kromatikus dúr moll blues
1 E E E E
7.1. táblázat Az első 12 érintőnek megfelelő hangok a különböző skálákon 2 3 4 5 6 7 8 9 10 11 F F# G G# A A# B C C# D F G A B C D E F G A F# G A B C D# E F# G A G A A# B D E G A A# B
12 D# B B D
Mint az a 7.1. táblázatból kitűnik, hogy az 1. érintőnek mindig az E hangot választottuk, mivel a gitár 1. húrja is („standardhangolásban”) így szól. Ezt természetesen át lehet majd állítani. Ebben az esetben a hangtávolságok megmaradnak, csak az alaphang változása miatt az egész skála mélyebben illetve magasabban fog szólni.
7.3.2.1 Skálák kiszámítása Skálák kiszámítására egy külön osztályt vezettünk be. Magukat a skálákat, mint ahogy látjuk is, két dolog határoz meg: az alaphangja és a skála hangjainak attól való távolsága. Épp ezért egy olyan módszert valósít meg ez az osztály, melyben a skála típusa egy olyan tömböt reprezentál, melyben a távolságok vannak, az alaphang pedig a legelső elérhető hanghoz képest – mely az 1C – vett távolság számbeli értéke. Például a 2F, ha végigszámoljuk (1C, 1Db, 1D, ... , 2E, 2F) a 17. alaphang lesz. Így gyakorlatilag teljesen egyedileg testreszabható hangokat adhatunk hozzá a virtuális gitárunkhoz és kiválaszthatjuk, hogy mely hangokat is szeretnénk viszonthallani a programon belül. Természetesen alapértelmezett skálaként implementálásra kerültek a legelterjedtebbek, így a kromatikus (mely minden hangot tartalmaz), dúr, moll, pentaton, blues, harmonikus és melodikus moll skálát nem a felhasználónak kell felvinni, elég csak kiválasztani a megfelelő listából. Egyedi skála felvitelére is van mód, egyszerűen a maszk értékeit kell megváltoztatni.
7.3.3 Megfelelő hangfájl kiválasztása és lejátszás A 2. lépésben meghatároztuk, hogy a kéz hányadik érintőt is fogja le, a 3. lépés kiszámolja, hogy ez milyen hangnak is felel meg, ezután a dolgunk az, hogy az így meghatározott hangot, egy hangbankból előhívjuk és lejátsszuk. A hangbank tulajdonképpen tömörített WAV formátumban felvett gitárhangokból álló file-okat jelent. Ezek közül egyszerűen a megfelelő fájlt betöltjük és megszólaltatjuk. Ezáltal a gitározás élménye teljessé válik, mivel a játékos mozgásának detektálásától a hang lejátszásig minden fázist megvalósít az alkalmazásunk.
7.3.3.1 Hangtömörítés A hangot természetesen a helyigény csökkentése és a számítógép memóriájának minél célszerűbb kihasználása érdekében tömörítenünk kell. Erre szerencsére elég sok megoldás létezik, többet a DirectSound is támogat. Nem esett még szó eddig arról, hogy miért is ezt a megoldást választottuk, hogy felvett hangokból játszunk le. Ha a számítógép által szerettünk volna generálni valamilyen hangot arra az egyik legkézenfekvőbb megoldást a MIDI vezérlés nyújthatta volna. Ez egy olyan protokoll, mely az összes korszerű hangkártya és számítógép beépített funkciója, több 100 különböző hangszer modelljét tartalmazza, és azokat tudja megszólaltatni. Erről a megoldásról azért mondtunk le, mert így viszont a DirectSoundban lévő lehetőségeket a lejátszáson túlmenően nem tudtuk volna egyáltalán kiaknázni, illetve a processzort is jobban terheltük volna. Másik megoldásként a gitár hangjának modellezése jött szóba, ez nagymértékű szabadságot ad, viszont a komplexitást és a leterheltséget is nagyban növeli.
46
Ezen felül még további függőségeket okozott volna az így eddig is DirectX-re és OpenCV-re támaszkodó projektnek. Természetesen egy erősebb számítógép esetén ez a megoldás lenne a leginkább valódi élményt biztosító megoldás. Viszont ennek híján és a DirectSound kihasználása érdekében választottuk a hangbankos megoldást. Ennek is vannak korlátai, például méretben, éppen ezért alkalmaztunk tömörítést. Mpeg-3 esetén a gond a gitár hangjának minőségével jelentkezett, bár a hangfájlok mérete a lehető legalacsonyabbra csökkent, ezáltal (jó minőségű tömörítés esetén is 90 kByte körüli mérete volt egy file-nak). Sajnos a felvételek nem készültek el a legjobb stúdióminőségben, így a további minőségromlást végképp nem tartottuk elfogadhatónak. Az OGG-Vorbis formátum hasonló elvű, mint az Mpeg-3 és hasonlóan erős tömörítést ad, kicsivel jobb minőségben. A probléma ezzel az OGG kodek telepítésének igénye és ezért további függőségek hozzáadása volt, ezért ezt is elvetettük, hasonlatosan az egyéb speciálisabb audiokodekekhez (AAC, FLAC). A veszteséges tömörítés helyett ezért inkább a nyersen felvett hangformátum, a WAV bizonyos tömörítését választottuk, ezek közül többel is kísérletet tettünk, míg végül az Microsoft ADPCM mellett döntöttünk. Ennek az eljárásnak a lényege, hogy a mintavételezés sűrűségét adaptívan határozza meg, ezért a fontos információt hordozó részek leírása sokkal részletesebb lesz és így az egész hang jel/zaj aránya sokkal jobbá válik. A file-ok méretével történtek vizsgálatok, túl nagy, 1 megabyte fölötti file-oknál már nem tudta sajnos a DirectSound felület kezelni az adatokat, kimaradt egy-egy, túl kicsi méretű file-ok (40 kByteos átlag) esetén pedig nem volt felismerhető a hangszer karakterisztikája („zongorásan” szólt). Ezért végül 200 kilobyte-os méretben maximáltuk a méretet. Ekkor a file-ok jó minőséggel, jel-zaj aránnyal rendelkeznek, 9 másodperc hosszúak, így meglehetősen jól artikulálva jelenik meg a gitár hangjának teljes megszólalása és lecsengése is, így növelve a valóságérzetet és késleltetés nélkül, akár több hang is megszólaltatható egyszerre.
7.3.4 Effektezés Mielőtt a hangot lejátszanánk, azt előbb különböző effekteken keresztül vezetjük keresztül, mint ahogy a valóságban is az elektromos gitárt egy előerősítőbe kötjük és a megszólaló hangszínét ott állítjuk be (7.15. ábra). Valódi gitár
HandsUp! léggitár/ webkamera képe
Pendülő húr
Pengetés esemény
Lefogott érintő által meghatározott frekvenciájú, és hangszedő által felvett elektromos jel
Lefogott érintő által meghatározott hangfájl
Előerősítők (előfok, effektek)
DirectSound effektek
Végerősítő (végfok), hangszórók
Hanglejátszó modul
[♫]
[♫]
7.15. ábra A hang útja a valóságban és a projektben
47
Természetesen ilyen effektekből nagyon sok különböző létezik, de néhány speciális kivételtől eltekintve be lehet őket különböző csoportokba sorolni, annak alapján, hogy a hang mely tulajdonságát módosítják. Ezeket a gitárosok több formában alkalmazhatják, lehet az erősítő része, de lehet külön egység is, amit vagy „polcokba” lehet beépíteni (ezeket rack effect-nek hívják), viszont kétségkívül a leggyakoribb megjelenési formájuk a pedál. Ezen pedálok között, még azonos logika szerint is rengeteg különbség lehet, mivel nincs két olyan cég, ami az adott effektet ugyanolyan áramkörrel valósítaná meg és ez a hangzásban is jelentős különbségeket eredményez – többek között ezért szólnak egyedien, felismerhetően a profi zenészek. A valóságban a következő nagyobb csoportokba sorolhatjuk őket, természetesen 7.16. ábra Egy tipikus rack-effekt polc [25] kivételek is vannak: Dinamika effektek: ezek a hang amplitúdóját, hangerejét módosítják különböző szempontok alapján. Ide tartoznak a különböző zajzárak, vagy a kompresszorok (Compressor – ld. 7.3.4.6), melyek elsimítják a játékos által különböző erősségű pengetései között a hangerőbéli különbséget, illetve ritkábban, de egyes előadók hangzását erőteljesen meghatározza a tremoló (Gargle – ld. 7.3.4.5), ami szintén ide sorolható, időben változó intenzitással változtatja a hangerőt. Tónus effektek: ezek a hang karakterisztikáját szabályozzák, a leggyakrabban használt effektek is innen kerülnek ki. Ide tartoznak a különböző torzítók/boosterek (Distortion – ld. 7.3.4.1), amelyek olyan szintre emelik az amplitúdót, hogy azt a kimeneten az erősítő vágni kényszerül, vagy a hangszínszabályzók (Equalizer – ld. 7.3.5). A pedálok között az egyik 7.17. ábra legjellegzetesebb, a wah-wah, magyar Különböző effektek összekapcsolva – Overdrive és nevén „vau”, vagy „hápogtató” is ide Wah [26] tartozik, ez egy szűrő felső frekvencia határát módosítja, annak függvényében, hogy a játékos mennyire nyomja le. Idő effektek: ezek a hang időbeli késleltetéséért, illetve ismétlődéséért felelnek. Ezek közül a leggyakoribb a késleltetett visszhang (Echo – ld. 7.3.4.2) és a térhatású visszhang, magyarul zengető (Reverb – ld. 7.3.4.4). A kettő között jellegbeli különbség van. Ehhez a csoporthoz soroljuk még a (Flanger ld. 7.4.3.7) effektet is, ezt a valóságban ritkábban használják. Frekvencia effektek: ezek a hang frekvenciájának modulálását végzik. Legegyszerűbb típusa az ún. pitch-shifter, mellyel a karakterisztikát megtartva, egyszerűen a hangmagasságot változtathatjuk, illetve ide sorolható a kórus effekt is (Chorus – ld. 7.4.3.4), amivel színesíteni lehet a hangzásunkat.
48
A DirectSound többféle effektet tartalmaz beépülve, ezek által elég sok lehetőségünk van a hang különböző előfeldolgozására. Ezen hanghatásokat ábrázolhatjuk is egy oszcilloszkóp segítségével, lehet vizualizálni a hatásukat, ennek segítségével fogom itt bemutatni. Az oszcilloszkópot egy direkt ilyen célból készített alkalmazással szimuláltam, ennek segítségével készült a hangbank is. A lentebb látható hangfájlok képei, ha nincsenek másként megjelölve, az általunk készített gitárhangok tényleges képe. A képeken az x-tengely az időt, az y-tengely az amplitúdót jelképezi.
7.3.4.1 Distortion
7.18. ábra A gitár hangjának tiszta képe
7.19. ábra A gitár torzított hangjának képe
Torzításnak hívhatunk minden a hang minőségét befolyásoló tényezőt, viszont klasszikus értelemben véve a gitár torzítása a túlvezérlésre és az ezzel járó vágásra utal. Ha egy zenei jelet valamilyen módon felerősítjük olyan feszültségűre, amit az adott erősítő már nem tud a kimenetén biztosítani, akkor a hang jelének tüskéit, melyek túl nagy amplitúdójúak, levágja. A keletkező jel így négyszögjelszerű lesz a kiinduló szinuszoshoz képest és a hang karakterisztikája jelentősen megváltozik, élesebb, karcosabb lesz. Ugyanilyen hatást el lehet érni úgyis, ha az adott hang bizonyos felharmonikusait, tartományait kierősítjük. Ezen az elven alapul a DirectSound módszere is. A paraméterei ennek megfelelőek: Edge: élesség, mennyire legyen éles a sarka a négyszögnek, mennyire legyen élesdurva a torzítás Gain: erősítés, mennyire hangosítsa ki az eredeti hangot és ezáltal is torzítást okoz Pre: a torzítás alatt a hang először egy alul áteresztő szűrőn megy át, ennek a küszöbfrekvenciája ez Center: a torzított hang középfrekvenciája, ennek a felharmonikusaival egészíti ki a hangot Band: a középfrekvencia körüli frekvenciatartomány, amit torzít
49
7.3.4.2 Echo
7.20. ábra A gitár hangjának tiszta képe
7.21. ábra A gitár hangjának visszhangos képe
Visszhanghatás keltésére is képes a DirectSound, ami egy szintén közkedvelt és egyszerű effekt. Valójában csak önmagára rájátssza az adott hangot különböző hangerővel (ezáltal folyamatosan elhalkulva, szimulálva a valóságos visszhangot), illetve időzítéssel. Paraméterei: Volume: A kimeneti hang hangereje Left és Right delay: A bal és jobb csatornán külön szabályozható késleltetési idő Ratio: A keverési arány, tehát annak a viszonya, hogy a kimeneti hangban a visszhang mennyire jelentősen jelenjen meg. Panning: Beállítható az is, hogy a visszhang egyszer a bal, egyszer a jobb oldalról szóljon, így az ide-oda pattogó hatást kelt, mintha „felelgetne” egymásnak a két oldal.
7.3.4.3 Chorus Kórus effektet is lehet a hanghoz hozzáadni, ez valójában egy nagyon gyors időtartamú visszhanghatást takar. Emellett itt lehetőségünk van frekvenciamodulációt is végezni. Ez azt jelenti, hogy a megszólaltatott hangunk valamilyen sebességgel, bizonyos határok között oszcilláló frekvenciával szólal meg, vibrációs hatását keltve. Paraméterei: Delay: A késleltetési időt adja meg. Depth: A mélységet szabályozhatjuk Feedback: A visszacsatolás mértéke, tehát hogy az eredeti hangot mennyire jelentősen játsszuk bele a kórus effektbe. Freq: A frekvencia oszcillátor sebessége, tehát a frekvenciamoduláció gyorsasága. Mix: Az effektezett és az eredeti hang keverési aránya. Phase: Fázis modulációt is alkalmazhatunk, további lehetőséget kínálva a hang eltolására. -180 és 180 fok között, 90 fokos léptékkel adhatjuk meg az értéket Lehetőség van választani fedőhullámformát is: választhatunk, hogy szinuszos, vagy háromszög alapút szeretnénk. Ez valójában a frekvenciamoduláció jellegét szabályozza.
7.3.4.4 Reverb Reverbációt, térhatást is alkalmazhatunk a hangunkra. Ez valójában a hangokra értelmezett konvolúciónak felel meg, szabályozható maszkkal. Ellentétben a képekkel azonban ez lineárisan működik, mivel a hangnak csak ilyen irányú kiterjedése van. Az
50
eredménye az, hogy zengetett lesz a hang, „mélységet kap”, olyan hatást keltve, mintha egy teremben/barlangban/szobában/arénában szólalna meg. A DirectSound két megvalósítással is szolgál a reverbációra. Az Interactive3D reverb egy fejlettebb algoritmussal generálja a zengetést, összetettebb paraméterezhetőséggel – viszont sokkal inkább alkalmas ambiens hangok effektezésére – pl. természeti hangok, szél, városi zaj, stb. Egy gitár hangja – optimális esetben – nem számít háttérzörejnek, így éppen ezért az egyszerűbb és a valódi reverb effektpedálok hatását sokkal jobban szimuláló WavesReverb került implementálásra. Paraméterei: Highfreq Gain Time Mix
7.3.4.5 Gargle Amplitúdó moduláció, vagyis a hangerő bizonyos frekvenciával történő változtatását is hozzáadhatunk a repertoárhoz, elég extrém hangzásokat ezzel előidézve. Tulajdonképpen a hangerő maximum 1 másodperces periódusidőnként történő bizonyos mértékben szabályozható változtatását képes végrehajtani. Paraméterei egyszerűek: Rate: Az amplitúdó moduláció sebessége. Sine: Szinuszos, vagy háromszögjel takarógörbe legyen a változás jellege.
7.3.4.6 Compressor
7.23. ábra A gitár kompresszált hangjának képe
7.22. ábra A gitár hangjának tiszta képe
A kompresszió hangtani szempontból az a hanghatás, amikor a hang dinamikáját kiegyenlítjük, tehát a nagy tüskéket szelídítjük, a halk elemeket pedig erősítjük. Ezzel azt érjük el, hogy a hang képe tömörebb, kiegyensúlyozottabb legyen. A DirectSoundban ez a hatás valójában az erőteljes tüskéket vágja le. Figyeljük meg a 7.22. ábrán, hogy a különböző csúcspontok milyen arányban halkultak, mennyire tömör, kiegyenlített az eredeti 7.23. ábrán láthatóhoz képest. Paraméterei: Attack: A támadási idő, azaz az időtartam milliszekundumokban, ami ahhoz szükséges, hogy a kompresszió elérje a maximális erejét. Gain: Az erősítés mértéke a kimeneten decibelekben megadva. Threshold: Az a pont, ahol a kompresszió bekapcsol. Ez egy megadott hangerő, decibelekben megadva, amit ha a hang elér, akkor erősíteni kezd a kompresszor. Pre-Delay: Az az időtartam, amennyit vár a threshold elérése után és a kompresszió bekapcsolása előtt, ezáltal teret hagyva a hang természetes dinamikájának is. Ratio: A kompresszió aránya az eredeti hanghoz képest.
51
Release: Az az időtartam, amit vár az után, hogy a hang ereje újra a küszöb alá esik.
7.3.4.7 Flanger A kórushoz hasonlító hanghatás. Az eredeti hangra saját magát játsszuk, de folyamatosan változó késleltetéssel-időzítéssel. Ezáltal egy jellegzetes ún. fésűszűrő hatást érünk el. Ez a hatás azért jön létre, mert a változó késleltetés miatt a hang interferencia jelenségét produkálja, hol konstruktívan, hol destruktívan saját magára nézve. Ennek sebességét a 7.24. ábra A fésűszűrő [32] késleltetés ideje befolyásolja. Azért hívják fésűszűrőnek, mert az így módosított hang képe jellegzetes, fésűszerű csúcsokat mutat, ha a frekvenciáját nézzük. Mivel a hatás jellege a kóruséhoz nagyban hasonlít, a paraméterezése is azzal szinte megegyező: Delay: A késleltetés ideje milliszekundumokban Depth: Az effekt mélysége, annak a százalékos megfogalmazása, amennyivel a késleltetési időt változtatjuk. Feedback: A visszacsatolás mértéke, tehát hogy az eredeti hangot mennyire jelentősen játsszuk bele az effektbe. Freq: Az oszcillátor sebessége, frekvenciája Mix: Keverési arány Phase: Fáziseltolás mértéke, azonos a kórus effektnél tárgyalttal. Itt is lehetőségünk van váltani a szinuszos és a háromszög alakú fedőgörbe közül.
7.3.5 Hangszínszabályzás A DirectSound által biztosított effektek között különleges kivétel a Parametric Equalizerrel, amivel a hangszínszabályzást lehet megvalósítani. Az eddig felsorolt effektek mindegyikét lehet alkalmazni az adott hangra és bár van lehetőség egy adott típus, pl. Distortion többszöri alkalmazására, annak eredménye valójában megegyezik azzal, mintha az adott paramétereket összeadnánk. Ez alól kivétel a ParamEq, melyet kifejezetten halmozva érdemes kihasználni. Magának az effektnek a következő három paraméter adható meg: Center: A középfrekvencia, ami körül értelmeződik az effekt. Bandwidth: A center körül félhangokban mérve megadható, hogy mekkora tartományt szabályozzunk. Gain: Az erősítés mértéke, vagyis az, hogy a [center-bandwidth/2; center+bandwidth/2] intervallumon hány decibeles hangerő növekedést generáljon az effekt. Fontos megjegyezni, hogy a Gain negatív értéke esetén értelemszerűen halkítani is lehet, így bizonyos frekvenciák szűrésére is van lehetőségünk. Láthatjuk, hogy egyszeri alkalmazása ennek az effektnek valójában a hangszín csak egy bizonyos tartományára lesz hatással. A valóságban is meglehetősen ritkán találkozhatunk olyan hangerőszabályzóval – akár Hi-Fi rendszerek, vagy autós hangrendszerek esetén is – amelyiken csak egy tartományt áll módunkban szabályozni. Hangszereknél a leggyakrabban két elvet követhetnek az erősítőket gyártó vállalatok:
52
Néhány sávos, általában 2 (Basszus és magas), 3 (+közép), ritka esetben maximum 5 különálló, általában potméteres megoldású equalizert építenek Parametrikusan frekvenciasávonként elosztott tolókapcsolóval szabályozható hangszínszabályzót, ilyen esetben általában 8-tól akár 30-ig is terjedhet a külön szabályozható tartományok száma. A projektünkben ez utóbbit követjük, felvállalva azt, hogy így kissé bonyolultabbá válhat a kezelőfelület, viszont sokkal szabadabban állíthatja be a játékos a neki tetsző hangszínt. 10 sávot alkalmazunk, ezek elosztása a következőképpen alakul: Mélyhang tartomány: 80, 160, 300 Hz Közép: 500, 800, 1200, 3000 Hz Magas: 7, 12 és 16 kHz Ezen értékek a legtöbb keverőrendszeren, audiovezérlőkben és zenelejátszó programban is hasonlóképpen alakulnak, ezért választottuk itt is ezt a sémát. Viszont mivel a gitár hangja ritkán megy fel a 16 kHz-es tartományba, ezért a későbbiek folyamán ezt az elosztás optimalizációt igényel. A gitárra szabott hangszínszabályzók legmagasabb értékei 6 és 8 kHz körül mozognak.
53
8 A tervezés során végzett munkafázisok és tapasztalatok A tervezési fázisnál megállapítottuk a három fő modult, melyeket egymás között arányosan osztottunk fel. Az alkalmazás MDI alkalmazás, ahol a főablak tartalmazza a vezérlőgombokat, valamint a menü is itt helyezkedik el, így az egyes gyerekablakok adott fázisokat esetleg modulokat tartalmazhatnak. A legfontosabb szerepe a kamera képet kezelő formnak van (WebCam), mely megkezdi a kezdeti inicializációt (előfeldolgozás modul) és elvégzi a kezek követését is (értelmezés modul) sőt megindítja a hang lejátszását is. Az inicializációra külön gyerekablakot hoztunk létre (InicializeForm), hogy sokkal jobban lehessen követni az egyes folyamatok váltakozását, valamint ezzel is információt kérünk be a program használójától, mely a feldolgozás további részében később felhasználásra kerül. A hang lejátszásáért a GuitarSound és GuitarScale osztályok gondoskodnak. Az előbbi a gitár hangjának megfelelő lejátszásáért felel, míg az utóbbi pedig elkészíti a megfelelő skálát, melynek segítségével a megfelelő hang megszólaltatása biztosított. A két osztályt saját származtatott ablakban lehet tesztelni (GuitarTest). Itt egyéb érdekes effekttel lehet bővíteni a lejátszást, itt vizsgáljuk, hogy a megadott hanghoz adott pillanatban melyik hatás illik a legjobban. Hanglejátszásnál problémát okozott az előre definiálandó vezérlés beállítása, mivel ha rossz ősvezérlőt adtunk meg, akkor a hanglejátszás csak bizonyos ablakokban működött, viszont amint elváltottunk róla (például egy hisztogram készítés miatt), akkor a hang elnémult. A problémát feloldottuk azzal, hogy a főablak lett a fővezérlő. A webkamera képének kinyerésénél használunk egy statikus delegáltat, mely egy szintén statikus eseményhez van rendelve (FrameProcessor). Az esemény minden egyes kamera által küldött kép megjelenésekor következik be, tehát akkor, amikor a kamera egy képet ad ki. A legnagyobb nehézséget az okozta, hogy sikeresen tudjunk példányosítani ebben a metódusban. Több megoldás közül a saját delegált és saját esemény készítése mellett döntöttünk, ám a feldolgozást ez a megoldás enyhén lassítja. Sok kellemetlenséget okozott továbbá, hogy a használt OpenCV-s wrapper a korábban már említett DirectCV-ben több hiányosságot találtunk, illetve egyes metódusoknál az OpenCV-től eltérő működést tapasztaltunk. Ezeket a hibákat menet közben javítottuk, illetve kiegészítettük olyan függvényekkel, melyekre szükségünk volt. Ezekkel a módosításokkal a korábban is hatékony és könnyen kezelhető DirectCV-t még inkább használhatóvá tettük. Minden egyes funkció végrehajtását a Stopwatch osztályból származó stopperel mérünk. Későbbiekben ezt szeretnénk egy újra cserélni, hogy a méréseket ezzel is még pontosabban le tudjuk dokumentálni, illetve, hogy jobb áttekintést kapjunk a rendszer működésének gyorsaságáról.
54
9 A megvalósítás elemzése és alkalmazásának számbavétele A program jelenlegi verziója tesztelés fázisba ért, a hibák, melyek itt felbukkannak folyamatos javítás alatt vannak. A pengetés és a hang lefogásának megállapítása implementálva van. Ezek a jelenlegi rendszerünk alapkövei.
9.1 Rendszer integráció 9.1.1 Mentés és betöltés Alkalmazásunk jelenlegi állapotában minden állítható paraméter mentésére és betöltésére képes. A SaveData osztály gondoskodik a megfelelő struktúra meghatározásra, mely segítségével elmenthetők az alkalmazás során használt hisztogramok, melyek a mintavételezés során készülnek, valamint a főoldalon található összes paraméter, melyekkel a gitározás emulálása finomítható. Ezeken kívül eltároljuk a program speciális könyvtárait (például: eltárolt hangok helye vagy az elmentett adatokat tartalmazó fájl helye). Ezeket az adatokat XML formátumban tároljuk. Ez a szabvány manapság a legelterjedtebb, illetve a legtöbb alkalmazás kompatibilis az olvasásával, így az értelmezés egy átlagos felhasználó számára is lehetséges még a program használata nélkül is. A SaveToXML osztály magáról a mentésről és betöltésről gondoskodik. Egy kívülről is látható változót érdemes megemlíteni az osztályból a FileName-t, mely a megadott fájl nevét tárolja. A mentés és betöltés folyamata nagyon hasonlít egymásra ezért csak az egyik folyamatot fogjuk ismertetni, viszont a teljes folyamatot a 9.1. ábrán külön szemléltetjük (a lekerekített téglalapok mutatják, hogy milyen kimenetek keletkeznek a folyamat során, a sima téglalapok pedig az egyes fázisokat vázolják fel). A kiválasztott rádiógombtól függően dől el, hogy mit akar a felhasználó betölteni (hisztogramot illetve a paramétereket). Az első lépésnél a felhasználó kiválaszthatja egy dialógus ablakból a megfelelő fájlt, ahonnan a paramétereket be lehet tölteni. Természetesen a program által tárolt alapértelmezett mappa fog megjelenni, de bárhonnan választhatunk. Miután ki lett választva a fájl a következő lépésben, amennyiben a található benne paraméter a programban felbukkan egy újabb ablak, ahol kiválaszthatjuk, hogy mely paraméterlistát akarjuk viszontlátni. Természetesen a mentés folyamatánál névvel láthatjuk el a mentendő tulajdonságokat. A megfelelő objektumok visszatöltéséről nem csak a név gondoskodik, hanem egy lenyíló lista is, mely megmutatja az adott néven elmentett összes tulajdonságot. Hisztogram betöltése esetében a program nem fog inicializálni, tehát nem fog megtörténni a bőrszín mintavételezés. Miután kiválasztottuk az adott visszatöltendő tulajdonságokat, az alkalmazás aktualizálja a megfelelő értékeket. Minden egyes fázis megszakítható, ebben az esetben hibajelzéssel adjuk a felhasználó tudtára, hogy milyen változás történt illetve, hogy milyen nem.
55
Indítás Property lap
Mentés
Betöltés
Aktuális mentése Kiválasztott checkbox-tól függően: o hisztogram o property Minden mentése
Kiválasztott checkboxtól függően: hisztogram property
Fájl kiválasztás
Fájl kiválasztás
OpenFile dialógus ablakkal
SaveFile dialógus ablakkal Tárolásra kerül: fájlnév rövid fájlnév
Property kiválsztás
Property név
PropertySelector dialógus ablakkal
PropertyNameSaver dialógus ablakkal
Betöltés XML-ből és értékek aktualizálása
Mentés XML-be
Hisztogram: Bin értékek
Property: Threshold o Max o Min Measure o Head o Hand Pengető terület Hist. vödör
9. 1. ábra Paraméterek mentésének és betöltésének folyamata
56
9.1.2 Gitár emuláció megvalósítása Gitár emulációt egy webkamera képének feldolgozásával valósítottuk meg. Mivel csak egy kamerát használunk mélységi információink nincsenek, ezért a jelenlegi modellünk egy kétdimenziós térben helyezkedik el. A képfeldolgozás fő osztálya a WebCam osztály, ez az osztály felelős a kamera képének kirajzolására és innen hívódik meg minden képfeldolgozással kapcsolatos algoritmus is. Minden képfeldolgozással kapcsolatos metódust külön osztályba helyeztünk az átláthatóság kedvéért (ImageProcessing osztály) és éppen ezt az elvet követve jutottunk arra a döntésre, hogy a gitározással kapcsolatos megjelenítési metódusokat és változókat is elkülönítjük (a Guitar osztályba). Később ez sok segítség nyújthat abban, hogy játékosabbá tegyük az alkalmazást, mivel az osztály bementi változói között egy kép szerepel, melyre rajzolunk, valamint a két meghatározó pont a kéz és a fejpont, mely alapján a gitár kirajzolása történik. A tesztelés miatt szükségünk volt még egy WebCamResult osztályra is, mely az egyes folyamatok állapotát szemlélteti számunkra. A 9.2. ábrán láthatók azok a folyamatok, melyek során előáll a gitározás alapján a kimeneti hang. A sarok nélküli téglalapok szemléltetik az egyes folyamatok kimeneteit. A vázlatosságra törekedtünk, hogy szemléletesebb legyen az ábra és a folyamatok jól láthatók legyenek, ezért a kimeneten az egyes felbukkanó ablakokat értjük, melyekben rövid magyarázat található az ablak funkciójáról. A sarkos téglalapokban pedig az egyes folyamatok neve szerepel, valamint azoknak a működési vázlatuk, mely sorrendben szerepel. Első folyamat alatt, azaz Start alatt azt értjük, hogy a felhasználó megnyomja a Start gombot és saját maga indítja el az emulációt (mellékesen megjegyeznénk, hogy ha a Start lenyomásra került, megjelenik a Stop is, mellyel az egész folyamat azonnal megszakítható). A második folyamat egy előzetes inicializációról szól, mely során a felhasználótól bekérjük a megfelelő paramétereket a kamera beállításához majd a folyamat végén megjelenítjük az eredményeket és szemléltető ablakokat. A harmadik rész a rendszer magja ez a folyamat minden egyes kamerától érkező képre lefut és az ábrán alatta található folyamatokat indítja el. A működés szempontjából két részre lehet ezt a fázis bontani:
Inicializáció ObjectsFollowing
Az inicializáció egy előre meghatározott időtartamon belül hajtódik végre, mely az első képkocka eredményét elmenti háttérnek (ezt maszkként használjuk később), majd az időtartam leteltével mintavételezi a megfelelő területről a felhasználó bőrszínét. Az ObjectsFollowing a rendszerünk magja, mely működését tekintve lefedi a képinformációk értelmezése modult. A folyamat (ugyanilyen metódusnéven) az ImageProcessing osztályban található. Ebből a metódusból hívjuk meg a jelenlegi gitár kirajzolást, melyet azért említek meg, mert a későbbi bővítés és tökéletesítés során erőteljes hangsúlyt akarunk fektetni ennek az osztálynak a megújítására. A következő folyamat szekvenciálisan követi az ObjectsFollowing lefutását, egész pontosan annak az eredménye. Itt szólaltatjuk meg a megfelelő hangot.
57
Indítás
Kamera lap
Start CameraSelector CameraPropertySelector WebCam Kamera kép
WebCam betöltés Kamera és paraméterek kiválasztása Hisztogram betöltés vizsgálat o Visszaszámláló beállítása (5 sec) WebCamResult indítása
Inicialize ablak Visszaszámlálás kezdete
FrameProcessor
WebCamResult Tesztkép megjelenítés
Minden egyes képkockára meghívódó metódus
Inicializálási szakasz Inicializálás (első képkocka) o Háttér tárolása o Gitártest meghatározás Bőrszín mintavétel (utolsó. képkocka)
ObjectsFollowing Fejkeresés (Haar féle) o Kézkeresés Fejkövetés, kézkövetés (bőrszín alapján, súlypontszámítással) Pengető mintavételezése Gitár kirajzolás
Hang esemény
()))
((
9. 2. ábra Gitár emulációjának folyamata
58
9.1.3 Rendszerben található extra funkciók Vannak a rendszernek nem kimondottan a működést szolgáló funkciói, melyekről viszont említést kell tenni, mivel a tesztelésnél igen fontos szerepet töltöttek be. A legapróbb ilyen segítség az alkalmazás alján található státuszbár, melyen az szimulációs folyamat alatt készült feldolgozási időket figyelhetjük meg.
9.1.3.1 Hisztogram készítés Igen sok alapvető eljárásnál használunk hisztogramot, ezért implementáltunk ezt a funkciót, mely képes az előre beállított metódusban használt hisztogramok kirajzolására. A kirajzolás egy windows form-on történik. A megjelenítés során többféle lehetőségünk van a kirajzolásra, ezeket a 9.3. ábra szemlélteti. Az egyik, hogy bemeneti paraméterként egy hisztogramot adunk meg, ebben az esetben a rendszer egy 1 dimenziós hisztogramot rajzol ki. Abban az esetben, ha egy tömböt adunk meg, mely a kép intenzitás értékeit tartalmazza, szintén az előbbiekben említett eljárás fut le. Megadhatunk egy hisztogram tömböt, mely esetben kétféle opció létezik. Az első esetben az eddigiekben említett 1 dimenziós megvalósítást láthatjuk, melyen most különböző színekkel jelennek meg az egyes hisztogramok. Másik megvalósításunk az alkalmazás futása során folyamatosan követhető. Itt a mintavételezés során használt hisztogramot jelenítjük meg, ám itt egy 2 dimenziós megjelenítést használunk.
9. 3. ábra 2 dimenziós hisztogramok megjelenítési formái
9.1.3.2 Kép betöltése Ez a funkció kimondottan az alkalmazás tesztelését segíti. Főleg azért lett implementálva, hogy vizsgálni tudjuk az alkalmazás működését a különböző árnyalatú bőrszínnel rendelkező egyéneknél. Jelenleg még vannak hiányosságai, főleg a funkció paraméterezhetősége miatt, mivel most mindent fixen beállítva lehet tesztelni. Ami azt jelenti, hogy minden egyes kép előtt a paramétereket csak a kód megváltoztatásával lehet finomítani. A későbbiekben törekedni fogunk eme funkció kibővítésére, illetve hatékonyabb működtetésére.
59
9.1.3.3 Képek mentése A tesztelésnél szükségünk volt egy adott időpillanatban lévő összes kép lementésére. Ezen szükséglet miatt implementáltuk ezt a fajta mentési funkciót, mely a főablak menüjéből érhető el (meg kell említeni, hogy egész más funkciót lát el, mint a szintén főablakon található oldalsó menüben lévő mentési funkció). A képeket kiválasztott névvel menthetjük el, a formátumuk azonban fixen bitmap lesz, a folyamat végeredményét a 9.4. ábrán láthatjuk. Az összes képet saját névvel is elláttunk, hogy sokkal könnyebb legyen a tesztelésnél az egyes fázisokban keletkezett képek összevetése.
9. 4. ábra Képek mentésének eredménye fájlonként (végeredmény, fejtől balra lévő tesztkép, hisztogram, fejkövető, kézkövető, pengetés figyelő)
9.1.3.4 Inicializációs segédablak Létrehoztunk egy ablakot, melyre a kamera indítása után van szükségünk. A megadott paraméterek alapján lehet beállítani a megfelelő segédinformáció megjelenését, mely a felhasználót segíti abban, hogy mit kell csinálnia a játék megkezdése előtt, valamint a komplett inicializációs ablak megjelenésének idejét tudjuk szabályozni. A formon található visszaszámláló pedig megmutatja, hogy meddig fog tartani a program kezdeti várakoztatása. Amint az idő letelik, az ablak azonnal eltűnik és megkezdődik a tényleges szimulációs folyamat, mely első lépése a fejkeresés illetve a közvetlenül utána lezajló kézkeresés.
9.2 Képfeldolgozó modul megvalósítása 9.2.1 Bőrszín mintavételezés A bőrszín mintavételezése a program indításakor az első lépésnél kell, hogy megvalósítva legyen. Ezért OpenCV segítségével készítettem egy kisebb programot, ami a kép közepéből kiemel egy kisebb területet. A mintavételezés során a kiemelt területen 60
mindhárom (RGB) színcsatornán egy szűrőmaszkot futtatunk végig. Ez a szűrés arra szolgál, hogy a különböző zajokat elmossa, a minta megközelítőleg zajmentes legyen. Majd ezen a területen egy HSV konverziót hajtunk végre és a képet egyes csatornákra szétszedjük. Ennek a megvalósítását, a 9.5. ábra szemlélteti. Az ábrán látható kis fekete négyzet reprezentálja azt a területet ahonnan a mintát vettük.
9. 17. ábra Bőrszín mintavételezés
A csatornákra való szétbontás három különböző képet eredményez, melyekből a V csatornása képét elhagyjuk, mert nincs rá szükség. A H és a V csatornák alapján felállítottunk egy hisztogramot, mely két különálló dimenziójában reprezentálja a csatornák felett értelmezett intenzitás eloszlást. A 9.6 ábra azt az eredményt mutatja, amely az adott képrészletről készült hisztogramot ábrázolja.
9. 18. ábra H-S hisztogram
A képrészlet a bőrszín H és S csatornára vonatkozó intenzitás eloszlását reprezentálja, ahol a H és S értékek egy jól kivehető tartományban megugranak. Ezt a megugrást a 9.4 ábrán megjelöltük.
61
A továbbiakban ezzel a hisztogrammal fogunk dolgozni mind a kézdetektálási folyamatban, mind pedig a mozgáskövetés során.
9.2.2 Előre meghatározott bőrszín felhasználása A bőrszín mintavételezési műveletet minden indításkor meg lehet ismételni, viszont elmenthetőek a hisztogramok XML kiterjesztésű fájlokban. A mentési folyamatot az előzőekben már ismertettük. A hisztogramok betöltésénél az alkalmazás az inicializálós részt kihagyja, tehát nem fog a bőrszín mintavételezési rész még egyszer lefutni. A mentést OpenCV függvényhívás biztosítja melyet szintén kipróbálásra került. Ez a megoldás csak abban az esetben adott jó eredményt, ha ugyan azok a fényviszonyok adottak és ugyan az a felhasználó alkalmazza az eljárást. A továbbiakban a kéz és fejdetektáló módszereket és azokkal elért eredményeket részletezzük.
9.2.3 Kézdetektálás Miután meg volt a bőrszínünk, implementáltuk a kézdetektálási funkciót, melyet a bőrszín mintavételezése után projekciós művelettel és súlypontszámítással meghatároztuk a lefogó kéz elhelyezkedését a kép egy adott inicializálási területén.
9. 19. ábra Kiinduló helyzet jobb, illetve balkezes játék alapján
Az inicializálási területet megválasztása az alábbi szempontok alapján történt:
A kamerától érkező kép koordináta rendszerének sodrási irányát tekintve a használt implementációs környezetben a bal alsó sarokból indul az origó. Ha jobbkezes a felhasználó, - vagyis ez alatt azt értjük, hogy jobb kezével penget és a bal kezével fogja le a hangot - akkor a kép jobb felső sarkában kell keresni a kezet. Értelemszerűen, ha balkezes, akkor mind ezt fordítva.
Ezen kiindulási helyzet alapján az inicializálási területet, jobbkezes játék esetében, a kép jobb felső sarkába helyzetük.
62
9. 20. ábra A kéz mozgási tere
Ezek után ezen a területen (9.8. ábra) végigfuttattunk egy átlagoló szűrőt, majd a projekciós művelet eredményeképpen megkaptuk a feltételes valószínűségi képet, mely minden pixelében a bőrszínre vonatkozó adott helyen vett feltételes valószínűségi értéket mutatja. A 9.9.-es ábrán feltételes valószínűségi kép látható, melyet az inicializációs területre végeztünk el.
9. 21. ábra A projekció után
Utolsó lépésben ennek a régiónak meghatározzuk a súlypontját és a 9.10. ábrán látható eredményt kaptuk.
63
9. 22. ábra A kézdetektálás eredménye
Ezen a területen képkockánként elvégeztük minden ciklusban a műveleteket, így egy korlátozott mértékben használható kézkövetést tudtunk megvalósítani. Ez a fajta kézkövetés számunkra nem ad kielégítő eredményt, hiszen a játékos szabad mozgást csak korlátozott mértékben tud végezni. Ennek szellemében a mozgáskövetést a kézdetektálás eredményeképpen meghatározott pontban optikai folyammal kíséreljük megvalósítani.
9.2.4 Sarokpont keresés A következő lépés a sarokpont keresés, amely ahhoz szükséges, hogy a következő lépésben történő Lucas-Kanade optikai folyam technika megfelelő eredménnyel tudjon működni. A sarokpont keresést az előző lépésben meghatározott kézpont környezetében végezzük el. Ezt a környezetet viszonylag kicsinek választottuk, mert nem akartunk a háttérhez tartozó sarokpontot detektálni. Sarokpont keresésre OpenCV egyik megvalósított függvényét a Harris sarokpont detektort használjuk. Ez a függvény bemenetként egy szürkeárnyalatos képet vár illetve egy listát, amelyben a pontok helyzetét tároljuk valamint a pontok számát. Az elvárt sarokpontok szám a mi esetünkben egy. A Harris sarokpont detektor működéséből adódóan több pontot is detektálhatunk sarokpontnak, amelyeket egy sorba rendezi a jóságuknak megfelelően és nekünk az első, azaz a legjobban követhető pont is elegendő. Ezt a megoldást sikeresen tudtuk implementálni és kielégítő eredményt adott.
9.2.5 Mozgáskövetés optikai folyammal Mozgáskövetést első lépésben OpenCV Lucas-Kanade függvényével próbáltuk megvalósítani, azok közül is a piramis módszerrel működő változatát használtuk. A metódus működési elve: paraméterül szürkeárnyalatos képet vár, ezért minden esetben egy szürkeárnyalatos képpé való konverziót végzünk el. Továbbá a paraméterek között szerepel a követendő pontok listája is, amelyek elmozdulását számolja ki a metódus. Ezeket az új értékeket szintén egy paraméterül átadott listában tárolja el. A metódus eredményeként működő alkalmazást kaptunk, amely a 9.11. ábrán szemléltetünk. A jobb oldali ábrán ’t’ a bal oldalin ’t-1’ időpillanatban rögzített eredmények láthatók. 64
A rendszer által követés céljára meghatározott pont
Az elmozdult pont
9. 23. ábra Lucas-Kanade módszer megvalósítása OpenCV segítségével
A sarokpont megahatározás nem egyértelmű a mi esetünkben, mert a követendő kézfej a megvilágítási viszonyoktól függően a veszít azon tulajdonságából, mely szerint jól követhető sarokponttal rendelkezne. Mivel sok esetben nincs jellemző sarokpont a kézfejen, ezért annak követése Lucas-Kanade módszerrel nem ad hatékony megoldást. További hátráltató szempont az is, hogy háttér sarokpontjait is érzékeli és az elmozdult pontunk helyett ezért fennakad a mozgáskövető rendszer egy jellemző háttérhez tartozó sarokponton. Mindezzel arra jutottunk, hogy egy jellemző pont direkt módon történő követése nem ad jó megoldást. A továbbiakban egy másik megoldást mutatunk be, ami a program jelenlegi állapotában működik és jelentősen jobb eredményt biztosít a kéz követésére.
9.2.6 Szín alapú mozgáskövetés Ebben a részben azt mutatjuk be, hogy valósítottuk meg a mozgáskövetést mind a fejre, mind pedig a lefogó kézre vonatkozóan. A mozgáskövetés alapja a bőrszín alapján előállított projekciós kép súlypontjának követése. A kézdetektálási eljárás által meghatározott kézpont körül egy előre definiált ablakméret segítségével elkészítjük a projekciós képet. A projekciós képen súlypontot számítva felhasználjuk ezt a pontot a következő ciklushoz. A kamera által szolgáltatott következő képen ugyanilyen módon meghatározzuk ebben az ablakban a projekciós képet, majd annak súlypontját. Az így kapott súlypont elmozdulása az előző ciklusban meghatározott súlyponthoz képest adja a felhasználó kezének, valamint arcának elmozdulását. Az elmozdulás meghatározása után módosítjuk az ablakpozíciót, mely a következő iterációban ismét felhasználunk a projekciós kép előállításához. Ily módon jutunk egy színalapú mozgáskövetéshez. Ez az eljárás annyiban egyszerűsödött a CamShift algoritmushoz képest, hogy a Mean Shift súlypontszámítási iterációinak száma egy, valamint az egyes ciklusokban az ablakméret nálunk nem változik. A továbbiakban meg kell említenünk ennek a módszernek a hátrányit is. Ez az eljárás akkor nem működik megfelelően, ha a játékos rövid ujjú illetve a bőr színéhez nagyon hasonló öltözékben van. További nem kívánatos tényező, ha a háttér elemei között szintén bőrszínhez hasonló objektum fordul elő. Ez a módszer is erősen függ a megvilágítástól, viszont az esetek többségében jobban használható, mint a Lucas-Kanade féle optikai folyam technika.
65
9.2.7 Megvalósított inicalizációs folyamat Ez előző részekben taglalt eredmények C++ környezetben születtek, céljuk a felhasználható technikák használhatóságának elemzése volt. Az bőrszín mintavételezést, mint ahogy említettük, statikus módon végeztük el majd, ennek a felhasználásával készítettük el a projekciós képet, amin a súlypontszámítást követően behatároltuk a kézpozíciót. Ez után ennek a pontnak a környezetében sarokpontokat kerestünk. A legjobbnak bizonyuló jellemző pontot optikai folyam segítségével követni próbáltuk, de arra a következtetésre jutottunk, hogy túlságosa is érzékeny a hibákra ez a megoldás. Végül a CamShift algoritmus egy módosított változatát implementáltuk, mely a Mean Shift-en belül a súlypontszámítást az iteráción belül csupán egyszer hajtja végre, illetve az ablakméret fixen értelmezett. A továbbiakban azt mutatjuk meg, hogy ezeknek a kísérleteknek a függvényében hogyan lett megvalósítva az alkalmazásunk. Első lépésben a bőrszín mintavételezés történik. A program indításakor egy visszaszámlálási ciklus történik, annak érdekében, hogy a felhasználó a kezét a 9.12 ábrán látható négyzetbe el tudja helyezni. Az öt másodperces visszaszámlálás után a négyzet közepéből megtörténik a mintavételezés.
9. 24. ábra Bőrszín mintavételezés
A mintavételezés eredménye egy H-S hisztogram, amit a program további működéséhez eltárolunk.
9.2.8 Megvalósított kézdetektálás Az előző lépésben megtörtént a minta vételezése, így most már a kézdetektálási funkció következik. Ez a mi esetünkben egy sokkal egyszerűbb megoldásnak bizonyul, hiszen azt a kezet határoljuk be, amelyről mintát veszünk, illetve fordítva arról a kézről veszünk mintát, amelyet követni fogunk. Így a követendő kéz helyzete a mintavételezési pozícióban található.
66
Tehát a következő lépés a mintavételezés után a követő ablak elhelyezése a mintavételezési területen. A követő ablak alapértelmezetten egy 100x100-as méretű része a képnek, melyen meghatározzuk a feltételes valószínűségi képet. Ezen a képen kiszámoljuk a súlypontot, majd a követő ablak közepét ráigazítjuk erre a súlypontra. Ezt addig iteráljuk, míg a kiszámolt súlypont és az ablak közepe közti távolság 10 pixel alá nem csökken. A továbbiakban arckereső algoritmust futtatunk a fej megtalálásra és miután ez sikeresen végrehajtódott, megindul a mozgáskövetés. Mind a fejre, mind a kézre követőablakot helyezünk, majd az elmozdulás függvényében módosítjuk azok pozícióit.
9.2.9 Fejdetektálás Fejdetektálásra Haar féle objektumkeresést használunk az alkalmazásban, mivel már előre elkészített eljárás, ami ráadásul az OpenCV-ben implementálva van. Az eljárás egy bemeneti képen keres megadott jellemzőket. Egy XML-ből olvassa ki ezeket a jellemzőket, mely XML-t be kell tanítani. Mi az OpenCV-be előre betanított fájlok közül választottuk a számunkra legmegfelelőbbet. Az ObjectsFollowing metóduson belül hívjuk meg a fejdetektálást, mely találat esetén egy pontot ad vissza (a hely valószínű helyét a képen). Amennyiben ez a pont (0,0) úgy a következő képkockán is lefuttatja a rendszer a fejkeresést addig, míg az érték különböző nem lesz nullától. A 9.13. ábrán látható egy piros karika, esetünkben ez a fejdetektálás eredménye. Az objektumkeresés lefutása után térünk csak át a súlypontszámításra, ami az objektumkövetést valósítja meg.
9. 25. ábra A fejdetektálás eredménye a kamera képén
9.2.10 Megvalósított színalapú mozgáskövetés Az előző két lépésben meghatároztuk a lefogó kéz illetve a fej pozícióját. Rákerültek mind a kézre, mind a fejre a követőablakok. A következő lépés annak a folyamatnak az indítása, melynek során a követő ablakok pozícióját képről képre módosítjuk a kéz és a fej elmozdulásának függvényében. A színalapú mozgáskövetésnél már részletezett technika került beépítésre. Mint ahogy már említettük, az egész képre vonatkozólag a kézre és a fejre helyezett követőablakban meghatározzuk a feltételes valószínűségi képet és súlypontot számolunk azon. A következő képkockán ez a pont fogja adni a követő ablak középpontjának kiindulási helyét.
67
A felhasznált mozgáskövető technika egyik paramétere a követő ablak mérete. A mi alkalmazásunkban egy fix 100x100-as ablakméret van beállítva. Abban az esetben, ha a felhasználó teljes felsőtesttel beáll a kamera látószögébe, ami teljes mozgási tér kihasználásához elengedhetetlen, akkor ezek az ablakméretek elegendően nagyok a mozgás követéséhez. Nagyobb mérető ablakok esetén nem kapunk jobb eredményt a követésre vonatkozóan, viszont több időt igényelnek a nagyobb ablakokban a projekciós képek előállításai. A 9.14. ábra a programunk működési folyamatának egy állapotát reprezentálja, ahol követő ablakok a képen található fej illetve lefogó kezet követik, valamint az ablakokban előállított projekciós képek láthatóak. Ezek a képek képkockáról képkockára kiértékelésre kerülnek és a rajtuk számolt súlypontok adják a következő képen a követőablakok középpontjainak kiindulási helyét.
9. 26. ábra Fej és kézkövetés
9.2.11 Hibakezelés A mozgáskövetés folyamán felléphetnek olyan problémák, mint például a felhasználó keze illetve feje kicsúszik a kamera látószögéből, valamin az elmozdulás sebessége olyan mértékű, hogy a következő ciklusban folyamán az ablakban már nem lesz érzékelhető a felhasználó keze vagy feje. Ezekben az esetekben az ablakok helyén előállított projekciós kép nulladik momentuma, vagyis a pixelintenzitások összege megközelítőleg nulla. Ezekben az esetekben, ha a területösszeg egy bizonyos érték alá csökken a követési folyamat leáll. Ha fejre irányuló ablakban történik meg mindez, akkor újraindul a fejkeresési funkció. Ha viszont a lefogó kézre helyezett követő ablakban veszítjük el a kezet, akkor a kézkeresési funkció ebben az esetben nem indul el. További képkockákra kiértékeli a projekciós képet, és ha a felhasználó visszateszi ugyan abba a pozícióba a kezét, a követési technika folytatódik tovább. Ez úgy valósulhat meg, hogy ha a kéz egy része a követő ablakban csupán részben lelhető fel, akkor projekciós képen számolt súlypont a követő ablakot kéz belépési pontja felé húzza. A folyamat során így mindig középre kerül a kézfej.
68
9.2.12 Lefogott hang megállapítása Az előzőeket összegezve, a fejkeresés után - sikeres visszatérési érték esetében megkezdődik a mozgáskövetés, mely súlypontszámítással van megvalósítva. A 9.15. ábrán a kéz és a fej egy piros ablakban látható, melyet az alkalmazás folyamatosan változtatat, úgy ahogy a két objektumot mozgatja a felhasználó. Az ablakokon belül egy-egy binarizált képen dolgozunk, mely képek a bőrszín alapú szegmentálás alapján készülnek el. Ezeken a speciális kisképeken hajtunk végre súlypontszámítást, mely egy pontot ad vissza. Ezt a pontot piros karikával jelöljük meg. A következő képkockán ez lesz a kiindulási ablakunk középpontja. Minden esetben megvizsgáljuk, hogy a terület egy adott küszöbértéknél nagyobb-e, ha igen, akkor valószínűleg a követendő objektum még a piros négyzeten belül van. Ilyenkor az alkalmazás tovább fut a gitár kirajzolásához, mely alatt a lefogott hangot is megállapítjuk.
9. 27. ábra A lefogott hang jelölése kék gitáron piros vonallal történik
Első lépésként megállapítjuk a gitárunk dőlésszögét. Ezt a gitár testének valamint a gitár fejének távolsági adataiból fogjuk megkapni egy tangens számítása után. A gitár érintőinek távolságát az alkalmazás elején állítjuk be az inicializációs részben. Itt minden egyes érintő a gitár testéhez viszonyított távolságát meghatározzuk. A gitártest jelenleg együtt mozog a fejjel. Az ábrán látható hogy a fejtől lefelé és tőle balra helyezkedik el. A következő lépésben a követendő kézpont koordinátáinak segítségével meghatározzuk, hogy a kézpont éppen melyik lefogónál található. Ezt a műveletet egy egyszerű tartományvizsgálattal valósítottuk meg. A képen látható, hogy a gitár nyakáról (1. kék vonal a gitár tetején) lejjebb helyezkedik el. Ilyenkor az adott érintőt pirossal jelöljük. Miután megvan a dőlésszög és az lefogott érintő, mintavételezzük a pengető adott környezetét. Amennyiben ott található egy meghatározott aránynál nagyobb mennyiségű bőrszínt tartalmazó pixel, akkor pengetés eseményt fogunk kiváltani.
9.2.13 Pengetési esemény generálása A pengető mintavételezésének sikeres eredménye a 9.16. ábra bal oldalán található, itt látható, hogy a bőrszínnel megegyező pixelek nagyobb arányban
69
9. 28. ábra Pengető mintavételezésének eredményei
vannak, mint a háttérpixelek. A másik képen pedig tisztán látható, hogy nem található bőrszín a területen, tehát nem haladt el ott a kéz, így nem volt pengetés. Amennyiben az ObjectsFollowing metódus visszatérési értéke nagyobb nullánál, akkor az adott értéknek megfelelően valamilyen hangot szólaltatunk meg. Nullánál kisebb visszatérési értéknél az alkalmazás nem érzékel pengetés, így tovább folytatódik minden természetesen hanglejátszás nélkül.
9.2.14 Összefoglalás A képfeldolgozó modul megvalósítása során sikerült elérni, hogy a kamerából érkező képen megtaláljuk a felhasználó kezét és arcát, majd ezeket a bejövő képeken folyamatosan kövessük. Az első lépésben mintavételeztük a bőr színét a felhasználó kezéről az inicializációs pontban. Majd ez a pont egyértelműen megadta a lefogó kéz pozícióját, melyre ráhelyezve egy ablakot előállítottuk a projekciós képet, amin súlypontot számoltunk. A súlypontra ráigazítottuk ismét az ablak középpontját, majd megismételtük ezt a folyamatot mindaddig, míg minimális érték alá nem csökkent az ablakközéppont és a súlypont közti távolság. Így pontosabban be tudtuk határolni a kezet. A további képkockákon ugyan ebben az ablakpozícióban előállítottuk a projekciós képet és az ezen meghatározott súlypont elmozdulása megadta az ablak elmozdulását. Ezzel a technikával a lefogó kezet a képfolyamon követni tudtuk olyan módon, hogy a követőablakot mindig a kéz után igazítottuk. Viola-Jones arcdetektáló segítségével könnyen és gyorsan megtaláltuk a felhasználó fejét. Majd erre is egy követőablakot helyezve sikeresen tudtuk követni a játékos fejét. Ha a kéz kimozdult a követő ablakból, akkor megállt a kézkövetés mindaddig, míg ugyan abba a pozícióba vissza nem helyeztük a kezet, a követőablak így automatikusan ráállt kézre. Ha viszont a fej mozdult ki, akkor újrafutott az arcdetektálás és a visszaadott pozícióba ismét ráhelyeztük a követőablakot. Ennek segítségével sikerült megvalósítani a kéz és fejkövetést. A fej elmozdulásának függvényében módosítottuk a gitár test pozícióját, így a gitár a játékossal együtt mozgott. A lefogó kéz pedig megadta egyértelműen a gitár dőlésszögét. Végül a gitár test és a lefogó kéz távolsága meghatározta a lefogott hangot. A pengető helyénél vettünk egy képrészletet, ahol meghatároztuk a projekciós képet, és ha azon a bőrszín pixelek nagyobb arányban voltak, mint a háttérpixelek, akkor megszólaltattuk a lefogott hangot. A DirectSound felhasználásával pedig képes a program megszólaltatni a hangot, olyan módon, ahogy azt a játékos beállítja a saját ízlése szerint, mindezt minimális késéssel és az így elérhető legjobb minőségben. Erről bővebben a következő fejezetben esik szó.
70
A teljes rendszerről készítettünk egy osztálydiagramot, ez a 9.17 ábrán látható, amúgy külön is megtalálható - nagyobb méretben - a mellékletekben is.
9. 17. ábra Rendszer osztálydiagramja
71
9.3 Hanglejátszás megvalósítása 9.3.1 DirectSound logika Az eddigiekben ismertetett rendszer tehát végeredményként megadja, hogy éppen hányadik érintőnél történt egy adott hang megszólaltatása. Ezt az információt aztán egy másik modul bemenetként megkapja, és ez szolgáltatja a folyamat végét jelentő audio esemény kiváltását. Ehhez egy külön osztályt hoztunk létre a programban, ezen keresztül vezéreljük a DirectSound adta felületet, ez a GuitarSound nevet kapta. Hardveres eszköz inicializálása, másodlagos pufferek létrehozása, és a paramétereinek megadása
A hangfile-ok betöltése a másodlagos pufferekbe, és ezek hozzárendelése a hangkártyához
Hang lejátszásakor az effektek leírására szolgáló tömb létrehozása, és feltöltése a megfelelő paraméterekkel
Az adott effekt tömb hozzárendelése a másodlagos pufferhez, majd a lejátszás elindítása 9. 18. ábra A DirectSound logikájának áttekintése
Maga a DirectSound egy olyan interfész, amely képes egységesen kezelni minden hangkártyát, képes a hangokat memóriában tárolni és onnan minimális késleltetéssel lejátszani azokat, akár egyszerre többet is összekeverve, ezen kívül modulálni, térben elhelyezni is képes azokat, sebességüket, tempójukat, hangerejüket akár lejátszás közben dinamikusan változtatni. A DirectSound a hang megszólaltatásához úgynevezett puffereket – tárhelyeket használ, ezekben tárolja el a lejátszandó hangfájl adattartalmát. Az elsődleges puffer mindig a fizikailag is létező adott hangkártya, meghajtó saját memóriáját jelenti, ebből természetesen csak 1 létezik, erre küldi ki a csatolófelület is az információt. Viszont létezik a másodlagos puffer, ebből többet is létrehozhatunk. A GuitarSound modul inicializáláskor ilyen másodlagos pufferből hoz létre egy olyan hosszúságú tömböt, ahány hangot aktuálisan képesek akarunk lenni megszólaltatni a gitáron. Minden egyes ilyen pufferbe pedig betölti az annak megfelelő wav file-t, tehát azt az adott hangot, amit előzetesen a skálák és az alaphang által beállítottunk. Ezeken a puffereken különböző hatásokat, vezérlési opciókat állíthatunk be, ezáltal engedélyezve az modulációt, a hangerőszabályzást, vagy éppen a térhatást. Az így létrehozott tömböt a későbbi egyszerűbb visszatöltés végett van módunk külön XML file-ba menteni. A puffereket természetesen hozzá kell rendelni a megfelelő hangot lejátszani képes hardver egységhez, ezt a program úgy valósítja meg, hogy az alapértelmezett hangkártyához rendeli hozzá. Amikor a megszólaltatásra igény keletkezik, akkor a program első lépésben beazonosítja, hogy mely modulációs és egyéb effektek vannak engedélyezve és azokat a hozzájuk tartozó paraméterezéssel értelmezi az adott hangra. Ezt a DirectSound úgy valósítja meg, hogy létezik egy EffectDescription nevű típusa, melyben el tudja tárolni bármelyik modulációs hatás összes paraméterét és hozzá tudja azt rendelni a lejátszáshoz. Mivel ez a 72
típus általánosan az összes effektre működik, azok között különbséget kell tennie, erre a célra GUID-okat hoztak létre, amelyek azonosítják az éppen szóban forgó típust. Ilyen EffectDescriptionből az alkalmazásunk létrehoz szintén egy tömböt, amelynek hosszúsága az engedélyezett effektek számánál tízzel nagyobb. A plusz tízre azért van szükség, mert a hangszínszabályzás minden esetben aktív és a projektben egy tíz sávos felosztást alkalmaztunk, a specifikációban tárgyaltak alapján. Az így létrehozott tömbbe a program utána összegyűjti az összes bekapcsolt effektet, majd hozzárendeli az adott másodlagos pufferhez, majd elindítja a lejátszást.
9.3.2 Testreszabhatóság, beállítási opciók Készítettünk egy tesztelési ablakot a hanglejátszáshoz ez a 9.19. ábrán látható. A DirectSound egyes effektjeit implementáltuk és itt tudjuk kitesztelni a megfelelő hang lejátszását a megfelelő effekttel, valamint azt, hogy egyszerre több hang is képes megszólalni akár úgy, hogy közben a háttérben valamilyen zene hallható (a zenelejátszást szintén itt lehet elindítani). Az gitáremuláció során az alaphangokat használjuk, de az elkészített tesztlejátszó segítségével ez bármikor módosítani tudjuk.
9. 19. ábra Pengető mintavételezésének beállítási lehetőségei
Ezen az ablakon tudjuk beállítani a gitárhangzásunkat. A baloldalon, a listában láthatjuk az épp aktuálisan lejátszható hangokat, őket kiválasztva, meg is hallgathatjuk őket, ezáltal ellenőrizve, hogy a számunkra megfelelő módon szólalnak-e meg. A Scale menüpontnál tudunk váltani skálát, ezáltal e hangok elosztását tudjuk módosítani, az egész sor transzponálását pedig a Basenote menüponttal tudjuk szabályozni. A Length a hosszat állítja be, ebből azonban a program csak az első hatot használja fel. A jobb oldali több füles részben tudjuk a megfelelő effekteket beállítani az előző fejezetekben taglaltak alapján, az „Add effect” gomb hozzáadja, illetve, ha már aktív az adott effekt, akkor kikapcsolja azt. Alul a 10
73
sávos hangszínszabályzóval tudjuk végleges formába önteni az általunk kiválasztott megszólalást. A listán a megfelelő hangot kiválasztva és rákattintva lehetőség nyílik meg is hallgatni, hogy az épp aktuális beállításokkal hogyan is fog szólni a virtuális gitárunk. A chord test gombra kattintva meghallgathatjuk, hogy több hang egyidejűleg hogyan is szól majd, a Start music, ill. a Stop music gombokkal pedig a következő fejezetben tárgyalt modult próbálhatjuk ki.
9.3.3 Zenelejátszás és a DirectX további lehetőségei A GuitarSound modul képes ezen kívül zene lejátszására is. Ehhez a DirectX másik modulját az AudioVideoPlayback-et használja fel, mivel ez a modul is képes a számítógép hardveres erőforrásait hatékonyabban kihasználni, mint a Windows saját API hívásai lennének képesek, így a processzor terheltsége csökken. Ez a modul a későbbi továbbfejlesztésnél, amikor tényleges zenei alapra történik a játék lesz majd fontos. Hangvezérlési szempontból ez a modul abban különbözik elsősorban a DirectSound-tól, hogy nagyobb méretű és más formátumú file-okat is támogat lejátszáskor, azonban azokra nem tud valós időben effekteket hozzáadni és olyan nagyfokú szabadsággal sem rendelkezik felettük, kevesebb személyre szabható lehetőséggel a játékos számára. Elsősorban, mint ahogy a neve is sugallja, zenei- és videofájlok lejátszására szolgáló metódusokat tartalmaz ez a csomag, azokon különböző szűrőket nem képes végezni. Ez a későbbiek folyamán történő felhasználás miatt került implementálásra, ugyanis a specifikációban is leírtak alapján a programnak képesnek kell lennie egy játékos módot prezentálni, ahol egy adott zenei alapra lehet képes a felhasználó dallamot, kíséretet adni a program segítségével.
74
10 Tesztelési eredmények Ebben a fejezetben a tesztelési eredmények kerülnek bemutatásra, amelyek a projekt jelenlegi állapotát reprezentálják. Az első részben a feldolgozási időre vonatkozó méréseket és a hozzájuk kapcsolódó konzekvenciáról lesz szó, míg a második rész a pontosságra valamint a hatékonyság bemutatásán helyezi a hangsúlyt.
10.1 Feldolgozási időre vonatkozó mérések Feldolgozási időre vonatkozó méréseink alapja az átlagos frame feldolgozási idő. A rendszer bemenetére érkező képkockákat, melyeket a webkamera biztosít, a rendszer állapotától függően, különböző sebességgel dolgozza fel. A program az inicializációs részben a beérkező framen arc, illetve kézdetektálást végez el. Az azt követő további képkockák feldolgozása már csak a fej és kézkövetésre irányul. Három különböző mérést végeztünk, mind a három mérést ugyanazon a gépen és ugyanolyan fényviszonyok mellett három különböző felhasználó részvételével. A mérések a képkockák feldolgozására, vagyis az információ kinyerésének gyorsaságára irányult. A mérési folyamat 640*480-as kamerafelbontás mellett, megközelítőleg 1500 képkocka feldolgozásáig tartott. A 10.1. ábrán látható grafikonban rögzítettük az eredményeket, ahol a vízszintes tengely a feldolgozott framesorozatot, függőleges tengely pedig az adott képkocka feldolgozási idejét mutatja. Három különböző mérést különböző színekkel ábrázoltuk. 400
Frame feldolgozási idő (ms)
350 300 250 200
Teszt 1 Teszt 2
150
Teszt 3
100 50
1 64 127 190 253 316 379 442 505 568 631 694 757 820 883 946 1009 1072 1135 1198 1261 1324 1387 1450
0
Frame sorozat 10.1. ábra Feldolgozási időre vonatkozó mérési adatok
A grafikonról több minden olvasható le. Elsőként az inicializációs részhez tartozó arcdetektálási idő, másodsorban az arcdetektálás pontatlanságára utaló megfigyelés, amelyre a következő részben térünk ki.
75
A rendszer által használt arcdetektáló algoritmus egy listával tér vissza mely a képen talált arc-szerű minták elhelyezkedésére vonatkozó információt tartalmaz. A fejdetektáló algoritmus által visszaadott lista optimális esetben egy pontot tartalmaz, amely a kamera előtt álló játékos arcát tartalmazó ablak. Az arcdetektáló algoritmus futási ideje a leghosszabb, amelyeket a grafikonon a magas kiugrások ábrázolnak. A további feldolgozás, amely során a kéz és fej követése történik, minden ciklusban ugyanannyi időt igényel. A kisebb eltérések a hangmodul erőforrás igényire mutatnak, mely csak akkor van igénybe véve, ha pengetés esemény következik be. A követési fázis átlagos feldolgozási idejét a 10.2. ábrán jelöltük, amely nem tartalmazza az inicializációs részhez tartozó arcdetektálási algoritmus időigényét, ami a folyamat során többször is lefutott. Annak az elemzésére, hogy miért futott le többször az arcdetektálás, a hatékonyságra vonatkozó mérési részben térünk ki részletesen. További gyorsítást érhetünk el, vagyis csökkenthetjük egy képkocka feldolgozási idejét, ha alacsonyabb felbontással dolgozunk. Alacsonyabb felbontás előnye a kevesebb mennyiségű pixel feldolgozása. Két képfelbontással készült mérési folyamat eredményeit a 10.2. ábrán látható grafikonon szemléltetjük. 300
Frame feldolgozási idő (ms)
250
200
150 640x480 320x240
100
50
1 59 117 175 233 291 349 407 465 523 581 639 697 755 813 871 929 987 1045 1103 1161 1219 1277 1335 1393 1451
0
Frame sorozat 10.2. ábra 320*240 és640*480 –as video feldolgozási idő összevetése
A mérést 640*480-as és 320*240-es kamerafelbontással végeztük. A mérési folyamat 1500 képkocka feldolgozásáig történt. A mért eredmények a kamerától érkezett képsorozat átlagos feldolgozási idejét tükrözik. A grafikonról az olvasható le, hogy 320*240-es felbontás mellett az arcdetektálási idő felére csökkent. Ez abból adódik, hogy az arcdetektáló algoritmusnak fele akkora képen kellett a jellemzőket kiszámolnia. A követési fázisban a súlypont meghatározást ugyanakkora ablakméretben számoltuk ki, így annak futási ideje nem változott.
76
10.2 Hatékonyságra vonatkozó mérések Az előző részben a feldolgozási időre vonatkozó mérési eredményeket vizsgáltuk, ebben a részben pedig a program működésének hatékonyságára irányul figyelmünk, azon belül is a képfeldolgozó, vagyis az előfeldolgozó és az értelmező modulok működésére. Hatékonyságát a rendszerünknek az inicializációs részben történő arc, valamint kézdetektálás és a játék során történő arc illetve kézkövetés pontossága határozza meg. Ezen funkciók vizsgálatára a méréseket a rendszer felépítésének szellemében két részre osztottuk. Első részben a fejdetektáló algoritmust kell hatékonysági szempontból megvizsgálni, második részben pedig a projekciós műveletet tesztelni, mely alapja a kézdetektálásnak, illetve arc és kézkövetésnek.
10.2.1 Arcdetektálás hatékonyságára irányuló mérések Arcdetektálási folyamat hatékonyságának elemzésére az előző részben taglalt feldolgozási időre vonatkozó mérési adatokat használtuk fel. A 10.3. ábrán szereplő grafikon három különböző tesztelési eredményt tartalmaz a képkockák feldolgozási idejére vonatkozóan. A három mérés folyamán megfigyelhető, hogy többször is lefutott az inicializációs részhez tartozó arcdetektáló alrendszer, melynek oka, hogy az arc követési folyamat során a követési területből kicsúszott a követendő arc, amely a projekciós képen számolt objektum-terület drasztikus csökkenését idézte elő. Ebből következtetve újra futtatta az alkalmazás az arcdetektálást. A másik oka ennek, hogy az arcdetektáló által visszaadott érték hamis pozitív. Az arcdetektáló algoritmus visszatérési értéke egy lista, amelyben azok az ablakok szerepelnek, melyek pozitívként értékeltek az osztályozás során. Ez annyit jelent, hogy ezek az ablakok nagy valószínűséggel arcot tartalmaznak. Hamis pozitívnak nevezzük azt az eredményt, melyet az arcdetektáló alrendszer pozitív egyedként osztályozott, mégis negatív eredmény számunkra. Hamis pozitív eredmény esetében a rendszerünk újra futtatja arcdetektálót. Ez abból következik, hogyha az arcdetektáló által visszaadott ablakban az objektumkövetési alrendszer súlypontszámolása után a fej területének értéke (melyet) nulla vagy nullához közeli, vagyis az ablakban nem található bőrszínű objektum. A 10.3. ábrán látható grafikonon a 2-es és 3-as teszt esetében próbára téve a rendszert a kamera látószögéből kimozdult a felhasználó feje, melynek következményeként meghívódott újból az arcdetektálás. A grafikonon leolvasható, hogy többször is egymás után hamis pozitív értékkel tért vissza az arcdetektáló alrendszer. Ezzel ellentétben az 1-es tesztnél csak a program indulásakor volt arcdetektálás és nem volt hamis pozitív eredmény.
77
400
Arcdetektálás nulla értékekkel
Arcdetektálás hamis pozitív értékekkel
Frame feldolgozási idő (ms)
350 300 250 200
Teszt 1 Teszt 2
150
Teszt 3
100 50
1 67 133 199 265 331 397 463 529 595 661 727 793 859 925 991 1057 1123 1189 1255 1321 1387 1453
0
Frame sorozat
10.3. ábra Arcdetektáló hatékonyságára vonatkozó mérési adatok
További információ is levonható a hatékonyságra vonatkozóan 10.3. ábrából. Ahogy azt említettük az arcdetektáló algoritmus egy listával tér vissza, ami ideális esetben egy elemet tartalmaz. A rendszerünk ennek a listának az első elemét veszi eredményül és azzal dolgozik tovább, viszont vannak esetek, amikor ez a lista üres és az osztályzás során nem került ki pozitív eredmény. Ebben az esetben a rendszer újból meghívja az arcdetektálást. Ez a grafikonról leolvasható olyan formában, hogy egymás utáni framek magas feldolgozási idővel kerülnek sorra. Ebben az esetben az oszlopok szélessége tekinthető a hatékonyság mértékének olyan szempontból, hogy minél keskenyebb annál hamarabb talált arcot. Úgy is jellemezhetnénk ilyen szempontból az arcdetektálást, hogy hamis negatívokat dobott el az osztályozó. A 3-as teszt esetében igen sok framen nem talált arcot. Ami ezekből az eredményekből levonható, hogy megfelelő paraméterezéssel és jó kaszkád megválasztásával esetleg tanításával csökkenthető lehetne a hamis pozitívak, illetve a hamis negatívok aránya, mely nagymértékben növelhetné a rendszer hatékonyságát ebből a szemszögből.
10.2.2 Kézdetektálás és arc, illetve kézkövetés hatékonyságára vonatkozó mérési eredmények Ebben a részben rendszerünk kézdetektálása illetve a kéz és fejkövetés hatékonyságára vonatkozó mérési eredményeket vizsgáljuk. A kézdetektálási, valamint a követési eljárások alapja a projekciós képen történő súlypont meghatározás. A projekciós kép minősége attól függ, hogy milyen a bejövő képen a megvilágítás, illetve milyen jó bőrszín mintavételez. Ebben a részben azt mutatjuk be, milyen eredményeket kaptunk különböző bőrszín mintavételezések esetén.
78
10.4. ábra Különböző bőrszín mintavételekkel történő súlypont meghatározás
A bőrszín mintavételezése az inicializációs részben egyetlen „teszt” egyénen történt. Különböző pontokban a kézfejről illetve az arcról adott megvilágítás mellett zajlott a folyamat. A teszthez szükséges adatok elkészítése után a különböző minták alapján különböző projekciós képek álltak elő. A különböző képeken számolt súlypontok értelemszerűen mindig más pozícióba esetek. A 10.4. ábrán ezeket a mérési eredményeket tüntettük fel. A képen 20 különböző bőrszín minta alapján előállt projekciós kép és alatta a súlypont meghatározásból származó eredmény látható. Az 5. és 6. mérés esetében a háttérpixelek is belekerültek a projekciós képbe, így elrontották a súlypontszámítást. A bőrszín mintavételezés az inicializációs részben tehát ilyen lehetséges eredményeket szolgáltatott, ami a mintavételezési pontatlanságból ered. A pontatlanág abból fakad, hogy a 79
bőrszín minta nem fedi le az egyén bőrszínek egész tartományát, illetve a háttér pontok színei beleeshetnek ebbe a bőrszín tartományba. Kézdetektálás illetve kéz és fejlövetés szempontjából ez a fajta mintavételezés erősen függ az emberi interakció pontosságtól, mennyire jó helyre helyezi el a felhasználó a kezét a mintavételezési területen, valamint az adott helyen található fényviszonyok is erősen befolyásolják a folyamat végeredményét.
10.2.3 Hang tömörítési eljárások hatékonyságának mérése Mivel a DirectSound-nak is vannak korlátai a hang lejátszása terén, így az elérhető file formátumok között is próbáltuk az elérhetőbbeket minél sokrétűbb módon tesztelni. Ezen tesztek során 3 tulajdonság vizsgálata került előtérbe: Fájlméret: a felső korlátot kb. 1-2 Mbyte-nál állapítottuk meg, ennél nagyobb puffert sajnos nem tudott biztosítani a DirectSound számunkra. Zaj/minőség: a lejátszott hang mennyire tisztán, érthetően szól, az eredeti felvételhez mennyire hasonlít, illetve mennyiben vesz el, tér el tőle a tömörített változat Késés/Teljesítmény: lejátszáskor késéssel jelentkezik-e az adott hang, vagy azonnal megszólal. Természetesen a késés nem engedélyezett és egyben utal arra, hogy a processzort terheli-e és ha igen, mennyire a lejátszás/dekódolás A hangfelvételkor a sztereóban, 96 KHz-en, 32 bites mélységben kerültek fel a lemezre, így meglehetősen tiszta, artikulált hangot hallunk a gitártól. A file-ok hossza 9 másodpercben lett megállapítva, mivel az első hangmintánkkor meglévő 4 másodpercnél rövidnek bizonyult – a húr lecsengése hirtelen maradt abba, nem hallottuk végig a teljes karakterisztikáját a gitárnak. Ilyen feltételekkel egy darab file kb. 7 Mbyte helyet foglal, mely sajnos így önmagában nem használható. MP3, valamint OGG és WMA tömörítés esetén is rendkívül hasonló eredmények jöttek ki méretre (gyakorlatilag pár Kbyte volt az eltérés). Mindhárom formátumnál van lehetőségünk mélységet változtatni, ezáltal jelentősen változik a minőség és méret, a késés azonban mindháromra jellemző és meglévő fogalom, sajnos a tizedmásodperces késés jelentősen rontott a játékélményen, így ezek a formátumok, hiába a rendkívül tömör – 128 Kbit/sec-es tömörítés esetén, ahol még jó minőségben, szépen szól a húr, 144 Kbyte-os méretet értünk el – méretnek, nem kerültek felhasználásra végül. Sajnos ez azt is jelenti, hogy a processzor is dolgozik a hanglejátszáson, ami pedig a képfeldolgozó modul erőforrásait veszi el és ez által az egész program hatékonyágát csökkentette volna. Éppen ezért a késés nélkül megszólaló WAV formátumok között válogattunk, ezek által szerzett tapasztalatokat a 10.1. táblázat reprezentálja. 10.1. táblázat Tömörítési eljárások összehasonlítása
Algoritmus
Mintavét. sűrűség (KHz)
Tömörítetlen Tömörítetlen Tömörítetlen Tömörítetlen Tömörítetlen CCITT A-Law CCITT A-Law GSM 6.10 GSM 6.10 ADPCM ADPCM
96 44 44 22 22 44 22 44 22 44 22
Mintavét. (bit) 32 32 16 32 16 16 16 16 16 16 16 80
mélység Fájlméret (Kbyte) 9 616 3 459 1 590 1 590 796 796 400 83 43 402 204
10.1.
A táblázat alapján következtethetnénk arra logikusan, hogy a GSM 6.10 a legkedvezőbb, mivel a legjobb mintavételezési adatok mellett a legkisebb méretet adja. Azonban a GSM kodeknél figyelembe kell vennünk, hogy az ez által eltárolt hang pusztán egycsatornás (mono), míg az összes többi esetben sztereó hangról van szó. Ezen felül sajnos a GSM technikával tömörített hangok minősége sem volt kielégítő, lejátszáskor jelentkezett egy – a hang képén nem kimutatható és nem is szűrhető/vágható – pattanó, kattogás szerű zaj. A többi eljárás és a fentebb tárgyaltak eredményeként végül az ADPCM mellett döntöttünk, azon belül mind a két (44 és 22 KHz-es) sűrűséggel működik az alkalmazás.
10.3 Mérési adatok összefoglalás A feldolgozási időre vonatkozó mérések azt megmutatták, hogy ami magas feldolgozási időt igényel az inicializációs rész. Az inicializációs részben is helyet kapó arcdetektáló eljárás a program működésének folyamán többször is működésbe lépett. Ezekben az esetekben a keresést a rendszer az egész képen végrehajtja. Jelentős teljesítményjavulást érhetnénk el, ha az ismételt keresést egy leszűkített területen hajtanánk végre, ahol magas valószínűséggel előfordulhat a felhasználó arca. A mérések azt is megmutatták, hogy alacsonyabb felbontás mellett lényeges teljesítményjavulás érhető el, ami az arcdetektálás gyorsítását javítja és mind emellett hatékonysága rendszerünknek nem csökkent. Az arcdetektálás hatékonyságára irányuló mérések azt mutatták meg, hogy az arcdetektáló alrendszer jelenlegi állapotában igen sok hamis pozitív értékkel tér vissza, illetve rengeteg esetben nem szolgáltat eredményt. Az arcdetektáló alrendszer hatékonyságának javítására megfelelő át paraméterezés szükséges, illetve jobb kaszkád struktúra biztosítása. A bőrszín mintavételezésére irányuló mérések azt mutatták meg, hogy az inicializációs részben a bőrszín mintavételezés nem működik hatékonyan. Olyan megoldás szükséges, mellyel kiszűrhetők a háttérpixelek, illetve a mintavételezést valamilyen mértékben automatizálni lehetne.
81
11 Továbbfejlesztési gondolatok A későbbiekben szeretnénk még bővíteni az alkalmazást, hogy háttérzenére is lehessen gitározni, valamint a grafikai részt elég erősen át fogjuk dolgozni, hogy interaktívabb és ténylegesen játékszerű legyen a programunk. Erre megoldási ötletként azt találtuk a legéletszerűbbnek, hogy egy külön ablakban Direct3D segítségével, ami szintén a DirectX programcsomag része, egy játékos figurát mozgatunk a játékos valódi mozgásának
11.1. ábra Guitar Hero III [27]
megfelelően, tehát a webkamera képéről nyert információkat felhasználjuk és a kezek mozgásának megfelelően mozgatjuk a figuránkat. A fenti képet egy hasonló programból vettük, a háttérben szereplő karakterhez hasonlóan lehetne egy modellt mozgatni, a webkamera képéről adódó információk alapján. A Direct3D használatának másik nagy előnye, hogy mivel a DirectSound és az AudioVideoPlayback modulok okán már amúgy is használatban van a DirectX, így további függőségekkel nem terhelnénk az alkalmazást. Megfontolásra kerül az így kihasználható kamerakezelő modulra való áttérés is, mivel a DirectX-nek erre is van megoldása, azonban nem rendelkezik olyan sokrétű képességekkel, mint az OpenCV-s változat. A háttérzene hozzáadásával pedig elérhetjük azt, hogy a játékosnak a zene ütemére kelljen bizonyos, látványos megjelölt hangokat megszólaltatnia és ezzel „hozzájátszva” az egyik gitársávot, részese legyen a zenemű előadásának. A helyes ritmusban eltalált hangokért természetesen pontot kapna a szereplő és így kompetitív, szórakoztató jelleget adhatunk a programnak. Ezt más programokban úgy oldották meg, hogy adott ütemenként bizonyos színű/számú objektumok, körök hullanak fentről lefelé és amikor azok elhaladnának a képernyő alján (ami esetünkben a virtuális gitárunk nyaka lenne), akkor kell őket megszólaltatni és a jól időzített gomblenyomásért pont jár. Haar féle objektum detektálás felhasználható a fej megtalálására, mely számunkra kizárási lehetőséget biztosíthat, így pontosabban feldolgozott képhez jutunk. Amennyiben az algoritmussal megtaláljuk a fejet, ezek után kizárhatjuk a kéz követésének feldolgozásából a fej által meghatározott környezetet. Erre a módszerre egy egyszerű maszkolás megfelelő. Másrészről a fej helyzetéből következtethetünk arra, hogy a gitár pengetője hol helyezkedik el. Egy arányossági tényező segítségével egy meghatározott távolságot kaphatnánk. A 82
távolságot levonva a fej helyzetéből egy pontot kaphatunk, ami a fej alatt lesz, követi annak mozgását, tehát nagy valószínűséggel követné a felhasználó elmozdulását. Ezzel azt a hibát lehet kivédeni, hogyha a felhasználó teste elmozdul, akkor azt az alkalmazás ne értelmezze újabb mozdulat megtételének. Másik ötlet a továbbfejlesztésre, hogy ugyan ezt fent említett objektumdetektálási technikát kiterjeszteni a kezek keresésére. A módszer lényege, hogy bizonyos jellemzőit a képrészleteknek egy több lépcsősen betanított algoritmussal osztályozni lehet, így detektálhatók az objektumok a leíró tulajdonságaik alapján. E technika felhasználásával egy biztosítékot tudunk nyújtani a rendszer számára, amivel még jobban javíthatjuk a felismerés pontosságát, valamint a követés jóságát.
11.2. ábra Frets on fire [28]
Harmadik irány a továbbfejlesztésre, ehhez kapcsolódóan, hogy a kezek helyzetére bevezetett osztályozó algoritmussal képesek lehetnénk valamilyen jóslást adni, hogy egy valódi gitár esetén a játékos ujjai a húrokat pontosan hol fognák is le, ezáltal lehetőséget adnánk az akkordjáték bevezetésére a projektben. Ehhez bizonyos mintázatokat, jellemzőket kell vizsgálnunk, hogy bizonyos akkordok lefogása pontosan milyen kéztartás segítségével történik általános esetben. Másik előnye ennek az iránynak természetesen az lenne, hogy képesek lehetnénk a jelenlegi 1 húrunkat akár az igazi gitárokhoz hasonlóan hatra is növelni és ez által szinte teljesen realisztikus élményt adni az egyszeri felhasználónak, betekintést adva neki a gitározás rejtelmeire és akár oktató jellegű felületet is biztosíthatnánk a gyakorló zenészeknek. Ezen lehetőség megvalósítását a Haar algoritmus segítségével vizsgáltuk eddig, azonban további minták begyűjtése szükséges a megfelelő eredményhez.
83
12 Összefoglalás Ebben a fejezetben azokat az elért eredményeket foglaljuk össze, amelyeket a projekt során sikerült megvalósítanunk. A projekt célja egy gitár emulációs alkalmazás, mellyel a felhasználó egy kamera segítségével képes a gitározást emulálni és hangokat ez által megszólaltatni. A rendszer tervezése folyamán három különböző modulra osztottuk fel a projektet, de végrehajtási területét tekintve két jól elkülönülő részre lehet bontani:
képfeldolgozó modul hang modul
Az alábbiakban ilyen szempontú felosztásban részletezzük az elért eredményeket.
12.1 Képfeldolgozó modul A képfeldolgozó modul a tervezési részben két logikai egységre bomlott, mégpedig az előfeldolgozó és a képértelmező almodulokra. A fizikai megvalósításban viszont ezek egységesen lettek implementálva, éles határt nem lehet köztük húzni. A képfeldolgozó modul megvalósítása során sikerült elérni, hogy a kamerából érkező képen megtaláljuk a felhasználó kezét és arcát, majd ezeket a bejövő képeken folyamatosan kövessük. Az első lépésben mintavételeztük a bőr színét a felhasználó kezéről az inicializációs pontban. Majd ez a pont egyértelműen megadta a lefogó kéz pozícióját, melyre ráhelyezve egy ablakot előállítottuk a projekciós képet, majd súlypontot számoltunk. A súlypontra ráigazítottuk ismét az ablak középpontját, majd megismételtük ezt a folyamatot mindaddig, míg minimális érték alá nem csökkent az ablakközéppont és a súlypont közti távolság. Így pontosabban be tudtuk határolni a kezet. A további képkockákon ugyan ebben az ablakpozícióban előállítottuk a projekciós képet és az ezen meghatározott súlypont elmozdulása megadta az ablak elmozdulását. Ezzel a technikával a lefogó kezet a képfolyamon követni tudtuk olyan módon, hogy a követőablakot mindig a kéz után igazítottuk. Viola-Jones arcdetektáló segítségével könnyen és gyorsan megtaláltuk a felhasználó fejét. Majd erre is egy követőablakot helyezve sikeresen tudtuk követni a játékos fejét. Ha a kéz kimozdult a követő ablakból, akkor megállt a kézkövetés mindaddig, míg ugyan abba a pozícióba vissza nem helyeztük a kezet, a követőablak így automatikusan ráállt kézre. Ha viszont a fej mozdult ki, akkor újrafutott az arcdetektálás és a visszaadott pozícióba ismét ráhelyeztük a követőablakot. Ennek segítségével sikerült megvalósítani a kéz és fejkövetést. A fej elmozdulásának függvényében módosítottuk a gitár test pozícióját, így a gitár a játékossal együtt mozgott. A lefogó kéz pedig megadta egyértelműen a gitár dőlésszögét. Végül a gitár test és a lefogó kéz távolsága meghatározta a lefogott hangot. A pengető helyénél vettünk egy képrészletet, ahol meghatároztuk a projekciós képet, és ha azon a bőrszín pixelek nagyobb arányban voltak, mint a háttérpixelek, akkor megszólaltattuk a lefogott hangot. A képfeldolgozó modul tesztelése során a feldolgozási időre, illetve a feldolgozás hatékonyságára vonatkozó méréseket végeztünk el. A feldolgozási időre vonatkozó mérések azt megmutatták, hogy ami magas feldolgozási időt igényel az inicializációs rész. Az inicializációs részben is helyet kapó arcdetektáló eljárás a program működésének folyamán többször is működésbe lépett. Ezekben az esetekben a keresést a rendszer az egész képen végrehajtja. Jelentős teljesítményjavulást érhetnénk el, ha
84
az ismételt keresést egy leszűkített területen hajtanánk végre, ahol magas valószínűséggel előfordulhat a felhasználó arca. A mérések azt is megmutatták, hogy alacsonyabb felbontás mellett lényeges teljesítményjavulás érhető el, ami az arcdetektálás gyorsítását javítja és mind emellett hatékonysága rendszerünknek nem csökkent. Az arcdetektálás hatékonyságára irányuló mérések azt mutatták meg, hogy az arcdetektáló alrendszer jelenlegi állapotában igen sok hamis pozitív értékkel tér vissza, illetve rengeteg esetben nem szolgáltat eredményt. Az arcdetektáló alrendszer hatékonyságának javítására megfelelő át paraméterezés szükséges, illetve jobb kaszkád struktúra biztosítása. A bőrszín mintavételezésére irányuló mérések azt mutatták meg, hogy az inicializációs részben a bőrszín mintavételezés nem működik hatékonyan. Olyan megoldás szükséges, mellyel kiszűrhetők a háttérpixelek, illetve a mintavételezést valamilyen mértékben automatizálni lehetne. Az eredményekből levont következtetések segítenek a további fejlesztésben.
12.2 Hang modul A hang modul először különálló elemként készült, később ez is az erősebb kohézió kialakítása végett a projekt egyik belső részévé lett emelve. Feladata gyakorlatilag minden, a megszólaltatáshoz szükséges információk előkészítése és aztán azok véghezvitele, minél kevesebb erőforrás igénybevételével. Ehhez a Microsoft DirectX programcsomagjának a DirectSound nevű modulját hívja segítségül. Mivel a hangok különálló file-okban találhatóak, így azok könnyen tovább bővíthetőek, testreszabhatóak lesznek. A tömörítési eljárások során folytatott tesztek eredményei mutatják, hogy az adott modul érzékeny erre és a különböző algoritmusok közül az ADPCM felel meg jelenleg a projekt céljainak leginkább. A többi algoritmus esetén sajnos minőségromlás, késleltetett megszólalás, vagy akár jelentős zaj is megjelenhetett, ami jelentősen rontotta a játékélményt, melyet az alkalmazásnak biztosítania kell. Ezzel az algoritmussal azonban a hangok azonnal megszólalnak, minimális zajjal és pontosan úgy, ahogy a valódi gitár esetén is megszólal az adott húr. A DirectSound interfészt kihasználva ráadásul ezen fájlokból gyakorlatilag több ezres nagyságrendben mérhető a hallhatóan különböző kikeverhető, előállítható hangzások, hangszínek száma, amit tetéz a kiválasztható skálák által nyújtott szabadság. Ezen tulajdonságok paraméterei menthetőek. Továbbá implementálásra került a zenelejátszó modul alapja is, ez a jövőbeni továbbfejlesztés, a külön zenei alapra történő konkrét kísérethez tartozó feltételt elégíti ki. A javított megszólaláshoz több lehetőség is nyitva áll, akár a saját gitár hangmodellező algoritmusok implementálására, akár a hangminták még jobb minőségű felvételéről van szó. Ahogy a számítógépek erősebb rendszerek lesznek, úgy lesz egyre jobban megvalósítható és valós időben megszólaltatható egy modellező algoritmus. Manapság azonban a jó minőségben gitárhangot modellező algoritmusok nem képesek valós időben legenerálni egy átlagos processzoron a megfelelő hangot.
85
13 Irodalomjegyzék [1]
[2] [3] [4]
[5] [6] [7] [8] [9] [10]
[11] [12]
[13] [14] [15]
[16]
[17]
[18] [19]
[20]
Benedek Balázs, Tóth András - Virtual Hand jelbeszéd felismerő rendszer (2006 évi Budapesti Műszaki Főiskola Kari Tudományos Diákkör Konferencián bemutatott projekt) http://bmfnik.hu/virtualhand/ (2009-12-18) E. Trucco, A. Verri - Introductory Techniques for 3-D Computer Vision (1998), ISBN0132611082 Gonzales R. C., Woods R. E. - Digital Image Processing, 2ed, Prentice Hall (2002), Telecommunications Software and Multimedia Laboratory and the Acoustics Laboratory of the Helsinki University of Technology - Virtual Air Guitar http://airguitar.tml.hut.fi/whatis.html (2008-09-25) Poppe András (előadása alapján) - Az emberi látás jellemzői, színtani alapok Eugene Vishnevsky - Color Conversion Algorithms http://www.cs.rit.edu/~ncs/color/t_convert.html (2008-10-26) Shapiro, L. G. & Stockman, G. C: - Computer Vision, Prentence Hall, (2001) Tony Bacon - Nagy gitár könyv (Budapest, 1993), ISBN9637628649 Pintér Tibor - A hangnemek hatásesztétikájának kritikai vitája a 18. századi német zeneesztétikában. Laokoón, 2. (2002-2003) Hangtömörítés: Vorbis - http://xiph.org/vorbis/doc/ (2009-11-06) MP3 - MP3 technical details (MPEG-2 and MPEG-2.5), Fraunhofer IIS. (2007-09) Gitáreffektek - http://www.geofex.com/effxfaq/fxdescr.htm (2008-10-26) Éldetektálás: http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/OWENS/LECT6/node2 .html (2008-10-26) http://www.icaen.uiowa.edu/~dip/LECTURE/PreProcessing3.html#edge (2008-10-26) Kató Zoltán – Digitális képek szegmentálása 3. (Élek detektálása) www.cab.u-szeged.hu/~kato/segmentation (2008-10-26) Codeproject - http://www.codeproject.com/KB/audio-video/Motion_Detection.aspx (2008-10-26) Kálmán szűrő: http://mek.oszk.hu/02500/02540/02540.doc (2008-10-26) http://bme-geod.agt.bme.hu/tutor_h/terinfor/t61.htm#kalman (2008-10-26) Julier, S. J. & Uhlmann, J. K. - A new extension of the Kalman filter to nonlinear systems. (1997), Int. Symp. Aerospace/Defense Sensing, Simul. and Controls 3. (2008-05-03) RGB színtér: Charles A. Poynton - Digital Video and HDTV: Algorithms and Interfaces, Morgan Kaufmann (2003), ISBN1558607927 HSV színtér: http://www.tomjewett.com/colors/hsb.html (2008-10-26) Steven K. Shevell - The Science of Color. Elsevier. (2003), ISBN 0444512519 E. Davies - Machine Vision: Theory, Algorithms and Practicalities, Academic Press, (1990) Snake – Bob Sumner: http://www.cc.gatech.edu/classes/cs7322_97_spring/participants/Sumner/discussions/s nakes.html (2008-11-08) B. D. Lucas and T. Kanade, - An iterative image registration technique with anapplication to stereo vision, Proceedings of the 1981 DARPA Imaging Understanding Workshop (pp. 121–130), (1981) 86
[21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31]
[32] [33] [34]
C. Harris and M. Stephens, - A combined corner and edge detector, Proceedings of the 4th Alvey Vision Conference (pp. 147–151), (1988) OpenCV - http://opencv.willowgarage.com/wiki/ (2009-11-06) DirectCV - http://code.google.com/p/directcv/ (2009-11-06) Nicholas Boughen - Lightwave 3d 7.5 Lighting. Wordware Publishing (2003), ISBN1556223544 Rack effektek - http://www.soundloftstudios.com/soundequipmentphotos.htm (2009-09-13) Effekt pedálok - http://www.joestump.com/effects.htm (2009-10-21) Guitar Hero III kép - http://www.flickr.com/photos/42002245@N04/3880207869/ (2009-11-24) Frets on fire kép - http://www.katzforums.com/showthread.php?t=373308 (2009-11-24) Paul Viola, Michael J. Jones - Robust real-time object detection. Technical Report, Cambridge Research Laboratory, ( 2001-01) Intel Corporation - Open Source Computer Vision Library Reference Manual (2001) ALLEN, J. et al. - Object Tracking Using CamShift Algorithm and Multiple Quantized Feature Spaces. Sydney: Proceedings of the Pan-Sydney Area Workshop on Visual Information (2003) Flanger - http://www.cedaraudio.de/intro/debuzz.html (2009-11-29) Gitárkép: www.zeneszmagazin.hu/?q=hir/tartalom/903 (2009-11-28) Aktív kontúr - Chenyang Xu and Jerry L. Prince - http://iacl.ece.jhu.edu/projects/gvf/ (2009-12-22)
87
14 Melléklet 14.1 Használati útmutató 14.1.1
Rendszerkövetelmények
14.1.1.1
Hardware igény
Optimális rendszer: Intel Core 2 Duo T5450 / 1.66 GHz (Dual-Core) 2GB DDR2 SDRAM – 667 Mhz 15,4’’ TFT monitor USB kompatibilis webkamera 50Mb szabad hely
14.1.1.2
Software igény
Microsoft Windows XP, Microsoft Windows Vista operációs rendszer legalább DirectX 9.1c verzió legalább OpenCV 1.0 verzió
14.1.2
Szimuláció indításának első lépései
14.1.2.1
Főablak ismertető
A program megjelenését tekintve egy egyszerű ablakos alkalmazás, mely kettő menüvel rendelkezik: hagyományos lenyíló menüsor, bal oldali navigációs menü
88
A hagyományos menü a főablak vezérlésére szolgál, valamint a minden olyan funkció, mely nem tartozik a kamera kezeléséhez ide került. Ilyen például a program jelenlegi állapota (Docs menüelem), melyet egy hivatkozás által a saját honlapunkról lehet napra készen nézni, vagy például a File lenyíló menüből elérhető mentési funkció (Save as), mellyel a főablakban található összes kép lementhető. A bal oldali navigációs menü három főmenüből áll: mentési/betöltési beállítások kamerakezelés gitárhang beállítások Az első főmenü tartalmazza a hisztogram, illetve a kamera fülön beállított paraméterek lementésnél használt eljárásokat és rendelkezik egy információ megjelenítő résszel is, melyen mentési paraméterek fájlneve, illetve az elmentett hisztogram található. A harmadik főmenüben található egy gomb, mellyel a gitár hangjának megváltoztatásához szükséges beállító ablak indítható, illetve ide fognak kerülni a legtöbbet használt gitárhangok, illetve az egyéb gyorsbeállítók. A második főmenüvel a következőkben részletesen megismerkedünk, elöljáróban annyit róla, hogy itt találhatók a szimuláció során állítható paraméterek. Természetesen a menükön kívül rendelkezik egy hagyományos status bar-ra is, melyen az egyes futásidőket jelenítjük meg.
14.1.2.2
Kamera kiválasztása
Az alkalmazás indításakor első lépésben kiválasztjuk a „Camera”fület.
Következő lépésben a lenyíló fülön kiválasztjuk a csatlakoztatott kamerát, majd tovább megyünk OK-ra kattintva.
89
Válasszuk ki a képkocka sebesség: 30 FPS és a kimeneti méretet: 640x480 (default) értéket. Majd kattintsunk az OK-ra.
14.1.2.3
Inicializációs folyamat
Helyezzük a kezünket a fekete négyzetbe az ábrán látható módon, majd 5 másodperc letelte után elindul a mintavételezés.
90
14.1.2.4
Emulációs folyamat
Az ábrán a gitár kék színű vonallal van jelölve. A gitártest alsó része a pengető itt kell a kéznek elhaladnia a pengetés kiváltásához. Az alkalmazás a piros négyzeten belüli kezet követi, mellyel meghatározhatók a lefogott hangok. Ezzel párhuzamosan folyik a másik piros négyzeten belüli fejkövetés annak érdekében, hogy a gitártestet a felhasználó elmozdulása szerint változzon.
91
14.1.2.4.1
Emuláció során állítható paraméterek
Az oldalsó navigációs menüben találhatók a követést finomító paraméterek:
küszöbértékek változtatása (Threshold) terület küszöbérték (Measure) pengető terület hisztogram vödrök
A küszöbértékek változtatásával a bőrszín detektálás végeredményén finomíthatunk. Ezekkel a paraméterekkel vizsgálhatjuk, hogy az egyes értékek milyen befolyással vannak a szegmentálásra, eredeti célunk a külső zajok megismerése volt. Ezekre azért volt szükség, mert így tudtuk vizsgálni, hogy az egyes fényviszonyok mellett milyen zajok keletkeztek a szegmentált képen, valamint, hogy a bőrszín mintavételezés az egyes értékekkel milyen zajos eredményeket adott. Menet közbeni változtatással megfigyelhető, hogy lesz több illetve kevesebb bőrszínnek tűnő pixel (természetesen van olyan eset, hogy nemcsak a kívánt bőrszín jelenik meg az eredményképen, hanem a zaj is). A terület küszöbértékekkel állíthatjuk be az aktuális fej illetve kéz követési ablakban lévő objektum minimum méretét, tehát egy olyan küszöbértéket, amellyel megmondhatjuk, hogy összesen mennyi az a pixelszám, ami felett az adott objektum nagy valószínűséggel a követőablakban benne van. Ez arra szolgál, hogy ha az aktuális területszám kisebb, mint ez a küszöb, akkor újraindítsuk az inicializációt, mivel akkor nagy valószínűséggel a fej illetve a kéz kifutott a követőablakból. A pengető területtel állítható egy olyan határérték, mellyel a pengetési érzékenységet lehet beállítani. A szám minél kisebb, annál érzékenyebb lesz a rendszer, tehát gyorsabban húzhatjuk végig a pengető helyen a kezünket úgy, hogy az esemény biztosan kiváltódjon. Ha a szám nagy, akkor csak akkor lesz eseménykiváltás, ha a felhasználó lassabban pengetett. A hisztogram vödrökkel állítható a megjeleníthető hisztogram vödreinek a száma. Ez a funkció csak átmenetileg tartozik a kamera főmenühöz (tesztelésnél sokat használtuk). Későbbi verziókban várhatóan a grafika lenyíló menüből meghívható ablakon érhető majd el.
92
14.2 Osztálydiagram
93