GRI: Gestures Recognition Interface
Transcript
GRI: Gestures Recognition Interface
2012 di Dario D'Ambruoso GRI: Gestures Recognition Interface Scopo di questo lavoro è la realizzazione di un applicativo in grado di riconoscere, e quindi interpretare alcuni gesti delle mani, nello specifico ben 13 per mano. In aggiunta a questo si è deciso di utilizzare tali gesti per la navigazione di oggetti 3D. Interazione Uomo - Macchina Prof. Ing. V. Bevilacqua GRI: Gestures Recognition Interface Capitolo 1: Caso di studio - Introduzione CAPITOLO 1: CASO DI STUDIO INTRODUZIONE Negli ultimi anni si sta assistendo ad un interesse sempre maggiore per le interfacce uomo-macchina. Gli sviluppi attuali mostrano sistemi che permettono all'utente di interagire con i computer in maniera più semplice, consentendo l'utilizzo di metafore vicine alle azioni che vengono eseguite dagli uomini. Un esempio può essere l'utilizzo oramai consolidato degli ambienti WIMP (Windows-Icons-Menu-Pointer), divenute interfacce standard in molti sistemi operativi quali Windows, IOS…. La possibilità di utilizzare un mouse per “puntare e cliccare" oppure “trascinare" files o programmi da un posto all'altro, aprire finestre nelle quali andranno a girare programmi ecc., piuttosto che usare linee di comando, rende l'utilizzo del computer più intuitivo o, come si dice nella terminologia appropriata, “user friendly". Non solo i computer, recentemente anche console di gioco quali X-Box, Wii, ed altre presentano un’interazione ad un livello molto avanzato, tuttavia sfruttano sempre dispositivi non comuni, si pensi al Kinect di Microsoft, il quale è dotato di telecamera RGB, doppio sensore di profondità a raggi infrarossi composto da un proiettore a infrarossi e da una telecamera sensibile alla stessa banda; oppure al wiimote di Nitendo. Recentemente per cercare di rendere FIGURA 1: KINECT ancora più naturale e intuitiva l'interazione con l'ambiente dei computer si stanno esplorando nuovi argomenti di ricerca, quali l'utilizzo diretto delle gestualità della mano (senza l'uso di mouse o di joystick) per comunicare con le macchine. Mediante l'uso di speciali guanti muniti di sensori, una determinata configurazione della mano viene riconosciuta dal computer tramite i segnali provenienti dai sensori applicati al guanto. L'utilizzo di interfacce pilotabili attraverso gesti della mano offrono i seguenti vantaggi: una interazione più naturale con la macchina: i gesti sono una forma naturale di comunicazione e di facile apprendimento; l'uso di comandi gestuali per interagire con sistemi computerizzati rende l'approccio con il sistema più naturale; una interazione più potente ed efficace: i sistemi che percepiscono sia la posizione della mano che il movimento hanno un potere espressivo più alto: infatti con un unico gesto si potrebbero identificare sia l'oggetto indicato sia l'azione da eseguire su di esso; una interazione diretta: da un punto di vista cognitivo, la mano diventa il device di input, senza aver bisogno di trasduttori intermedi. L'interazione uomo-macchina diventa diretta semplicemente assegnando gli adeguati gesti. Teoricamente, è possibile emulare altri device (ad esempio la tastiera utilizzando un alfabeto delle dita). Diversamente dai tradizionali metodi di interazione che usano strumenti pilotati dalla mano (quali il mouse), l'utilizzo diretto delle gestualità della mano senza nessun trasduttore intermedio fa assumere alla comunicazione uomo-macchina un aspetto pressoché naturale, ed inoltre sfruttando appieno le capacità gestuali dell'utente può ridurre il tempo necessario per l'apprendimento. Alcuni studi effettuati circa l'utilizzo delle gestualità nella comunicazione fra le persone hanno rilevato che il 70% - 80% di ciò che viene detto durante un dialogo può essere espresso esclusivamente mediante gestualità che coinvolgano tutte le parti del corpo. Da ciò viene sottolineata l'importanza che viene attribuita all'utilizzo di gesti della mano nella interazione uomo-macchina. I sistemi che sfruttano questa nuova modalità di interazione possono fornire inoltre un prezioso strumento per quelle persone dotate di capacità motorie limitate, permettendo di sfruttare solo alcuni limitati movimenti per interagire con la macchina. Purtroppo questo particolare tipo di guanti in genere sono poco confortevoli e molto fastidiosi, limitano i movimenti in quanto spesso sono fisicamente connessi con il computer, e in genere non sono in grado di fornire la posizione relativa della mano nello spazio, di Dario D'Ambruoso 1 GRI: Gestures Recognition Interface Capitolo 1: Caso di studio - Il fine a meno che non siano dotati di sofisticati (e costosi) sensori per il rilevamento della posizione. Il fatto che l'utente debba essere costretto ad indossare un guanto, rende proponibile l'utilizzo di questo dispositivo di input solo per limitate applicazioni di uso specialistico, come ad esempio nella realtà virtuale, oppure nei casi in cui è necessario conoscere l'esatto angolo formato dalle articolazioni delle dita. A dimostrazione di ciò vi _e lo scarso successo ottenuto da applicazioni come quella di Thomas Baudel, dove viene utilizzato un DataGlove per controllare la proiezione di slides durante una presentazione. Se vogliamo sfruttare l'uso dei gesti anche per applicazioni di carattere generico, in cui non c'è la necessità di descrivere un modello completo della mano, bisogna trovare un'altra soluzione in cui l'utente non debba essere costretto ad interagire in maniera “innaturale", senza quindi utilizzare nessun guanto o accessorio simile. IL FINE In relazione a quanto detto nell’introduzione, lo scopo di questo lavoro di ricerca è quello di sviluppare un sistema per il riconoscimento di comandi gestuali basato sul riconoscimento visuale dei gesti delle mani, piuttosto che dai segnali provenienti dai sensori collegati ad un guanto. L'attuale tecnologia di Computer Vision ci offre la possibilità di analizzare le immagini di una data scena e riconoscerne il contenuto. Sistemi di questo tipo sono già in uso in svariati campi, fra i quali la robotica, il riconoscimento ottico di caratteri, il riconoscimento di obbiettivi strategici durante i voli di ricognizione di aerei militari, l'automazione industriale ecc. Il successo ottenuto dalla Computer Vision in questi campi ci suggerisce quindi di realizzare un sistema per il riconoscimento dei gesti mediante tecniche di visione. Utilizzando una telecamera per riprendere le pose della mano, e un sistema di riconoscimento affidabile che sia in grado di ricavare dalle immagini una determinata posa (e quindi associargli un significato), le potenzialità del sistema diventano molteplici. In questo modo l'utente non deve essere fisicamente connesso con il computer da un cavo e, soprattutto, non deve essere costretto ad acquistare un hardware particolare, sarà sufficiente una comune web cam. Questo progetto esamina la possibilità di riconoscere comandi gestuali della mano, dove la scena ripresa dalla cam è assolutamente indifferente, purché presenti le mani. Per meglio chiarire la questione, si rimanda alle sezioni successive. Gli sviluppi attuali nello studio di interfacce gestuali mostrano numerose soluzioni che necessitano di un hardware speciale, magari di prestazioni elevatissime. Questo lavoro presenta un applicativo progettato ed implementato, in grado di riconoscere comandi gestuali dall'analisi della posa statica della mano che prescinda dalle specifiche spaziali di traslazione, scala e rotazione. Chiameremo quindi comandi statici una particolare configurazione della mano rilevata in un istante di tempo (ad esempio il pollice sollevato, oppure mostrare il palmo della mano aperto per dire “stop"). Per far ciò il sistema deve riuscire a discriminare fra un determinato set di pose della mano. Un comando statico quindi non tiene conto della dinamica del movimento della mano. Chiameremo invece comandi dinamici della mano (nello specifico la variazione della posizione di questa nello spazio), un particolare movimento assolutamente naturale che ci permette di impartire le specifiche relative al comando statico assegnato. In questo lavoro di ricerca ci limitiamo all'analisi di comandi statici. Riassumendo, in conclusione l’applicativo qui presentato è in grado di riconoscere una serie di gesti, e di navigare all’interno di oggetti 3D, fornendo all’utente un’interfaccia del tutto innovativa, oltre che divertente e interessante. di Dario D'Ambruoso 2 GRI: Gestures Recognition Interface Capitolo 1: Caso di studio - Specifiche da soddisfare SPECIFICHE DA SODDISFARE Nell'ambito della Human Computer Interaction i sistemi comandati da gesti della mano vengono accettati come pratica di comunicazione con i computer solo se soddisfano le seguenti caratteristiche: il riconoscimento deve avvenire in maniera real-time: i sistemi che non agiscono in tempo reale sono molto utili per l'analisi, ma inadeguati come interfaccia componente di uno strumento di interazione uomo-macchina; la discriminazione fra un vocabolario di gesti deve essere efficiente : ogni istanziazione di gesto deve avere delle caratteristiche uniche che lo distinguano dagli altri; deve esistere un feedback continuo all'utente durante la composizione del gesto : l'utente ha la necessità di un feedback da parte del sistema che lo aiuti e lo segua nella composizione del gesto. Ad esempio un feedback sintattico, come ad esempio il cambiamento della forma del cursore, potrebbe informare l'utente sullo stato di riconoscimento del sistema. Oppure un feedback semantico, tipo il cambio dello stato di un'icona, può rendere visibile all'utente quale è stato il comando interpretato dal sistema, quindi l'azione che si sta eseguendo; il sistema deve essere “non intrusivo": niente guanti o device strani dovranno essere indossati dall'utente. Vedremo in seguito come la soluzione proposta da questa ricerca rispetti tutte queste caratteristiche. CAMPI D’APPLICAZIONE Questo tipo di interfacce basate sul riconoscimento visuale di un linguaggio gestuale, possono essere sfruttate in un vasto numero di applicazioni, fra cui: 1. applicazioni di “Augmented Reality": in tale settore, derivato dalla ben più nota Realtà Virtuale, convergono nuovi studi che mirano ad applicare nei calcolatori paradigmi di interazione tipicamente umani; 2. disegno di interfacce multimodali: nelle interfacce in cui l'interazione con l'utente si basa solo sul riconoscimento vocale di un comando, è difficile distinguere tra comandi a voce indirizzati al sistema e espressioni rivolte a qualcun'altro. L'interpretazione dell'immagine fornita dal nostro modello può essere usata per rilevare l'intenzionalità di un comando vocale. La combinazione di comandi gestuali con comandi vocali permette di realizzare un sistema più affidabile di un altro costruito solo con un tipo di comando: il linguaggio parlato completa il sistema offrendo la possibilità di definire nozioni astratte, la gestualità completa il sistema offrendo la possibilità di esprimere informazioni geometriche; 3. controllo di unità domestiche: controllare device domestici o di ufficio a distanza: si può pensare ad un insieme di telecamere connesse ad un controllore centralizzato, posto a catturare ogni comando, e riconoscere l'intento di usare ogni device tipo TV, hi-fi, segreteria telefonica ecc. Questo eviterebbe pure l'inconveniente dell'utilizzo di telecomandi, che sono sempre ingombranti, poco maneggevoli, e ... non si trovano mai quando servono; 4. utilizzo in “information-point": un'applicazione molto utile di tali sistemi potrebbe essere quella di sfogliare le pagine di un information point tramite gesti. L'approccio più naturale e stimolante dei comandi gestuali piuttosto che della classica tastiera (perennemente guasta), riuscirebbe a coinvolgere un numero maggiore di persone; 5. controllo di strumenti per presentazioni: mediante l'uso di gestualità, un utente che sta eseguendo una presentazione può controllare la proiezione di diapositive o di slides in modo naturale; inoltre viene lasciato libero di concentrarsi sulla presentazione perché non deve far uso di telecomandi o tastiere; 6. applicazioni di telepresenza: i devices utilizzati per controllare i robot, quali joysticks, leve, ecc. sono inadeguati per la manipolazione simultanea di più di tre gradi di libertà. In un ambiente remoto, magari ostile, sistemi controllati manualmente possono essere necessari per eseguire operazioni complesse. Le interfacce gestuali possono risolvere il problema cognitivo di mappare i movimenti delle mani con azioni da far compiere all'operatore remoto. Come vedremo in seguito molte di queste possono già essere considerate realizzate in questo tool. di Dario D'Ambruoso 3 GRI: Gestures Recognition Interface Capitolo 1: Caso di studio - Stato dell’arte e idee STATO DELL’ARTE E IDEE I gesti sono un'estensione del linguaggio umano, indipendente dal linguaggio utilizzato dagli interlocutori. È come un linguaggio universale con scopi differenti: per questo risulta utile per identificare e comprendere il linguaggio del corpo. Questo risulta abbastanza banale, se solo si pensa al modo in cui si gesticola quando si parla, come studiato in [1]. Usando le mani come “supporto”, o “device“ (come già detto in precedenza) si fornisce all’utente un esperienza molto naturale, in quanto si sfrutta un’abitudine radicata nel proprio essere. Ci sono molti diversi approcci utilizzati al fine di riconoscere i movimenti e i gesti delle mani, alcuni di essi, come già detto, ad esempio, richiedono l'uso di guanti specifici o e diversi tipi di hardware ottici e non, molto sofisticati, e costosi. Tutti questi approcci sono considerati abbastanza invasivi da parte degli utenti, ed è per questo che non vengono spesso utilizzate per applicazioni generali o applicazioni che coinvolgono molte persone. D'altra parte, tecniche come Computer Vision, sfruttando in tempo reale le immagini o parti di video, hanno un utilizzo più ampio perché sono meno invasive, anche se hanno dei limiti e/o problemi. In questi sistemi, la rappresentazione 2d della mano rende il problema più difficile da risolvere, rispetto ad altri problemi simili, perché stiamo parlando di un “oggetto” articolato e con una struttura che può cambiare posa e forma nel tempo. Inizialmente si era pensato di realizzare un classificatore per riconoscere i gesti, e prima ancora la mani, quindi l’idea era essenzialmente di realizzare una rete che riconoscesse all’interno della scena le due mani, separando la destra dalla sinistra, quindi inviare queste informazioni ad un altro classificatore, addestrato a riconoscere il gesto. Quindi si è iniziato l’addestramento del classificatore, utilizzando [2], una serie di database, usati in [3] contenenti: 1. Immagini di 10 differenti pose della mano, realizzate da 24 soggetti con 3 differenti sfondi, quindi situazioni statiche; FIGURA 2: SEBASTIEN MARCEL STATIC HAND POSTURE DATABASE 2. Sequenze video di mani dinamiche di 50 soggetti; FIGURA 3: SEBASTIEN MARCEL DYNAMIC HAND POSTURE DATABASE In aggiunta a questi due, per rendere il classificatore ancora più robusto si è pensato di considerare anche [4], usato in [5]: 3. 800 video rappresentanti il linguaggio dei segni americano. Tuttavia ci si è scontrati con la realtà abbastanza dura, in quanto la mano è un “oggetto” estremamente deformabile, oltre che soggetto a diversi fattori che la rendono estremamente variabile, soprattutto se valutato nell’ottica di questo lavoro. Quindi l’idea successiva si è anche pensato di addestrare un classificatore in grado di riconoscere, il polso, tuttavia anche in questo caso ci sarebbero stati moltissimi limiti relativi alla posizione della mano d’avanti alla cam. Quindi si è optato per la soluzione descritta di seguito. di Dario D'Ambruoso 4 GRI: Gestures Recognition Interface Capitolo 1: Caso di studio - Stato dell’arte e idee Le idee fondamentali di utilizzo su cui si basa questo lavoro sono essenzialmente due: 1. Cadding immersivo 3D con le sole mani: l’utente, munito di occhiali per il 3D realizza progetti di ogni tipo, dal design di autoveicoli, ad edifici, con il solo utilizzo delle mani, al momento ricerche in atto utilizzano guanti, tablet e penne digitali, oppure del wiimote, si pensi al progetto portato avanti dal Consorzio CETMA di Brindisi: FIGURA 4: CAD IMMERSIVO CON TABLET FIGURA 5: CAD IMMERSIVO REALIZZATO AL CETMA 2. Utilizzo vero e proprio del PC, ovviamente per guidare le presentazioni, o in modalità immersiva, per un qualsiasi altro motivo utile: FIGURA 6: CONCEPT DI INTERFACCIA DI ULTIMA GENERAZIONE di Dario D'Ambruoso 5 GRI: Gestures Recognition Interface Capitolo 1: Caso di studio - Stato dell’arte e idee Al momento in commercio esistono, oltre alle citate (Kinect e wiimote solo per scopo ludico) tecnologie, anche delle altre, che consentono di interpretare in qualche modo i gesti, ed altro relativamente alle mani. Si passerà brevemente in rassegna parte di quanto offerto dal mercato [6]: 1. Immersion CyberGlove II: guanto costruito con tessuto elasticizzato, wireless. Questo fornisce fino a 22 misurazioni angolari, utilizza una tecnologia resistiva, proprietaria, per riportare, e quindi riconoscere in tempo reale le variazioni di posa della mano: FIGURA 7: IMMERSION CYBERGLOVE II 2. X-ISTS Data Glove: guanto economico, con connessione cavo. Questo fornisce una soluzione economica per il rilevamento della posa delle mani, i sensori riescono a valutare la posizione di ogni singolo dito, e addirittura l’angolo di inclinazione dello stesso, oltre che della mano. In aggiunta presenta anche dei sensori tattili in grado di rilevare il tocco di un oggetto: FIGURA 8: X-ISTS DATA GLOVE 3. Measurand ShapeHand, ShapeHandPlus & ShapeClaw: sistema wireless di motion capture, ovviamente relativo alla mano. I sensori flessibili fisicamente incorporati nel guanto riescono a riconoscere qualsiasi forma assunta dalla mano. Presenta anche sensori di movimento: FIGURA 9: MEASURAND SHAPEHAND, SHAPEHANDPLUS & SHAPECLAW di Dario D'Ambruoso 6 GRI: Gestures Recognition Interface Capitolo 1: Caso di studio - Stato dell’arte e idee 4. Immersion Haptic Workstation: una vera e propria stazione di lavoro tattile, estremamente innovativa. Si tratta di un sistema di simulazione completamente integrato, con un ritorno dinamico di forza, permette di manipolare, creare oggetti e ambientazioni 3D, oltre che navigarci dentro: FIGURA 10: IMMERSION HAPTIC WORKSTATION Risulta alquanto ovvio che questi dispositivi oltre che costosi, alcuni ingombranti, risultino anche estremamente invasivi. Lo scopo che ci si è posti in questo lavoro era quello di realizzare (in piccolo) un sistema che sopperisse quasi completamente a quanto mostrato sin qui. È tuttavia evidentemente ovvio che il sistema realizzato in questo lavoro di ricerca non è paragonabile in termini di prestazioni, affidabilità e precisione, ma al contempo mette su delle ottime basi per lo sviluppo di un sistema completamente (ritorno dinamico di forza escluso) sostitutivo a quelli visti sin qui. di Dario D'Ambruoso 7 GRI: Gestures Recognition Interface Capitolo 2: Progettazione - Work-flow CAPITOLO 2: PROGETTAZIONE WORK-FLOW In questa sezione entro nel vivo della questione, spiegando quali sono a grandi linee il work-flow dell’applicativo, per poi entrare nelle sezioni seguenti maggiormente nel dettaglio, per far questo mi servirò di uno schema riportato qui di seguito. Acquisizione Riconoscimento comandi statici d-s Riconoscimento comandi dinamici Attuazione comando d(x,y) - s(x,y) FIGURA 11: WORKFLOW GENERALE Come mostrato quindi, l’elaborazione si suddivide in quattro macro-fasi: 1. Acquisizione da sensore video: dal sensore connesso al pc vengono prelevati di seguito i frame, e immessi in un buffer, del quale è possibile specificare la dimensione. È inoltre possibile pulire ripulire il buffer, cliccando sull’opportuno pulsante. Ancora il buffer sarà automaticamente ripulito qualora risulti troppo pieno, al fine di rendere l’elaborazione fluida quanto più vicina al real time; 2. Riconoscimento di comandi statici: fase più impegnativa, il cuore del tool, in questa i diversi thread competono al fine comune di riconoscere i comandi statici. È da precisare, che questa fase resta comunque latente, estendendosi anche al di sotto della successiva; 3. Riconoscimento dei comandi dinamici: fase in cui viene “inseguito” il centro di massa di ogni mano, al fine di riconoscere l’entità della trasformazione che l’oggetto 3D subirà nella fase successiva; 4. Attuazione del comando: fase in cui l’oggetto 3D viene ingrandito, ruotato, traslato, sostituito (in funzione del comando statico 2), di una certa quantità (in funzione del comando dinamico 3). Spiegheremo in dettaglio tre dei quattro punti qui elencati nelle sottosezioni, mentre discorso a parte, merita il punto 2, sia per complessità, che per lunghezza. di Dario D'Ambruoso 8 GRI: Gestures Recognition Interface Capitolo 2: Progettazione - Work-flow ACQUISIZIONE DA SENSORE VIDEO L'acquisizione delle immagini può essere eseguita automaticamente da un hardware dedicato, precisamente da una web cam e una scheda video a basso costo. La scheda video preleva il segnale composito proveniente da una cam che riprende la scena dell'immagine, e converte questo segnale analogico in 3 matrici (una matrice per la componente luminanza e due per le componenti crominanza). L'immagine viene suddivisa in piccole regioni, chiamate pixel, individuati nella matrice da un numero di riga e un numero di colonna. Ad ogni pixel viene associato un valore che corrisponde all'intensità della componente del colore della relativa matrice, nell'area elementare corrispondente. RICONOSCIMENTO DEI COMANDI DINAMICI Riconosciuto il comando statico (per la spiegazione si rimanda alla sezione successiva) riconoscere il comando dinamico risulta essere abbastanza banale. In pratica per ogni frame, viene seguito il centro di massa delle due mani. A prescindere dal comando statico, per ognuna di queste coppie (di centri di massa) vengono calcolati una serie di valori: 1. L’angolo α compreso fra i due centri di massa; 2. La distanza 𝑑 fra le due mani; 3. Il rapporto 𝑓𝑎𝑐𝑡𝑜𝑟 fra i due rettangoli (Destra e Sinistra) che racchiudono le mani; 4. Le coordinate 𝑥, 𝑦 dei centri di massa; 𝑥 𝑑 α Sinistra Destra 𝑦 FIGURA 12: RICONOSCIMENTO COMANDI DINAMICI Quindi in base al comando statico, si applicherà una rotazione α, o un fattore di scala 𝑑, e via dicendo. Il sistema di riferimento in puro stile OpenCV è posto come in figura, ovvero specchiato, rispetto alla situazione destra/sinistra, e con l’asse delle ordinate ribaltato. di Dario D'Ambruoso 9 GRI: Gestures Recognition Interface Capitolo 2: Progettazione - Riconoscimento dei comandi statici ATTUAZIONE DEL COMANDO Quando il comando statico, e dinamico sono stati recepiti, l’oggetto 3D con l’ausilio delle librerie OpenGL viene deformato in tempo reale, per cui l’utente, muovendo le mani, riesce a traslare, ruotare, avvicinare/allontanare, e perfino cambiare oggetto, scegliendo fra un set di 3 oggetti differenti. RICONOSCIMENTO DEI COMANDI STATICI Il vero e proprio cuore dell’applicazione verrà qui descritto, iniziamo rappresentando schematicamente cosa accade, in quanto ritengo che gli schemi siano sempre più esplicativi rispetto al testo semplice. Copia in B&W Copia a colori Face Detecion Skin Detection Nota la posizione del volto, viene oscurato. di Dario D'Ambruoso 10 GRI: Gestures Recognition Interface Capitolo 2: Progettazione - Riconoscimento dei comandi statici Il frame è suddiviso in due parti elaborate separatamente. FIGURA 13: RICONOSCIMENTO GESTI STATICI Rifacendoci allo schema di sopra, notiamo che dopo aver acquisito il frame, abbiamo i seguenti passaggi: 1. Skin Detection: ci si avvale di una conversione nello spazio dei colori, passando dall’RGB, in HSV (descritto in appendice: Spazio HSV), spazio meno sensibile alla luminanza. Dopo la conversione, si sostituisce con un pixel bianco ogni pixel il cui valore in ognuno dei tre canali H, S, e V, è sinonimo di possibile presenza di pelle, mentre un pixel nero lo si sostituisce a tutti gli altri non verificanti la condizione. Si noti come dalla figura il volto non viene riconosciuto come pelle, questo è ottenuto utilizzando a monte un face detector, l’haarcascade (descritto in appendice: Il classificatore di Haar), il quale, riconosciuto il volto, mi permette di oscurarlo, ponendoci sopra un rettangolo completamente di Dario D'Ambruoso 11 GRI: Gestures Recognition Interface Capitolo 2: Progettazione - Riconoscimento dei comandi statici nero, questa preelaborazione mi consente di evitare problemi, e quindi confondere il volto con le mani. Ancora, a monte di tutto questo applico un filtro blur, per ripulire il frame dal rumore, che a causa del mio pessimo sensore, è visibilissimo nelle immagini colorate, rispetto a quella binarizzata; h_max = 20; h_min = 0; s_max = 150; s_min = 30; v_max = 255; v_min = 80; Mat Kernel(Size(3, 3), CV_8UC1); Kernel.setTo(Scalar(1)); cvtColor(frame,this->hsv,CV_BGR2HSV,3); inRange(this->hsv,hsv_min, hsv_max, this->img2); dilate(this->img2, this->img2, Kernel,Point(-1,-1), 1); medianBlur(this->img2,this->img2, 3); Si nota dal frammento codice riportato come vengano settati i valori massimi e minimi per ognuno dei 3 canali dello spazio HSV, e che dopo la conversione, si verifica che ogni singolo pixel appartenga a quel dominio. Si può anche notare come, per evitare di ottenere contorni aperti, e che non delimitassero bene la mano, a causa della variabilità della luce, e del colore della pelle, vi è anche un ciclo di dilatazione con un kernel 3x3; 2. Hand recognition: in questa fase il frame viene processato a caccia delle mani, quindi si ricercano le aree più grandi maggiormente connesse, per cui tutto il rumore dovuto, in questo caso alla mia maglietta, o ad una piccola porzione di collo visibile, sarà escluso, ed ad essere contornate, saranno proprio le mani. Oltre a riconoscere le mani, in questa fase, si studiano le convessità, e le concavità del contorno tracciato, con il fine ultimo di contare le dita mostrate. Se queste risultano ben separate, saranno riconosciute, altrimenti, saranno identificate come un unico dito; … … … cvCanny(img, img, 1, 3, 5); cvFindContours( img, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) ); … … … hull = cvConvexHull2( &handContourn, storage2, CV_COUNTER_CLOCKWISE, 0); def = cvConvexityDefects( &handContourn, hull, storage3 ); … … … … gestures[i].score=cvMatchShapes( &handContourn, gestures[i].shape , 2, 0 ); … … … reco=i; 3. Gestures recognition: a questo punto il carico una serie di template, riportati qui di seguito, ne prelevo i contorni, e a tutti i contorni, inclusi quelli reali relativi al frame attuali, applico i momenti di Hu (descritti in appendice), a questo punto otterrò uno score, per ogni confronto fra i reali ed i di Dario D'Ambruoso 12 GRI: Gestures Recognition Interface Capitolo 2: Progettazione - Riconoscimento dei comandi statici template. Seleziono i cinque con score migliore, e verifico che fra questi vi sia una possibile soluzione, e fra le possibili prelevo quella con score migliore. Per possibile soluzione intendo che verifico che fra i template selezionati, ve ne sia almeno uno con lo stesso numero di dita calcolato in real time. Questa logica mi permette di rendere ancora più robusto il riconoscimento dei comandi statici. FIGURA 14: TEMPLATE di Dario D'Ambruoso 13 GRI: Gestures Recognition Interface Capitolo 2: Progettazione - Interazione INTERAZIONE Il funzionamento dell’applicativo risulta essere abbastanza intuitivo. Per renderlo robusto, si è pensato di separare il comando statico dal comando dinamico, ovvero, non appena il comando statico viene riconosciuto (l’utente lo può notare dall’accensione della relativa “icona”) non si è più vincolati a mantenere le mani nella “forma” relativa al comando, ma si è liberi, anche di muoverle nello spazio per realizzare la dinamica e l’interazione effettiva. Fino a quando l’utente non mostrerà il gesto di “reset”, che consentirà al sistema di sbloccare la ricerca relativa al comando statico, facendola quindi riprendere fino al riconoscimento del comando successivo. Il sistema è in grado di riconoscere ben 13 geti per mano, fornendo dunque 2 ∗ 13 = 26 comandi statici possibili, anche se si è scelto di realizzarne solo 6 per scopo esclusivamente dimostrativo. In oltre il sistema potrebbe essere arricchito di altri gesti, che non si sono considerati, ampliando ulteriormente il numero di comandi possibili di un fattore 2 per ogni gesto in più. Si riportano di seguito i gesti riconosciuti. FIGURA 15: COMANDI STATICI RICONOSCIUTI di Dario D'Ambruoso 14 GRI: Gestures Recognition Interface Capitolo 3: Implementazione - Introduzione CAPITOLO 3: IMPLEMEN TAZIONE INTRODUZIONE In questo capitolo vengono presentanti alcuni dettagli tecnici sull'implementazione dell'algoritmo di riconoscimento dei gesti. L'algoritmo sviluppato in questo lavoro è stato implementato utilizzando il linguaggio di programmazione C++. Dopo aver presentato gli strumenti utilizzati per lo sviluppo, vengono introdotte, le altre librerie utilizzate. Quasi l'intero processo di sviluppo del tema è stato portato avanti con strumenti di lavoro open source. Infatti si è scelto di utilizzare un sistema operativo di tipo GNU/Linux e altri applicativi liberi come Qt Creator per lo sviluppo software. GNU LINUX GNU/Linux è un sistema operativo libero di tipo Unix (o Unix-like), distribuito con licenza GNU/GPL, costituito dall'integrazione del kernel Linux all'interno del sistema GNU (acronimo ricorsivo che sta per Gnu is Not Unix). La forma Linux (senza prefisso "GNU/") è ritenuta da alcuni scorretta perché si limita a indicare il solo kernel. Un sistema GNU/Linux include il principale software GNU e molti altri pacchetti, ad esempio l'X-Window System e TEX, che non sono software GNU, e alcuni programmi e librerie provenienti dal progetto BSD. La presenza di una soluzione del genere ha permesso di colmare la lacuna lasciata da HURD, il kernel sviluppato in seno al progetto GNU, che non è riuscito ad arrivare a uno stadio di completezza soddisfacente. Fino a poco tempo fa (e in alcune distribuzioni ancora oggi), chi utilizzava GNU/Linux doveva possedere una solida cultura informatica di base ed essere in grado all'occorrenza di installare, configurare e aggiornare autonomamente il proprio sistema. Con l'adozione del sistema da parte di molte aziende sono stati creati programmi di installazione e manutenzione che non richiedono conoscenze tecniche così approfondite per l'utilizzo di GNU/Linux; questi programmi hanno aperto la strada all'ingresso di GNU/Linux all'interno del mercato desktop. Esistono distribuzioni che si avviano da CD (detti Live CD) e che funzionano senza bisogno di installazione su disco fisso, come ad esempio Knoppix e Morphix. Sono stati poi creati sistemi di avvio da rete o (per un uso limitato, ad esempio per ripristinare un sistema non funzionante) da dischetto floppy. GNU/Linux è anche un componente indispensabile del software per server LAMP che ha raggiunto un'ampia popolarità tra gli sviluppatori web. Con l'evoluzione di ambienti desktop come KDE e GNOME, il sistema offre una interfaccia grafica simile per facilità e comodità d'uso a quella di Microsoft Windows o di Mac OS X, più vicina alle esigenze degli utenti meno esperti, rendendo il passaggio da un sistema all'altro meno traumatico e garantendo un'elevata personalizzabilità dell'interfaccia. FIGURA 16: UBUNTU TUX LOGO La distribuzione utilizzata nel lavoro di questa tesi è stata Ubuntu 10.10 64bit. di Dario D'Ambruoso 15 GRI: Gestures Recognition Interface Capitolo 3: Implementazione - Ambiente di sviluppo AMBIENTE DI SVILUPPO Qt Creator da pronunciare "cute" creator, appunto, è l’ambiente di sviluppo software di Nokia basato su un insieme di librerie multipiattaforma e multipourpose, si va dalle librerie di gestione delle GUI fino a quelle per i database passando per network, animazioni e multithread. Originariamente sviluppato dalla Norvegese Trolltech (acquistata da Nokia nel 2008) permette lo sviluppo di applicazioni per Ms Windows, UNIX/Linux, Mac OS X, Embedded Linux, Windows CE/Mobile, Symbian e presto anche Maemo. I linguaggi di programmazione più comunemente impiegati sono C++ e Python. Sono inoltre disponibili diversi bindings per altri linguaggi. FIGURA 17: QT CREATOR LOGO Qt-Italia.org è il sito della community Qt in lingua italiana, i cui principali obiettivi sono: creare un luogo di incontro tra chi sviluppa, usa e gestisce progetti che impiegano il Qt Application Framework, diffondere la filosofia Open Source, contribuire alla traduzione delle librerie e strumenti di sviluppo software Qt, eseguire il porting su nuove piattaforme e promuovere chi realizza soluzioni innovative. di Dario D'Ambruoso 16 GRI: Gestures Recognition Interface Capitolo 3: Implementazione - OpenCv OPENCV Per l’elaborazione delle immagini, l’interfacciamento con il sensore, e qualsiasi altra cosa inerente ad esse, si è utilizzata la libreria OpenCV. FIGURA 18: OPENCV LOGO Questa è strutturata in cinque sott o librerie ( dette anche moduli) ciascuna co n funzionalità specifiche. Il modulo CXCORE è quello principale nonché indispensabile. Contiene le strutture dati di base con le rispettive funzioni di inizializzazione, le funzioni matematiche, le f unzioni di lettura, scrittura e memorizzazione dati, le funzioni di sistema e di gestione degli errori. Il modulo CV contiene le funzioni relative all’image processing, le funzioni di analisi strutturale e del moto, di object detection e ricostruzione 3D. HIGHG UI contiene le funzioni G UI e quelle di salvataggio e caricamento immagini, nonché le funzioni di acquisizione video e di g est io ne delle telecamere. Il modulo ML ( Machine Learning ) cont iene classi e funzioni relative a ll’implementazione e gestione di reti neurali, in particolare di tipo multilayer perceptrons ( MPL ), di classificazione statistica e clustering di dati. Infine vi è il modulo CVAUX che contiene sia le funzioni basate su algoritmi ancora in fase di sperimentazione, il cui futuro è quello di migrare nel modulo CV, e sia le funzioni considerate obsolete e quindi non più supportate. Le funzionalità di tale modulo sono rivolte alla corrispondenza stereo, al tracking 3D, al riconoscimento degli oggetti. di Dario D'Ambruoso 17 GRI: Gestures Recognition Interface Capitolo 3: Implementazione - OpenGL OPENGL Per la gestione degli oggetti 3D ho utilizzato le librerie OpenGL, dopo aver attivato il supporto delle stesse in Qt. OpenGL (Open Graphics Library) è una specifica che definisce una API per più linguaggi e per più piattaforme per scrivere applicazioni che producono computer grafica2D e 3D. L'interfaccia consiste in circa 250 diverse chiamate di funzione che si possono usare per disegnare complesse scene tridimensionali a partire da semplici primitive. Sviluppato nel 1992 dalla Silicon Graphics Inc., è ampiamente usato nell'industria dei videogiochi (nella quale compete con DirectX su Microsoft Windows), per applicazioni di CAD, realtà virtuale, e CAE. È lo standard di fatto per la computer grafica 3D in ambiente Unix. FIGURA 19: OPENGL LOGO OpenGL assolve a due compiti fondamentali: nascondere la complessità di interfacciamento con acceleratori 3D differenti, offrendo al programmatore una API unica ed uniforme; nascondere le capacità offerte dai diversi acceleratori 3D, richiedendo che tutte le implementazioni supportino completamente l'insieme di funzioni OpenGL, ricorrendo ad un'emulazione software se necessario. Il compito di OpenGL è quello di ricevere primitive come punti, linee e poligoni, e di convertirli in pixel (rasterizing o rasterizzazione). Ciò è realizzato attraverso una pipeline grafica nota come (EN) OpenGL state machine. La maggior parte dei comandi OpenGL forniscono primitive alla pipeline grafica o istruiscono la pipeline su come elaborarle. Prima dell'introduzione di OpenGL 2.0, ogni stadio della pipeline realizzava una funzione fissa ed era configurabile solo entro certi limiti, ma dalla versione 2.0 molti stadi sono totalmente programmabili attraverso il linguaggio GLSL. OpenGL è una API procedurale che opera a basso livello, che richiede al programmatore i passi precisi per disegnare una scena. Questo approccio si pone in contrasto con le API descrittive ad alto livello le quali, operando su struttura dati ad albero (scene graph), richiedono al programmatore solo una descrizione generica della scena, occupandosi dei dettagli più complessi del rendering. La natura di OpenGL obbliga quindi i programmatori ad avere una buona conoscenza della pipeline grafica stessa, ma al contempo lascia una certa libertà per implementare complessi algoritmi di rendering. di Dario D'Ambruoso 18 GRI: Gestures Recognition Interface Capitolo 3: Implementazione - Interfaccia Grafica INTERFACCIA GRAFICA L'interfaccia grafica è stata realizzata con l'uso della libreria Qt. FIGURA 20: QT LIB LOGO Qt è una libreria multi piattaforma per lo sviluppo di programmi con interfaccia grafica tramite l'uso di widget. Qt. Qt, come detto precedentemente si dovrebbe pronunciare come l'inglese cute, cioè "carino". La pronuncia in grafia italiana è chiùt, anche se la pronuncia più intuitiva cuttì non è rara (parallelamente, esiste la pronuncia inglese chiuttì). Qt usa una versione estesa del linguaggio C++, ma esistono interfacce per Java, Python, C e Perl. Gira sulle piattaforme principali ed integra funzioni per l'accesso ai database SQL, parsing di documenti XML ed API multi piattaforma per l'uso dei file. Le librerie Qt sono disponibili per queste piattaforme: Qt/X11 per X Windows System (GNU/Linux); Qt/Mac per Mac OS X di Apple; Qt/Windows per Microsoft Windows; Qt/Embedded per piattaforme embedded (palmari e simili). Attualmente vengono offerte quattro edizioni, disponibili per ciascuna delle piattaforme: Qt Console: versione embedded per lo sviluppo senza interfaccia grafica; Qt Desktop Light: versione base per applicazioni con interfaccia grafica, senza supporto rete e SQL; Qt Desktop: la versione complete; Qt Open Source Edition: la versione completa, per sviluppo di software libero. L'edizione utilizzata è stata ovviamente la Open Source Edition, versione 4.8.0. di Dario D'Ambruoso 19 GRI: Gestures Recognition Interface Capitolo 4: Conclusioni - Considerazioni CAPITOLO 4: CONCLUSIONI CONSIDERAZIONI Molteplici sono le considerazioni che si possono fare per quello che è stato detto sin qui. Innanzi tutto testando l’applicativo in diverse condizioni, si è verificato che il limite massimo che esso presenta è la luminosità, ma mi sembra del tutto giusto essendo un’applicazione di computer vision, è del tutto normale. D’altro canto posso asserire che il sistema è molto robusto, perché nonostante la scarsissima qualità del sensore, oltre allo stato di usura completa dello stesso, causa dell’eccessivo rumore nelle riprese, l’applicativo ne risente pochissimo. Sicuramente uno degli sviluppi futuri potrebbe essere relativo alla sostituzione completa dell’oggetto 3D interno GUI con un vero e proprio applicativo di CAD. Si è provato anche ad utilizzare i gesti per simulare lo spostamento del mouse e i click dello stesso, interfacciandosi direttamente con le X11 lib, tuttavia i notevoli problemi riscontrati, causa del sistema operativo hanno reso impossibile l’implementazione completa. GUI La GUI molto intuitiva si presenta come segue. FIGURA 21: VISIONE GLOBALE DELL'INTERFACCIA Nella quale distinguiamo le seguenti aree che andremo a descrivere di seguito: di Dario D'Ambruoso 20 GRI: Gestures Recognition Interface Capitolo 4: Conclusioni - GUI FIGURA 22: GUI - FRAME AREA Un’area in cui sono mostrati i frame in real-time, con in evidenza i contorni delle mani, se riconosciuti. FIGURA 23: GUI - STATISTICS AREA Un’area in cui vengono visualizzate le statistiche sull’occupazione, e dimensione del buffer, oltre che alla risoluzione di cattura, processing, e capture rate. Inoltre vi è anche un pulsante per svuotare manualmente il buffer. FIGURA 24: GUI - INTERACTIVE AREA Una serie di pulsanti, inteliggentemente organizzati: 1. Open Cam: aprire la cam; 2. Close Cam: chiudere la cam; 3. Settings: apre una dialog della quale parlerò in seguito; 4. Find: attivare e disattivare il ritrovamento delle mani; 5. Navig ON/OF: attivare e disattivare la navigazione dell’oggetto 3D; 6. About: avere informazioni relative alla versione dell’applicazione, e l’autore; 7. Exit: chiudere l’applicazione ed uscire; Nello specifico sono settate le seguenti regole, gli unici pulsanti sempre attivi sono il 6 ed il 7, mentre l’1 viene disattivato alla pressione, perché è possibile avere aperta una sola istanza di cam per volta, nel momento in cui la cam viene aperta quindi, i pulsanti inibiti 2, 3, e 4, sono attivati, questo non accade per il 5, che viene attivato solo quando è attivo il ritrovamento delle mani, quindi è stato premuto il 4. Cliccando sul 3 si aprirà una dialog, come quella mostrata in figura, con i valori di default che realizzano lo skin detection. L’utente potrà variare tali valori, per rendere il detector funzionante in quasi tutte le condizioni di luce. di Dario D'Ambruoso 21 GRI: Gestures Recognition Interface Capitolo 4: Conclusioni - GUI FIGURA 25: GUI - DIALOG nel momento in cui la dialog si apre, immediatamente nella Frame area, viene visualizzato il risultato dello skin detection come mostrato di seguito FIGURA 26: GUI - FRAME AREA CON SKIN DETECTION le variazioni che l’utente esegue nei settaggi, producono un risultato in tempo reale, ponendo lo stesso in condizione di decidere se il settaggio è soddisfacente, e quindi applicarlo premendo il pulsante “OK”, oppure, annulare premendo “Cancel”. FIGURA 27: GUI - 3D AREA Un’area in cui sono visualizzati oggetti in 3D e le relative azioni (realizzate con le mani), in tempo reale. di Dario D'Ambruoso 22 GRI: Gestures Recognition Interface Capitolo 4: Conclusioni - GUI FIGURA 28: GUI - ACTION AREA Un’area con l’elenco dei comandi previsti dal sistema, con relativa spiegazione. Il comando attivato, sarà evidenziato dal colore verde, per cui l’utente avrà sempre un feedback, oltre che sull’oggetto 3D, anche sull’area comandi. FIGURA 29: GUI - GESTURES AREA (DEFAULT) Un area in cui verrà evidenziato il comando statico riconosciuto, se riconosciuto, oppure se non riconosciuto un punto interrogativo. Oltre a questo nell’area centrale l’utente viene informato se il tool è a “caccia” del comando dinamico, presentando come in figura un’animazione di ricerca, oppure se il comando statico è stato riconosciuto, e si sta eseguendo l’azione con un’altra animazione. FIGURA 30: GUI - GESTURES AREA (WATING FOR COMMAND) di Dario D'Ambruoso 23 GRI: Gestures Recognition Interface Capitolo 4: Conclusioni - Risultati RISULTATI L’ottimo lavoro svolto è ben visibile dalle seguenti immagini che rappresentano il tool in funzione. FIGURA 31: TOOL IN FUNZIONE ROTAZIONE X Si noti la rotazione rispetto all’ase x, ottenuta dopo il riconoscimento del gesto in evidenza nell’area dei comandi. Ancora, si veda l’oggetto 3D, nello specifico un bicchiere contenente del cappuccino, ruotare in funzione della posizione delle mani, nonostante i gesti statici non siano riconosciuti. Si noti che nonostante il rumore del sensore sia elevatissimo, l’oggetto 3D riproduce fedelmente i movimenti realizzati. FIGURA 32: TOOL IN FUNZIONE ROTAZIONE Z di Dario D'Ambruoso 24 GRI: Gestures Recognition Interface Capitolo 4: Conclusioni - Risultati FIGURA 33: TOOL IN FUNZIONE TRASLAZIONE In questa immagine si nota come l’oggetto 3D viene traslato nello spazio, seguendo anche in questo caso il comando dinamico, dopo aver attivato l’opportuno comando statico, evidenziato nell’apposita area. di Dario D'Ambruoso 25 GRI: Gestures Recognition Interface Capitolo 5: Appendice - Spazio HSV CAPITOLO 5: APPENDICE SPAZIO HSV Uno spazio di colore è un insieme di colori che può essere visualizzato o riconosciuto da un dispositivo di ingresso o di uscita (come un digitalizzatore, un monitor, una stampante, ecc.). I colori di uno spazio di colore sono specificati come valori in un sistema di spazio di colore, che consiste nei valori di coordinate sui vari assi. Data la struttura dell'occhio umano, ci sono tre assi nello spazio di colore, pensati per l'osservatore umano. L'applicazione pratica di ciò è che i colori sono solitamente specificati con tre componenti (con alcune eccezioni). I sistemi di spazi di colore in uso sono tra i 30 e 40 circa. Alcuni esempi tra i più importanti sono: RGB; HSV; CMY(K); YUV; YCbCr. Lo spazio HSV è una trasformazione dello spazio RGB che descrive in modo più naturale il colore. Il nome HSV significa Hue, Saturation, Value. Lo spazio può essere rappresentato mediante un singolo e doppio cono, come mostrato in figura. La principale differenza, consiste nel fatto che in questo modello il massimo valore di saturazione ottenibile dipende dal valore di luminosità. FIGURA 34: RAPPRESENTAZIONE DELLO SPAZIO DEI COLORI HSV di Dario D'Ambruoso 26 GRI: Gestures Recognition Interface Capitolo 5: Appendice - Spazio HSV TONALITÀ Questo è il colore in sé, che risulta dalla combinazione di colori primari. Tutte le gradazioni (eccetto per i livelli di grigio) sono rappresentate in un cerchio cromatico: giallo, blu, e anche porpora, arancio, ecc. Il cerchio cromatico (o «ruota cromatica») ha valori che spaziano tra 0° e 360° (il termine «colore» viene spesso usato al posto di «tonalità». I colori RGB sono «colori primari»). SATURAZIONE Questo valore descrive quanto è pallido un colore. Un colore completamente desaturato è una tonalità di grigio. Con l'aumento della saturazione, il colore diventa più simile a una tinta pastello. Un colore completamente saturo è puro. Il valore di saturazione varia da 0 a 100, da bianco al colore puro. VALORE Questo valore descrive l'intensità luminosa. È il quantitativo di luce emessa da un colore. Quando si aumenta la luminosità del proprio schermo del computer oppure quando un oggetto colorato viene spostato da una zona in ombra ad una zona sotto il sole, si può notare un cambio di luminosità. I valori vanno da 0 a 100. I valori del pixel nei tre canali esprimono anch'essi una luminosità: «valore» nel modello di colore HSV è il massimo di questi valori elementari nello spazio RGB (scalato da 0 a 100). di Dario D'Ambruoso 27 GRI: Gestures Recognition Interface Capitolo 5: Appendice - Il classificatore di Haar IL CLASSIFICATORE DI HAAR Il classificatore Haar Cascade realizza un object detector basato sulle features di Haar. Esso è stato descritto inizialmente da Paul Viola ed in seguito perfezionato da Rainer Lienhart. Il funzionamento parte da un classificatore (per l’esattezza una cascata di classificatori elementari che lavorano sulle features Haar_like), che viene addestrato con alcune centinaia di campioni di un particolare oggetto (ad esempio un volto o una autovettura) detti esempi positivi, che vengono scalati alle stesse dimensioni, ad esempio 20x20, e con esempi negativi, ovvero immagini delle stessa dimensioni dei campioni positivi, ma che non contengono l’item da ricercare. Una volta addestrato il classificatore esso può essere utilizzato ad una regione di interesse in una immagine (delle stesse dimensioni utilizzate in fase di addestramento). Il classificatore restituisce un 1 se la regione presenta con alte probabilità l’item ricercato, 0 altrimenti. Per effettuare la ricerca di un oggetto in una immagine si può operare facendo scorrere la finestra di ricerca lungo l’immagine, ed effettuando il controllo in ogni posizione raggiunta utilizzando il classificatore. Esso viene progettato in modo da poter essere agevolmente configurato per la ricerca dell’oggetto con dimensioni differenti. Questo tipo di approccio è sicuramente più agevole che ricorrere ad un continuo resizing dell’immagine (il che richiederebbe una iterazione della procedura di scansione a differenti scale). Il termine Cascade (cascata) sta ad indicare che il classificatore consiste in stage di classificazione più semplici che vengono applicati in modo sequenziale su una ROI fino a quando ad un certo livello l’immagine candidata viene rigettata o fino a quando tutti gli stage vengono superati con esito positivo. La parola "potenziato" significa che i classificatori in ogni fase della cascata sono essi stessi strutture complesse e sono costituiti da classificatori di base utilizzando una tra quattro diverse tecniche di potenziamento (utilizzando una metodica di voto ponderato). L'algoritmo attuale per il riconoscimento di oggetti in un’immagine combina quattro componenti chiave [7]: 1. Le features Haar like [8]: FIGURA 35: FEATURES HAAR-LIKE di Dario D'Ambruoso 28 GRI: Gestures Recognition Interface Capitolo 5: Appendice - Il classificatore di Haar 2. L’immagine integrale per un rapido ritrovamento delle features. Per determinare la presenza o l’assenza di centinaia di features di Haar in ogni punto dll’immagine, anche con fattori di scala differenti Viola e Jones usano la tecnica già citata dell’immagine integrale. In generale, integrare, significa sommare piccole unità assieme, nello specifico, in questo caso, le unità sono i pixel. per ogni pixel, il valore integrale è la somma di tutti i pixel che si trovano sopra, e alla sua sinistra. quindi si parte da in alto a sinistra, e si prosegue verso il basso a destra, ottenendo l’immagine integrale in pochi passaggi; FIGURA 36: IMMAGINE INTEGRALE 3. Il metodo AdaBoost. Questo metodo di machine – learning è usato per selezionare quali features usare, e con quale livello di sogliatura; 4. Una cascata di classificatori per combinare più efficentemente le features. Per ultimo Viola e Jones combinano una serie di classificatori AdaBoost come una catena di filtri. Ogni filtro di tale catena quindi è esso stesso un classificatore AdaBoost debole. Questi filtri sono settatati al valore minimo tale da consentire la classificazione di tutti i volti presenti nel training set. Qualora una sotto - regione non passi uno solo di questi, sarà classificata come non volto, viceversa accadrà se li supera tutti. L’ordine dei filtri non è casuale, ma in relazione all’importanza assegnata dallo stesso AdaBoost; FIGURA 37: CASCATA DI CLASSIFICATORI ADABOOST di Dario D'Ambruoso 29 GRI: Gestures Recognition Interface Capitolo 5: Appendice - Il classificatore di Haar Essenzialmente il funzionamento è riassumibile attraverso i seguenti punti: 1. Attraverso un training set viene generato un descrittore delle variazioni di contrasto più comuni per un particolare oggetto nel mio caso un volto (contrasto e orientamento); 2. Tale descrittore, che intrinsecamente ha una sua dimensione (quella delle immagini con le quali è stato creato), viene fatto scorrere sull’immagine da identificare ridimensionandolo ad ogni passaggio (in modo da ‘intercettare’ possibili oggetti anche di dimensioni diverse rispetto a quelle del training set); 3. Il descrittore presenta a sua volta una struttura ‘incrementale’ nella quale esso è composto da una sequenza di filtri che vengono verificati in sequenza sulla regione di interesse finche un filtro non fallisce o tutti i filtri passano, certificando in questo modo il match. 4. Ogni filtro è, concludendo, creato da una serie di operazioni basilari, che vengono anch’esse applicate in sequenza sulla regione di interesse; il risultato in questo caso è misurato pesando i risultati delle singole operazioni. di Dario D'Ambruoso 30 GRI: Gestures Recognition Interface Capitolo 5: Appendice - I momenti di Hu I MOMENTI DI HU I momenti sono un'intera famiglia di caratteristiche di un'immagine, sono uno strumento potentissimo usato in ogni campo scientifico in cui si abbia che fare con una distribuzione spaziale di un oggetto con proprietà locali quali la densità di massa (in meccanica), i toni di grigio (nel nostro caso), la densità di carica, ... Consideriamo l’immagine binaria (𝑛𝑟 · 𝑛𝑐 ) = 1 𝑠𝑒 (𝑖, 𝑗) ∈ ℝ 𝐹(𝑖, 𝑗) { = 1 𝑠𝑒 (𝑖, 𝑗) ∉ ℝ Si definisce momento 𝑚𝑛 − 𝑒𝑠𝑖𝑚𝑜 dell’immagine la grandezza 𝑛𝑟 −1 𝑛𝑐 −1 𝑀𝑚𝑛 = ∑ ∑ 𝑖 𝑚 𝑗 𝑛 𝐹(𝑖, 𝑗) 𝑖=0 𝑗=0 con 𝑚, 𝑛 ≥ 0. La quantità 𝑚 + 𝑛 `e detta ordine del momento. Se l’immagine contiene un solo oggetto i momenti sono proprietà legate alla forma dell’oggetto. Alcuni momenti corrispondono a proprietà ben note: 𝑛𝑟 −1 𝑛𝑐 −1 (Area) 𝑀00 = ∑ ∑ 𝑖 𝑚 𝑗 𝑛 𝐹(𝑖, 𝑗) = 𝐴 𝑖=0 𝑗=0 𝑛𝑟 −1 𝑛𝑐 −1 𝑀10 = ∑ ∑ 𝑖𝐹(𝑖, 𝑗) ⇒ 𝑖=0 𝑗=0 𝑛𝑟 −1 𝑛𝑐 −1 𝑀01 = ∑ ∑ 𝑖𝐹(𝑖, 𝑗) ⇒ 𝑖=0 𝑗=0 𝑛𝑟 −1 𝑛𝑐 −1 𝑀10 = 𝑖𝑏 𝑀00 (Coordinata 𝑖 del baricentro) 𝑀01 = 𝑗𝑏 𝑀00 (Coordinata 𝑗 del baricentro) (Momento d’inerzia rispetto all’asse 𝑗) 𝑀20 = ∑ ∑ 𝑖 2 𝐹(𝑖, 𝑗) = 𝐼𝑗 𝑖=0 𝑗=0 𝑛𝑟 −1 𝑛𝑐 −1 (Momento d’inerzia rispetto all’asse 𝑖) 𝑀02 = ∑ ∑ 𝑗 2 𝐹(𝑖, 𝑗) = 𝐼𝑖 𝑖=0 𝑗=0 𝑛𝑟 −1 𝑛𝑐 −1 (Momento di deviazione) 𝑀11 = ∑ ∑ 𝑖𝑗𝐹(𝑖, 𝑗) = 𝐼𝑖 𝑖=0 𝑗=0 Si può dimostrare che l’insieme (infinito) dei momenti determina univocamente la forma dell’oggetto. È possibile quindi utilizzare i momenti come descrittori di forma e distinguere oggetti aventi forma diversa sulla base di un sotto-insieme, opportunamente determinato, dell’insieme dei momenti. I momenti precedentemente definiti non sono invarianti rispetto alla traslazione (quanto più l’oggetto si allontana dall’origine tanto maggiori sono i valori dei momenti). È possibile ottenere dei momenti invarianti rispetto alla traslazione, che vengono detti momenti centrali, considerando un sistema di riferimento baricentrico: 𝑛𝑟 −1 𝑛𝑐 −1 ′ 𝑀𝑚𝑛 = ∑ ∑ (𝑖 − 𝑖𝑏 )𝑚 (𝑗 − 𝑗𝑐 )𝑛 𝐹(𝑖, 𝑗) 𝑖=0 𝑗=0 I momenti centrali non sono però invarianti rispetto alla rotazione: si pensi ad esempio ai due momenti d’inerzia che sono minimo e massimo quando l’asse maggiore dell’oggetto coincide con uno dei due assi del sistema di riferimento dell’immagine. I momenti centrali possono quindi essere usati come descrittori di forma solo se l’orientamento degli oggetti è fisso. Per ottenere dei momenti invarianti rispetto alla rotazione è necessario considerare un sistema di riferimento (detto Riferimento Principale) orientato secondo gli assi (maggiore e minore) dell’oggetto. Questo approccio però richiede la determinazione univoca del riferimento principale, mentre l’asse maggiore definisce l’orientamento dell’oggetto solo a meno di una rotazione di 180 gradi. Inoltre, in aggiunta all’invarianza rispetto alla rotazione si desidera sovente anche quella rispetto allo scaling. Hu ha dimostrato che a partire dai momenti centrali è possibile definire dei descrittori che risultano di Dario D'Ambruoso 31 GRI: Gestures Recognition Interface Capitolo 5: Appendice - I momenti di Hu essere invarianti rispetto a traslazione, rotazione, e scaling. Viene prima definita una normalizzazione dei momenti centrali: ′ 𝑚+𝑛 𝑀𝑚𝑛 ∝= +1 𝑉𝑚𝑛 = 2 (𝑀00 )𝛼 Quindi a partire dai momenti centrali normalizzati di definiscono gli invarianti: Hu dimostra l’invarianza degli ℎ𝑖 rispetto a traslazione, rotazione e scaling nel caso continuo. Nell’applicazione pratica su immagini digitali queste grandezze si dimostrano generalmente ragionevolmente costanti per versioni modificate di una stessa forma. Le variazioni degli ℎ𝑖 sono dovute agli inevitabili errori di discretizzazione. In realtà in questo lavoro si è usata una funzione di edge match, descritta in [9], essa misura la similarità tra due contorni, A, e B. Quindi il metodo restituirà una misura pari a: Con: nello specifico ℎ𝑖𝐴 ed ℎ𝑖𝐵 rappresentano l’i-esimo momento di A e l’i-esimo momento di B, ed ovviamente 𝑖 = [1,2,3,4,5,6,7] di Dario D'Ambruoso 32 GRI: Gestures Recognition Interface Capitolo 5: Appendice - Procedura per la compilazione e i settaggi d’ambiente PROCEDURA PER LA COMPILAZIONE E I SETTAGGI D’AMBIENTE Per quanto riguarda le OpenCV, prima di tutto occorre installare le dipendenze e i pacchetti utili, lanciando i seguenti comandi da shell: sudo sudo sudo sudo sudo sudo sudo sudo sudo sudo sudo sudo sudo sudo sudo sudo sudo sudo sudo sudo sudo apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get install install install install install install install install install install install install install install install install install install install install update build-essential libgtk2.0-dev pkg-config libjpeg62-dev libtiff4-dev libjasper-dev libopenexr-dev cmake cmake-gui python-dev python-numpy libtbb-dev libtbb2 libeigen2-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev Dopo aver verificato che ogni comando precedente sia andato a buon fine, scaricare ed installare le FFMPEG, lanciando i seguenti comandi: wget http://ffmpeg.org/releases/ffmpeg-0.7-rc1.tar.gz tar -xvzf ffmpeg-0.7-rc1.tar.gz cd ffmpeg-0.7-rc1 ./configure --enable-gpl --enable-version3 --enable-nonfree --enablepostproc --enable-libfaac --enable-libopencore-amrnb --enablelibopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libxvid --enable-x11grab --enable-swscale --enable-shared make sudo make install A questo punto installare le OpenCV, scaricare la versione 2.2 utilizzata in questo lavoro, al seguente link http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.2/ , quindi decomprimere fil file, e lanciare i seguenti comandi mkdir release cd release sudo cmake-gui dalla gui del cmake, selezionare i supporti desiderati, configurare, e generare il file make, in figura sono mostrato i pulsanti premere, ed gli eventuali path, viceversa per i supporti dipende dall’utente di Dario D'Ambruoso 33 GRI: Gestures Recognition Interface Capitolo 5: Appendice - Procedura per la compilazione e i settaggi d’ambiente Qui sarà inserito il percorso dei file da compilare Qui sarà inserito il percorso in cui fare la build, nel nostro caso sarà la cartella release, creata precedentemente Cliccare per generare il file make Cliccare la prima volta per avere la lista dei supporti, apporre la spunta ai desiderati, e ricliccare FIGURA 38: CMAKE-GUI ESEMPIO ritornare al terminale, e lanciare i seguenti comandi: make quindi sul terminale vedremo una sequenza del tipo: FIGURA 39: TERMINALE INIZIO MAKE al termine dell’esecuzione del make, sul terminale apparirà la seguente situazione: di Dario D'Ambruoso 34 GRI: Gestures Recognition Interface Capitolo 5: Appendice - Procedura per la compilazione e i settaggi d’ambiente FIGURA 40: TERMINALE FINE MAKE come mostrato in figura, occorrerà lanciare il seguente comando: sudo make install a questo punto sul teminale avremo: FIGURA 41: TERMINALE MAKE INSTALL sudo gedit /etc/ld.so.conf.d/opencv.conf si aprirà una finestra come quella mostrata in figura, scrivere all’interno del file .conf la seguente stringa /usr/local/lib salvare. di Dario D'Ambruoso 35 GRI: Gestures Recognition Interface Capitolo 5: Appendice - Procedura per la compilazione e i settaggi d’ambiente FIGURA 42: OPENCV.CONF ESEMPIO DI EDITAZIONE Tornare al terminale, e lanciare: sudo ldconfig sudo gedit /etc/bash.bashrc apparirà una finestra del tipo riportata in figura: FIGURA 43: BASH.BASHRC ESEMPIO DI EDITAZIONE scrivere le seguenti stringhe: PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH e salvare. di Dario D'Ambruoso 36 GRI: Gestures Recognition Interface Capitolo 5: Appendice - Procedura per la compilazione e i settaggi d’ambiente Per quanto riguarda Qt con il supporto a Qt3D ed opengl, si inizi con l’installazione delle OpenGL: sudo apt-get install freeglut3 freeglut3-dev quindi scaricare le librerie QT dal seguente link http://qt.nokia.com/downloads/downloads#qt-lib, a questo punto lanciare il seguente comando per abilitare il supporto ad OpenGL: ./configure -opengl La configurazione dura circa 5 ore, dopo di che si potrà lanciare il comando: make anche questo durerà circa 5 ore, infine lanciare: make install Per scaricare la versione desiderata di QT3D lanciare i seguenti comandi, con le opportune modifiche in base ai propri path: git clone git://gitorious.org/qt-quick3d/qt-quick3d.git .../bin/qmake .../qt3d/....pro make make install export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH Se per qualsiasi motive si volesse realizzare tale ambiente sotto un sistema Windows, si consiglia di seguire le seguenti guide ufficiali, anche se non personalmente testate: http://opencv.willowgarage.com/wiki/VisualC%2B%2B_VS2010 http://doc.qt.nokia.com/qt3d-snapshot/qt3d-building.html di Dario D'Ambruoso 37 GRI: Gestures Recognition Interface Capitolo 6 - Bibliografia CAPITOLO 6 Bibliografia [1] M. S. D. D. G. M. M. C. S. T. E. D. T. G. M. Vitoantonio Bevilacqua, "Approach to Support the Analysis and the Classification of Non Verbal Humans Communications.," ICIC , pp. 426-431, 2011. [2] S. Marcel, «Hand Posture and Gesture Datasets,» [Online]. Available: http://www.idiap.ch/resource/gestures/. [3] O. B. J. V. a. D. C. Sebastien Marcel, «Hand Gesture Recognition using Input - Output Hidden Markov Models,» 2000. [4] A. Ioannis, «ASL American Sign Language,» [Online]. Available: http://users.iit.demokritos.gr/~dkosmo/downloads/gesture/help_gestureDB.htm. [5] I. M. Dimitrios I. Kosmopoulos, «Extraction of Mid-Level Semantics from Gesture Videos using a Bayesian Networl,» 2000. [6] Sophie, «SOUVR,» [Online]. Available: http://souvrsophie.blog.com/2009/10/. [7] «Cognotics,» 02 2007. [Online]. Available: http://www.cognotics.com/opencv/servo_2007_series/part_2/sidebar.html#fig_3. [8] J. M. Rainer Lienhart, «An extended set of Haar-like features for rapid object detection,» in Proceedings International Conference on Image Processing, 2002. [9] M. HU, «Visual Pattern Recognition by Moment Invariants,» in Transactions on Information Theory, 1962. [10] A. Papoulis, «Probability, Random Variables, and Stochastic Processes,» 1965. di Dario D'Ambruoso 38 GRI: Gestures Recognition Interface Capitolo 6 - Indice delle Figure INDICE DELLE FIGURE Figura 1: Kinect ................................................................................................................................................................................................. 1 Figura 2: Sebastien Marcel Static Hand Posture Database.............................................................................................................. 4 Figura 3: Sebastien Marcel Dynamic Hand Posture Database ....................................................................................................... 4 Figura 4: Cad Immersivo con tablet .......................................................................................................................................................... 5 Figura 5: Cad Immersivo realizzato al Cetma ....................................................................................................................................... 5 Figura 6: Concept di Interfaccia di ultima generazione .................................................................................................................... 5 Figura 7: Immersion CyberGlove II ........................................................................................................................................................... 6 Figura 8: X-ISTS Data Glove ......................................................................................................................................................................... 6 Figura 9: Measurand ShapeHand, ShapeHandPlus & ShapeClaw ................................................................................................ 6 Figura 10: Immersion Haptic Workstation............................................................................................................................................ 7 Figura 11: Workflow generale .................................................................................................................................................................... 8 Figura 12: Riconoscimento comandi dinamici ..................................................................................................................................... 9 Figura 13: Riconoscimento gesti statici ............................................................................................................................................... 11 Figura 14: Template ..................................................................................................................................................................................... 13 Figura 15: Comandi Statici riconosciuti ............................................................................................................................................... 14 Figura 16: Ubuntu tux logo........................................................................................................................................................................ 15 Figura 17: Qt creator logo .......................................................................................................................................................................... 16 Figura 18: OpenCv Logo ............................................................................................................................................................................. 17 Figura 19: OpenGL Logo ............................................................................................................................................................................. 18 Figura 20: Qt lib logo.................................................................................................................................................................................... 19 Figura 21: Visione globale dell'interfaccia .......................................................................................................................................... 20 Figura 22: GUI - Frame area ...................................................................................................................................................................... 21 Figura 23: GUI - Statistics area................................................................................................................................................................. 21 Figura 24: GUI - Interactive area............................................................................................................................................................. 21 Figura 25: GUI - Dialog ................................................................................................................................................................................ 22 Figura 26: GUI - Frame area con Skin Detection .............................................................................................................................. 22 Figura 27: GUI - 3D area ............................................................................................................................................................................. 22 Figura 28: GUI - Action area ...................................................................................................................................................................... 23 Figura 29: GUI - Gestures area (default) .............................................................................................................................................. 23 Figura 30: GUI - Gestures area (Wating for command) ................................................................................................................. 23 Figura 31: Tool in funzione rotazione x ............................................................................................................................................... 24 Figura 32: Tool in funzione rotazione z ............................................................................................................................................... 24 Figura 33: Tool in funzione traslazione ............................................................................................................................................... 25 Figura 34: Rappresentazione dello spazio dei colori HSV ............................................................................................................ 26 Figura 35: Features Haar-Like ................................................................................................................................................................. 28 Figura 36: Immagine integrale ................................................................................................................................................................ 29 Figura 37: Cascata di classificatori AdaBoost .................................................................................................................................... 29 Figura 38: Cmake-Gui esempio ................................................................................................................................................................ 34 Figura 39: Terminale inizio make........................................................................................................................................................... 34 Figura 40: Terminale Fine make ............................................................................................................................................................. 35 Figura 41: Terminale make install ......................................................................................................................................................... 35 Figura 42: Opencv.conf esempio di editazione ................................................................................................................................. 36 Figura 43: Bash.bashrc esempio di editazione .................................................................................................................................. 36 di Dario D'Ambruoso 39 GRI: Gestures Recognition Interface Capitolo 6 - Indice INDICE Capitolo 1: Caso di studio .............................................................................................................................................................................. 1 Introduzione .................................................................................................................................................................................................. 1 Il fine ................................................................................................................................................................................................................. 2 Specifiche da soddisfare ........................................................................................................................................................................... 3 Campi d’applicazione ................................................................................................................................................................................. 3 Stato dell’arte e idee ................................................................................................................................................................................... 4 Capitolo 2: Progettazione .............................................................................................................................................................................. 8 Work-flow....................................................................................................................................................................................................... 8 Acquisizione da sensore video .......................................................................................................................................................... 9 Riconoscimento dei comandi dinamici .......................................................................................................................................... 9 Attuazione del comando ................................................................................................................................................................... 10 Riconoscimento dei comandi statici ................................................................................................................................................. 10 Interazione .................................................................................................................................................................................................. 14 Capitolo 3: Implementazione ................................................................................................................................................................... 15 Introduzione ............................................................................................................................................................................................... 15 GNU Linux .................................................................................................................................................................................................... 15 Ambiente di sviluppo .............................................................................................................................................................................. 16 OpenCv .......................................................................................................................................................................................................... 17 OpenGL ......................................................................................................................................................................................................... 18 Interfaccia Grafica .................................................................................................................................................................................... 19 Capitolo 4: Conclusioni ............................................................................................................................................................................... 20 Considerazioni ........................................................................................................................................................................................... 20 GUI .................................................................................................................................................................................................................. 20 Risultati......................................................................................................................................................................................................... 24 Capitolo 5: Appendice.................................................................................................................................................................................. 26 Spazio HSV................................................................................................................................................................................................... 26 Tonalità .................................................................................................................................................................................................... 27 Saturazione............................................................................................................................................................................................. 27 Valore........................................................................................................................................................................................................ 27 Il classificatore di Haar........................................................................................................................................................................... 28 I momenti di Hu......................................................................................................................................................................................... 31 Procedura per la compilazione e i settaggi d’ambiente ............................................................................................................ 33 Capitolo 6 .......................................................................................................................................................................................................... 38 Bibliografia ............................................................................................................................................................................................. 38 Indice delle Figure.................................................................................................................................................................................... 39 Indice ............................................................................................................................................................................................................. 40 di Dario D'Ambruoso 40