Università degli Studi di Napoli “Parthenope”

Facoltà di Scienze e Tecnologie
Corso di Laurea in Informatica

 

Handy : Riconoscimento di semplici gesti tramite webcam

 

 

Relatore: prof. Francesco Camastra

Candidato :   Luigi Lamberti

 

Anno Accademico 2009-2010

 

Sommario

1        Introduzione  6

1.1         Obiettivo. 7

2        Input device  8

2.1         Trackers. 8

2.2         Gesture Interface. 10

2.3         Lavagna Interattiva Multimediale. 11

2.4         Webcam.. 11

2.5         Applicazioni 12

3        Immagini a colori 13

3.1         Modelli di colore. 14

3.1.1           Modello RGB. 15

3.1.2           Modello CMY.. 15

3.1.3           Modelli  HSI, HLS, HSB. 16

3.1.4           Modelli CIE. 18

3.2         Comparazione degli spazi colore. 20

3.2.1           Tabelle riassuntive. 20

3.2.2           Considerazioni 21

3.3         Scelta dello spazio colore. 22

3.4         Soglie di segmentazione. 23

3.5         Colori utilizzabili 24

3.6         Superfici Lambertiane. 24

4        Il Guanto colorato  25

4.1         Gradi di libertà. 25

4.1.1           Traslazione nel piano XY.. 25

4.1.2           Traslazione in Z.. 26

4.1.3           Rotazione intorno Z.. 26

4.1.4           Rotazione intorno X e Y.. 26

5        Segmentazione di un'immagine a colori 27

5.1         Acquisizione. 27

5.2         Risoluzione immagine. 28

5.3         Sfocatura. 30

5.4         Campionamento e sottrazione dello sfondo. 30

5.5         Sogliatura dei colori: Pixel Certi e Probabili 32

5.5.1           Conversione HSI 32

5.5.2           Segmentazione. 32

5.6         Eliminazione disturbi 34

5.6.1           Dilatazione. 34

5.6.2           Erosione. 35

5.6.3           Apertura e Chiusura. 36

5.7         Ricerca delle componenti connesse. 37

5.8         Scelta delle componenti connesse. 38

5.9         Dimensioni 39

5.10       Coordinate polari 40

5.10.1        Mano Destra. 40

5.10.2        Mano Sinistra. 40

5.11       Estrazione di Feature Invarianti 41

5.11.1        Normalizzazione delle distanze. 41

5.11.2        Normalizzazione degli angoli 41

5.11.3        Feature. 41

6        Classificazione dei Gesti 42

6.1         Definizioni 42

6.1.1           Apprendimento Automatico. 42

6.1.2           Classificazione. 43

6.2         Modulo di Apprendimento. 44

6.3         Estrazione Feature. 45

6.4         Codebook. 46

6.4.1           LVQ Software. 46

6.5         Modulo Classificatore. 48

6.5.1           Errori di Interpretazione. 49

6.5.2           Calcolo del valore di soglia per la distanza. 50

6.6         Scelta dei gesti 52

6.7         Azioni 53

6.7.1           Output grafico. 53

6.7.2           Movimento Cursore. 53

6.7.3           Presentazione Slides. 54

6.7.4           Sequenze di gesti 54

7        Implementazione del Software  55

8        Prove di Utilizzo  75

8.1         Vincoli Ambientali 75

8.2         Valutazione dei risultati 76

8.2.1           Unico operatore. 76

8.2.2           Operatori diversi 77

8.3         Considerazioni finali 78

Bibliografia  79

 

1   Introduzione

Lo sviluppo dell'Informatica in ambito Multimediale, ha portato il computer ad interagire con il mondo umano su canali che, fino a qualche anno fa, erano impensabili.

Dalla tastiera con annessa stampante dei primi elaboratori, si è passati ad una moltitudine di periferiche di I/O: mouse, touchpad, joystick, monitor, touchscreen, microfoni, altoparlanti, webcam, ecc…  Impossibile catalogarle tutte.

Molte periferiche di Input richiedono che l'utente sia addestrato al loro utilizzo, con una fase più o meno lunga di apprendistato: usare la tastiera non è come usare una penna a sfera e fare 'doppio clic' con l'indice sul mouse senza muovere tutto l'avambraccio, è un'impresa difficile per un adulto che si avvicini per la prima volta al computer.

Si potrebbe, perciò, affrontare il problema dell'immissione dati, utilizzando metodi già usuali nella comunicazione umana, lasciando alla macchina il compito di decodificare ed interpretare le informazioni acquisite. Vanno in questa direzione, ad esempio, le ricerche sul riconoscimento vocale e la recente penna che interpreta le oscillazioni della mano durante la scrittura.

Un approccio differente è quello della Gestualità.

Proverbialmente le popolazioni dell'area mediterranea, ed in particolare gli italiani, sono soliti gesticolare mentre parlano, tanto che, spesso, il movimento delle mani diventa il canale principale della comunicazione. 

In realtà, tutti i popoli del mondo utilizzano le dita e le mani come un vero linguaggio; alcuni gesti sono universalmente riconosciuti, mentre altri assumono un significato variabile da paese a paese.

La mano, simbolo dell'evoluzione umana rispetto agli altri animali, è un frequente strumento di misura: serve a contare e ad agire. Alcune scritture geroglifiche come quella egizia, maya o azteca utilizzano spesso la mano per simboleggiare l'azione.

Occorre, naturalmente, distinguere il gesto spontaneo dai linguaggi gestuali che sono codificati, come per esempio il linguaggio dei segni utilizzato dai sordomuti che, pur diverso da nazione a nazione, presenta alcuni caratteri comuni.

Un settore in cui la gestualità assume particolare importanza, è quello dell'insegnamento.

Durante la classica lezione (magari con lavagna) i gesti del docente veicolano informazioni, che consentono di mantenere meglio il contatto con gli allievi; di conseguenza, i gesti influenzano i processi di apprendimento.

Un settore di applicazione ben più complesso è quello della realtà virtuale, ove i movimenti del corpo devono essere registrati per simulare azioni reali, restituendo poi un opportuno feedback all'utente.

 

1.1    Obiettivo

Oggetto di questo lavoro è la realizzazione di una procedura capace di interpretare un certo numero di semplici gesti della mano, da associare ad altrettante operazioni su un PC.

I requisiti fondamentali sono tre:

*    Basso Costo: la procedura dovrà utilizzare materiale già disponibile su un qualsiasi Personal Computer, o comunque reperibile a costi limitati.

*    Larga applicabilità: la complessità computazionale dovrà essere contenuta in modo da poter eseguire la procedura anche su computer con prestazioni ridotte, come i Netbook.

*    Semplicità d’uso da parte di un utente medio.

 

 

2   Input device

L'interazione gestuale tra uomo e macchina è possibile, a patto di disporre di periferiche opportunamente progettate per acquisire i vari aspetti del movimento del corpo.

Per esempio è possibile utilizzare sensori di posizione, guanti sensibili al movimento della mano, telecamere per luce visibile o per infrarossi, accelerometri, inclinometri, ecc…

In generale, la collocazione ed il movimento di un oggetto nello spazio 3D sono indicati con sei gradi di libertà: tre per le traslazioni nei piani principali e tre per le rotazioni.

Se rappresentiamo l'oggetto in un sistema di assi cartesiane ortogonali XYZ, dovranno essere registrate le posizioni successivamente occupate dal centro di riferimento dell'oggetto, nonché le torsioni effettuate intorno agli assi principali, dette yaw, pitch e roll rispettivamente.

Poiché la terna di angoli di rotazione, necessaria per raggiungere una certa posizione, potrebbe non essere univocamente determinata, il sistema può essere descritto più agevolmente da una sequenza di 7-ple  xyzijkt :

I   (x,y,z) sono le coordinate 3D del centro di riferimento;

I   (i,j,k) detti coseni direttori, indicano il versore dell'oggetto con  i2+j2+k2=1 ;

I   t è l'istante di campionamento. 

In base alle esigenze è possibile introdurre dei vincoli strutturali che riducano il numero dei parametri.

 

2.1    Trackers

L'hardware dedicato usato nella Realtà Virtuale e, in generale, in tutte le applicazioni che richiedono la registrazione del movimento 3D, viene chiamato Tracker [1]; la caratteristica fondamentale di un tracker è la capacità di registrare abbastanza rapidamente i movimenti di un oggetto.

Le performance di un tracker sono descritte da parametri caratteristici:

±   la Precisione rappresenta la differenza tra la posizione reale dell'oggetto e quella misurata;

±   il fenomeno detto Jitter rappresenta le variazioni delle misure del tracker mentre l'oggetto è in condizioni stazionarie;

±   la Latenza è la differenza tra l'istante in cui l'oggetto cambia posizione e quello in cui il tracker registra il nuovo valore (ritardo della misura);

±   la Velocità di aggiornamento (update rate) è il numero di campioni che il tracker può acquisire nell'unità di tempo (secondo).

±   la Deriva (drift) è il progressivo incremento dell’errore di misura, dovuto all’accumulo di errori con il passare del tempo, che può rendere inutilizzabili i dati acquisiti; il tracker deve essere periodicamente azzerato, per calibrare correttamente le misure.

Negli ultimi decenni sono stati utilizzati svariati tipi di trackers: meccanici, magnetici, a ultrasuoni.

La caratteristica comune è quella di collocare solidalmente sui punti nevralgici dell'oggetto (ad esempio le giunture della mano o di un intero corpo umano) dei rilevatori più o meno complicati che trasmettano tutte le misure (via cavo o wireless) ad una stazione centrale che possa elaborare i dati. Di conseguenza, l'altra caratteristica comune è il costo, spesso improponibile per applicazioni general-purpose.

Una soluzione più economica, nata nel modo dei giochi, è il controller Nintendo WiiMote (dalla fusione di Wii, il nome della console, e Remote) [2].

 

2.2    Gesture Interface

Per misurare in tempo reale il movimento della mano, la posizione delle dita ed il movimento del polso, sono stati progettati componenti dedicati, raccolti sotto il nome di Gesture Interface.

Principalmente si tratta di Guanti sensibili, contenenti sensori in grado di misurare il movimento delle falangi, in modo da poter dedurre la posizione delle dita rispetto al palmo.

I guanti differiscono per il numero ed il tipo dei sensori, per la velocità di campionamento, per la risoluzione e per il metodo di trasmissione dei dati al computer (via cavo o wireless). In ogni caso si tratta di materiale costoso e delicato.

Il guanto, per fornire misure attendibili, deve essere di misura adeguata alla mano dell'operatore (una donna ha in genere una mano più piccola), raddoppiando o triplicando l'investimento per disporre di più taglie.

Ad esempio il 5DT Data Glove [4] è un guanto in lycra che ospita dei sensori realizzati con filamenti in fibra ottica; una piccola interface box provvede a inviare i valori rilevati dai sensori sulla porta seriale alla quale si collega il guanto o ad un’unità wireless.

La libreria di gesti possibili, sembra essere sottodimensionata rispetto alle possibilità offerte dai sensori; inoltre alcuni gesti sono impossibili da realizzare per molte persone (provate ad alzare l'anulare tenendo chiuse tutte le altre dita …).

 

2.3    Lavagna Interattiva Multimediale

La Lavagna Interattiva Multimediale (o LIM) è un dispositivo elettronico che ha le dimensioni di una tradizionale lavagna sulla cui superficie è possibile, in sincronia con un computer, scrivere, gestire immagini, riprodurre file video, consultare risorse web, ecc… [5]

Le lavagne possono essere retroilluminate (più costose) o collegate ad un videoproiettore. In genere sono dotate di una superficie sensibile al tocco, o di un contorno magnetico: in entrambi i casi è possibile agire (apparentemente) sulla schermata proiettata, direttamente con un dito. I pareri sul suo impiego a scopo formativo sono vari; sicuramente migliora il livello di partecipazione da parte degli studenti, perché consente di utilizzare direttamente le mani per operare sulle parti della lezione. Bisogna però osservare che la stessa lezione può essere condotta usando un mouse, una tastiera e un proiettore: il coinvolgimento gestuale è inferiore, ma si risparmiano migliaia di euro.

 

2.4    Webcam

Una webcam è una piccola telecamera utilizzabile come dispositivo di input per un computer. A differenza di una telecamera tradizionale, non dispone di un proprio sistema di memorizzazione di video (per esempio su nastro), ma trasmette semplicemente le immagini riprese, in forma digitale, attraverso un'interfaccia collegabile a un computer.

Ogni frame della sequenza video è strutturato come una matrice di valori, uno per ogni pixel dell'immagine: velocità, risoluzione e profondità dei colori dipendono dal modello, ma anche le webcam più economiche (qualche decina di euro) possono acquisire 30 fotogrammi per secondo, con una risoluzione 640x480 punti, in true color, ovvero 3 byte per pixel.

Per sfruttare al meglio la più umile delle telecamere, occorre disporre di una CPU in grado di ricevere ed elaborare 30x640x480x3 = 27000 KByte al secondo!

 

2.5    Applicazioni

La possibilità di comunicare con il computer attraverso i movimenti del corpo, apre infiniti scenari di applicazione nei campi più disparati, da un'operazione chirurgica a distanza ai videogame, dalla guida di un robot cercamine al riconoscimento dei gesti di un disabile.

Il presente lavoro si sviluppa in un ambito abbastanza delimitato: utilizzando un'economica webcam ed un PC entry-level, si cercherà di riconoscere una dozzina di semplici gesti della mano.

Il riconoscimento statico di un gesto e/o il movimento dello stesso attraverso il campo visivo della telecamera potranno essere utilizzati per attivare opportune funzionalità sul computer.

Ad esempio è possibile simulare la maggior parte delle funzioni offerte da una LIM, disponendo di un Pc, una Webcam e un videoproiettore (oggetti generalmente già disponibili presso un qualsiasi laboratorio informatico di una scuola).

 

 

3   Immagini a colori

Nel 1666, gli esperimenti di sir Isaac Newton evidenziarono che la luce solare, apparentemente bianca, è in realtà composta da uno spettro continuo di colori che vanno dal viola al rosso.

Oggi sappiamo che la luce visibile, costituita da una piccolissima parte delle radiazioni elettromagnetiche, è caratterizzata da lunghezze d’onda comprese approssimativamente tra i 400 e i 730 nanometri ( 1 nm = 10-9 m ).

La lunghezza d’onda λ e la frequenza ν sono legate dall’espressione  λ·ν=c, dove c è la velocità della luce (2.998·108 m/s). In termini di frequenze, lo spettro visibile varia tra i 410 e i 750 terahertz ( 1 THz = 1012 Hz ). [6] [7]

Un oggetto che rifletta uniformemente tutte le lunghezze d’onda del visibile appare bianco o grigio, mentre se predomina una lunghezza d'onda sulle altre l'oggetto appare colorato.

L'occhio umano, organo di senso deputato alla visione, ha la proprietà di essere influenzato dalla potenza della radiazione luminosa che colpisce i ricettori presenti sulla retina:

v   i bastoncelli, sensibili all'intensità luminosa;

v   i coni, divisi in tre gruppi, sensibili ai colori Rosso, Verde e Blu.

La sensazione visiva si stabilizza mediamente in 0.1 secondi e attribuisce alla luce una qualità (colore) che dipende dalla lunghezza d'onda. Per esempio, appaiono blu gli oggetti che riflettono la luce nella gamma tra 420 e 460 nm, ed assorbono le altre frequenze. Si ha la massima sensibilità dell'occhio attorno ai 555 nm (540 THz), in corrispondenza del verde.

In definitiva, il colore non è in alcun modo un attributo oggettivo della radiazione: una radiazione di 400nm fa vedere il rosso e una di 700 nm fa vedere il violetto, ma né l’una è rossa né l’altra è violetta.

Anche se le combinazioni delle lunghezze d'onda sono infinite, si ritiene che un soggetto con visus normale, possa distinguere al massimo qualche milione di colori.

In base agli esperimenti condotti dal CIE (Commission International de l’Eclairage), un colore percepito è ottenibile con buona approssimazione mescolando assieme tre lunghezze d’onda monocromatiche, associate ai colori Rosso, Verde e Blu, detti Colori Primari. [8]

I colori primari possono essere sovrapposti per produrre i Colori Secondari Magenta (rosso+blu), Ciano (verde+blu) e Giallo (rosso+verde); i tre colori combinati in proporzione opportuna, producono il Bianco.

Il fenomeno è chiamato “Sintesi Additiva.

Le quantità di Rosso, Verde e Blu necessarie per formare un dato colore sono detti valori Tristimolo (indicati rispettivamente con X, Y e Z); due colori con gli stessi valori XYZ sono indistinguibili.

Un colore può quindi essere specificato tramite i suoi coefficienti tricromatici, definiti come

     

 

3.1    Modelli di colore

Un modello colore, detto anche Spazio Colore, ha lo scopo di specificare in modo standard la rappresentazione di un colore.

Nessuno dei modelli colore attualmente in uso riesce a descrivere fedelmente la totalità dei colori reali percepibili, così come non tutti i colori rappresentati da un modello, possono essere convertiti esattamente in una rappresentazione equivalente di un altro spazio: diremo che gli spazi colore non sono sovrapponibili.

In base alle caratteristiche del modello, distinguiamo

*    modelli Hardware-oriented, definiti in base alle proprietà delle periferiche (es. RBG e CMY).

*    modelli User-oriented, più vicini al metodo di percezione umana, basato su Tonalità, Luminosità e Saturazione dei colori.

3.1.1      Modello RGB

La rappresentazione dei colori nello spazio RGB prevede la scomposizione di un colore nelle tre componenti Rosso, Verde e Blu, assegnando a ciascuna parte un valore dipendente dall'intensità luminosa.

Anche se non è possibile ottenere tutti i possibili colori con una combinazione RGB, la quasi totalità dei monitor, telecamere, fotocamere e scanner utilizzano questo metodo.

I vari formati basati su RGB si distinguono per la risoluzione dell’intervallo [0,1], ovvero per il numero di bit utilizzati per memorizzare i valori R, G e B.

Ad esempio il formato VGA base usa un bit per componente (o canale),  per un totale di 23 = 8 colori, mentre nella rappresentazione 'true color' per ogni pixel si utilizzano 8 bit per ciascuno dei tre canali Red, Green  e Blu: si ottengono 2563 = 16777216 combinazioni di colore; quindi R=230, G=220, B=16 produce un giallo, mentre R=G=B=150 corrisponde ad un grigio.

3.1.2      Modello CMY

Fin dai tempi più antichi, pittori e tintori hanno imparato ad utilizzare varie sostanze mescolate tra loro per ottenere i diversi colori: il modello CMY, acronimo di Cyan (ciano-azzurro), Magenta, Yellow (giallo) rappresenta la formalizzazione delle conoscenze empiriche accumulate in 5000 anni di tentativi.

I colori sono riprodotti per mezzo della sintesi delle lunghezze d'onda riflesse dagli inchiostri di stampa; più precisamente, i pigmenti contenuti negli inchiostri si comportano come filtri che assorbono (sottraggono) le radiazioni della luce ambientale policromatica sotto una certa soglia e trasmettono le rimanenti lunghezze d'onda. Queste ultime, essendo riflesse dalla tela sottostante, determinano la percezione dei colori disegnati.

Il fenomeno viene definito “Sintesi Sottrattiva”.

I pigmenti assorbono sempre il colore complementare del colore percepito: per esempio, il ciano sottrae le radiazioni rossastre e trasmette le azzurre.

I tre colori mescolati in proporzione opportuna, producono il Nero, ma, nella stampa, si preferisce utilizzare direttamente un inchiostro nero; il modello derivato prende il nome di CMYK, ove la componente nera (black) è indicata dalla lettera K (Key color) per evitare confusione con il blu (B).

Dato che gli spazi colorimetrici dei modelli CMYK e RGB non sono perfettamente sovrapponibili, le immagini stampate possono presentare differenze di colore marcate rispetto alle immagini a video.

Una semplice, anche se approssimativa trasformazione tra RGB e CMY può essere ottenuta con    R = 1 - C ;   G = 1 – M ;   B = 1 – Y .

3.1.3      Modelli  HSI, HLS, HSB

Mentre il sistema RGB è più adatto alla descrizione del funzionamento delle periferiche, altri sistemi si basano sul metodo usato dal cervello umano per percepire il colore; l’occhio è più sensibile alle variazioni di luminosità che a quelle cromatiche, per questo è più utile scomporre la sensazione visiva in tre componenti:

v   Tonalità (Hue), corrispondente al concetto di tinta predominante.

v   Saturazione, che indica quanto una tinta predomina sulle altre.

v   Intensità (o Luminanza, o Brightness), legato alla potenza luminosa.

Con leggere differenze di impostazione delle formule di conversione da RGB, gli spazi colore basati sulla tonalità distribuiscono i colori in un cerchio su un angolo tra 0° e 360°.

Le coordinate polari di un punto del cerchio indicheranno la tonalità (angolo) e la Saturazione (distanza dal centro).

La componente Intensità viene separata e rappresentata diversamente. [7] [8] [9] [10]

Le formule di conversione tratte dalla letteratura sono state adattate in modo da essere applicate a terne di byte RGB (con valori da 0 a 255) ottenendo terne HSI o HLS o HSV ancora nell'intervallo [0,255].

Quando  R = G = B  la saturazione è nulla e la tonalità è indeterminata.

Hue Saturation Intensity

               

Hue Lightness Saturation

se   H < 0   ®   H = H + 256  ®   H Î [ 0, 256 [

Hue Saturation Value (o Brightness)

La tonalità è calcolata nello stesso modo di HLS.

3.1.4      Modelli CIE

Gli Spazi colore CIE sono stati sviluppati per cercare di rappresentare i colori in modo uniforme dal punto di vista percettivo; in uno spazio colore uniforme, la distanza tra due punti coincide con la differenza percettiva dei due colori corrispondenti.

Ogni colore è specificato tramite i tristimoli X=red, Y=green e Z=blu, ottenuti dalle coordinate RGB con la trasformazione lineare

X = 0.49*R + 0.31*G + 0.20*B

Y = 0.18*R + 0.81*G + 0.01*B

Z = 0.00*R + 0.01*G + 0.99*B

dove i coefficienti della matrice dipendono dalla periferica usata (quelli mostrati sono i valori di default proposti dal CIE).

Poiché gli spazi uniformi si basano sul concetto di percezione della luminosità, per applicare correttamente le formule di conversione, bisogna campionare una superficie che si percepisce bianca (in base alle condizioni ambientali) trasformando i valori R0G0B0 in X0Y0Z0 con la stessa matrice

X0 = 0.49*R0 + 0.31*G0 + 0.20*B0

Y0 = 0.18*R0 + 0.81*G0 + 0.01*B0

Z0 = 0.00*R0 + 0.01*G0 + 0.99*B0

L*a*b*

Lo spazio L*a*b*, chiamato anche CIELAB, è raccomandato dal CIE per quantificare le differenze tra i colori in condizioni di luce diurna. [7]

La chiarezza relativa L* è determinata in funzione del fattore di luminanza percentuale Y del colore considerato rispetto al fattore di luminanza percentuale Yo del campione bianco di riferimento.

Il valore di (X,Y,Z) deve essere NON superiore a (Xo,Yo,Zo).

Le coordinate cromatiche a* e b* indicano rispettivamente quanto "rosso o verde" e quanto "giallo o blu" è un colore. In particolare, valori positivi di a* indicano una tendenza verso il rosso, mentre valori negativi indicano una tendenza verso il verde; per b*, valori positivi indicano una tendenza verso il giallo, mentre valori negativi indicano una tendenza verso il blu.

Le formule originali sono state adattate in modo da ottenere valori compresi tra 0 e 255; valori di a* e b* che oltrepassino i limiti, verranno riportate agli estremi dell'intervallo [0,255].

Sia assegnata la funzione  

L*u*v*

Lo spazio L*u*v* è raccomandato dal CIE in condizioni di luce artificiale.

Il calcolo di L* è lo stesso di L*a*b*.

L*C*h*

Il modello L*C*h* esprime i colori in termini di Luminanza, Cromaticità e Tonalità (Hue), derivando C e H da a*b* o da u*v*

       

       

Anche in questo caso occorre riportare il campo dei valori ottenuti all'intervallo [0,255].

 

3.2    Comparazione degli spazi colore

Per confrontare le prestazioni dei diversi spazi colore, ho predisposto un semplice programma che acquisisce dalla webcam un campione di colore, calcolando la media, il minimo ed il massimo di ogni valore su un blocco di pixel per un certo numero di frame, in modo da compensare le oscillazioni di misura (jitter); il programma mostra la rappresentazione convertita in tutti i modelli prima esaminati.

Non ho usato il formato Media ± deviazione in quanto riduttiva rispetto alle informazioni a disposizione. Spesso la media non corrisponde affatto al centro del campo dei valori, ma sensibilmente spostata verso il minimo o verso il massimo.

Per lo spazio CIE è richiesta la calibrazione preliminare di un Bianco di riferimento, in assenza del quale si userà il valore di default (255,255,255).

Camera 0 1

Disponibili 2 Cam

Utilizzo la Cam 1 :

Altezza     240 pix

Larghezza   320 pix

imgSize  230400 byte

Mostrare il Colore di riferimento nel Box centrale:

 

 [ W ]    per calibrare  il BIANCO su 20 frame

 [ F ]    per campionare il Colore su 20 frame

 [ESC]    per chiudere il programma

 Red   153:[125,181] Hue    57:[ 50, 69] Hue    58:[ 51, 68] Hue    58:[ 51, 68]

 Green 217:[188,241] Satur 174:[ 97,255] Satur 183:[123,255] Satur 202:[144,255]

 Blu    43:[  0, 89] Inten 137:[113,157] Lumin 130:[105,154] Brigh 217:[188,241]

 

 CieXo 255:[255,255]      L*  233:[221,243]

 CieYo 255:[255,255]      u*  104:[ 98,110]     C* = radq(v²+u²)  91:[ 82,100]

 CieZo 255:[255,255]      v*   75:[ 61, 89]     h* = atan (v/u)  177:[172,182]

 

 CieX  150:[127,171]      a*  109:[105,114]     C* = radq(b²+a²) 163:[143,196]

 CieY  203:[177,226]      b*  203:[168,255]     h* = atan (b/a)  213:[206,223]

 CieZ   45:[  2, 90]   

3.2.1      Tabelle riassuntive

A seguito di numerose prove, eseguite in diverse condizioni di luce e con diversi modelli di webcam, ho catalogato in tabelle riassuntive i risultati ottenuti, di cui riporto solo un piccolo esempio:

Webcam Philips SPC230NC - Bilanciamento automatico colore e livello luce manuale

 

GIALLO 

 Red   224:[210,237] Hue    45:[ 44, 48] Hue    46:[ 44, 49] Hue    46:[ 44, 49]

 Green 248:[246,251] Satur 254:[253,255] Satur 254:[252,255] Satur 254:[253,255]

 Blu     0:[  0,  1] Inten 157:[152,162] Lumin 124:[123,125] Brigh 248:[246,251]

 CieXo 255:[255,255]   L*  249:[248,251]

 CieYo 255:[255,255]   u*  114:[111,119] C* = radq(v²+u²) 107:[101,114]

 CieZo 255:[255,255]   v*   99:[ 91,108] h* = atan (v/u)  185:[183,187]

 CieX  186:[179,193]   a*  111:[110,113] C* = radq(b²+a²) 196:[196,197]

 CieY  241:[238,245]   b*  255:[255,255] h* = atan (b/a)  221:[221,221]

 CieZ    2:[  2,  3]

 

AZZURRO

 Red   122:[109,137] Hue   115:[103,125] Hue   114:[104,125] Hue   114:[104,125]

 Green 196:[186,204] Satur  64:[ 46, 81] Satur  97:[ 77,115] Satur  94:[ 76,114]

 Blu   174:[160,191] Inten 164:[157,171] Lumin 159:[151,167] Brigh 196:[186,204]

 CieXo 255:[255,255]   L*  223:[220,226]

 CieYo 255:[255,255]   u*  106:[102,111] C* = radq(v²+u²)  94:[ 87,101]

 CieZo 255:[255,255]   v*   80:[ 70, 90] h* = atan (v/u)  179:[176,183]

 CieX  155:[148,162]   a*  118:[116,121] C* = radq(b²+a²) 124:[122,127]

 CieY  182:[175,188]   b*  130:[125,136] h* = atan (b/a)  194:[192,197]

 CieZ  174:[160,191]

MAGENTA

 Red   184:[172,195] Hue   213:[207,223] Hue   214:[206,224] Hue   214:[206,224]

 Green 106:[ 97,116] Satur  82:[ 68, 97] Satur  91:[ 71,110] Satur 107:[ 90,124]

 Blu   181:[166,195] Inten 157:[150,164] Lumin 145:[139,152] Brigh 185:[174,195]

 CieXo 255:[255,255]   L*  189:[184,194]

 CieYo 255:[255,255]   u*  153:[148,159] C* = radq(v²+u²) 171:[162,181]

 CieZo 255:[255,255]   v*  186:[175,200] h* = atan (v/u)  198:[197,200]

 CieX  159:[152,166]   a*  142:[140,146] C* = radq(b²+a²) 125:[124,127]

 CieY  120:[112,128]   b*  105:[ 99,112] h* = atan (b/a)  178:[176,182]

 CieZ  180:[165,194]

GRIGIO scuro

 Red    39:[ 12, 50] Hue   104:[ 38,162] Hue   102:[ 42,162] Hue   102:[ 42,162]

 Green  45:[ 38, 53] Satur  27:[  0,179] Satur  25:[  0,143] Satur  46:[  0,202]

 Blu    42:[ 10, 57] Inten  42:[ 31, 48] Lumin  42:[ 26, 49] Brigh  46:[ 41, 57]

 CieXo 255:[255,255]   L*  124:[114,130]

 CieYo 255:[255,255]   u*  122:[106,131] C* = radq(v²+u²) 119:[ 94,133]

 CieZo 255:[255,255]   v*  117:[ 80,136] h* = atan (v/u)  188:[179,192]

 CieX   41:[ 28, 48]

 CieY   44:[ 36, 49]   a*  125:[118,130] C* = radq(b²+a²) 127:[119,148]

 CieZ   42:[ 10, 56]   b*  129:[116,173] h* = atan (b/a)  192:[186,206]

3.2.2      Considerazioni

1.    Lo spazio RGB diversifica i colori fondamentali, ma misura differenze non uniformi tra le varie sfumature dello stesso colore, dovute ad esempio alle zone di diversa illuminazione.

2.    La conversione in XYZ tende ad avvicinare fino all'intersezione gli intervalli di variabilità di colori che dovrebbero esser ben distanti.

3.    La calibrazione preliminare di un bianco di riferimento è un'operazione delicata che appesantisce i tempi operativi.

4.    Il bianco di riferimento prevede che NON possano esistere pixel con valori superiori: se, dopo pochi minuti, la luminosità ambientale aumenta, saranno campionati valori che rendono inaffidabili i risultati. 

5.    Le varie misure in L* sono di difficile interpretazione, non riuscendo ad evincere un criterio stabile per il riconoscimento di un colore.

6.    Gli spazi HSI sembrano funzionare bene per il tipo di lavoro che mi sono proposto, salvo presentare valori fuorvianti in situazioni di scarsa luminosità. Nell'esempio una superficie grigio-scuro viene interpretata come un verde acqua.

 

3.3    Scelta dello spazio colore

Senza alcuna pretesa di voler risolvere la diatriba su quale sia il miglior metodo per la rappresentazione dei colori, ritengo per gli scopi del presente lavoro sia più corretto l'utilizzo dello spazio HSI con qualche modifica per compensare le distorsioni dei colori scuri.

Ogni pixel dell'immagine è acquisito dalla webcam come una terna di byte RGB, ciascuno di valore compreso tra 0 e 255:

I pixel scuri e quelli in cui R, G e B sono quasi uguali sono considerati Acromatici con saturazione zero, e tonalità 64 (= 90°):

se   I<30  or   max(R,G,B) - min(R,G,B) < 3

S = 0,    H = 64

viceversa calcoliamo H con piccole riduzioni dei fattori moltiplicativi, per evitare errori di arrotondamento nei casi limite, che potrebbero generare un argomento per l'arcocoseno, maggiore di 1 o minore di -1:

se l'intensità è inferiore ad una soglia fissata (= 100) la saturazione andrà diminuita in proporzione all'intensità: S = S * I / 100 :

 

3.4    Soglie di segmentazione

Un classe-colore può essere rappresentata da un intervallo di valori per ciascuno dei parametri H, S e I.

Fissare limiti rigidi, rischia di tagliar via parti necessarie dell'immagine; viceversa, allargare i margini di segmentazione rischia di far acquisire parti estranee all'argomento.

Eseguiremo perciò una fase preliminare di lettura dei colori significativi, memorizzando i valori minimi e massimi di H, S e I su un campione; la fase di calibrazione sarà necessaria ogni volta che cambiano sostanzialmente le condizioni di illuminazione dell'ambiente.

Acquisito un frame, ogni pixel (in HSI) sarà catalogato in base all'appartenenza ai tre intervalli fissati.

Per Saturazione e Intensità sarà sufficiente porre solo un limite inferiore per l'accettazione. Per la Tonalità occorre invece fissare entrambi i limiti.

Occorre considerare che la tonalità, essendo rappresentata da una posizione angolare ciclica (0 = 256), non ha un minimo o un massimo assoluti; nel valutare le distanze, bisogna considerare che, ad esempio, il tono 3 è vicinissimo al tono 254.

Nell'aritmetica modulo 256, consideriamo un valore minore di un altro se lo 'precede' di meno di 128 passi. Eseguendo una sottrazione il bit 7 indica se il primo numero è minore del secondo; ad esempio:

  7 -  10 = 253    (bit 7 alto :   7  <  10)

 78 -  10 =  68    (bit 7 basso:   78 ³  10)

177 -  10 = 167    (bit 7 alto :  177 <  10)

  5 - 240 =  21    (bit 7 basso:    5 ³ 240)

251 -  18 = 233    (bit 7 alto :  251 <  18)

Quindi, un valore H appartiene ad un intervallo [min, Max],

(con min < Max secondo il criterio prima esposto) se è verificato che

(H-Min) & 80h = 0  e  (Max-H) & 80h = 0

dove & rappresenta l'operazione di and bit a bit.

A seguito delle numerose prove, si ottengono risultati ottimali nella maggior parte delle condizioni usando un intervallo di dimensione 20 per Hue, una soglia minima 60 per la Saturazione e 100 per Intensità.

Nella fase di calibrazione sarà possibile modificare i suddetti valori.

 

3.5    Colori utilizzabili

Nella scelta dei colori fondamentali da utilizzare per il riconoscimento delle forme, occorre osservare alcune regole:

*    L'intervallo di accettazione dei valori H di un colore deve essere ben disgiunto da quello degli altri, anche considerando un ampio margine di tolleranza per margini rilassati.

*    Il colore deve essere sufficientemente saturo da essere distinto dai grigi, anche nelle zone d'ombra.

*    Il colore deve ridurre possibili errori di interpretazione con oggetti simili nella zona operativa: i toni del rosso tendono a confondersi con la pelle o con gli arredi di legno.

*    Il tipo di luce ambientale (diurna, incandescenza, neon) introduce una notevole distorsione nella tonalità percepita dalla webcam.

Per questo lavoro ho scelto di utilizzare tre colori, disposti a 120° sul cerchio Hue: Giallo (42=60°), Cyan (128=180°) e Magenta (213=300°), con un buon margine di tolleranza sulle tinte a disposizione.

L'uso di 4 colori semplificherebbe l'individuazione delle forme, ma potrebbe creare equivoci se le tinte non sono allineate a 90° l'una dall'altra.

 

3.6    Superfici Lambertiane

In ottica la legge del coseno di Lambert afferma che l’intensità di un raggio di luce riflesso da una superficie Lambertiana è direttamente proporzionale al coseno dell’angolo θ con la normale alla superficie.

Di conseguenza, guardando una superficie Lambertiana sotto un qualsiasi angolo, l’occhio umano vedrà la stessa luminosità apparente; questo perché la dimensione apparente della superficie osservata diminuisce con la stessa proporzione. [11] [12]

In realtà le superfici perfettamente diffondenti sono solo teoriche; si avvicinano alle superfici lambertiane i materiali opachi la cui superficie è ruvida e non ha angoli di riflessione ben definiti.

Per costruire dei blob individuabili all'interno di un'immagine è necessario usare materiali flessibili (stoffe) che approssimano le superfici lambertiane, in modo da evitare variazioni di colore a seguito dei movimenti.

 

 

4   Il Guanto colorato

La soluzione proposta è un guanto di stoffa neutra (un qualsiasi guanto di lana nero va benissimo) sulle cui dita sono posizionati dei cappuccetti di stoffa colorata, con colori alternati per le dita adiacenti, lunghi circa 6 centimetri e larghi quanto le dita.

Un altro pezzo di stoffa, cucito al centro del palmo, fungerà da centro di riferimento per la geometria della mano. Qualsiasi combinazione di colori potrà essere usata nella costruzione del guanto, purché si utilizzi un colore per il palmo, un altro per Pollice, Medio e Mignolo, un terzo per Indice e Anulare.

Come vedremo, sarà possibile usare sia la mano destra che la sinistra.

Un guanto di lana è generalmente elastico e può adattarsi a mani più o meno grandi; i cappuccetti, un po' più rigidi, dovrebbero essere costruiti su misura delle dita.

Nel caso di una mano molto piccola o molto grande, anche la lunghezza andrà modificata in proporzione; considerando il costo irrisorio del materiale, è possibile predisporre un ampio campionario di guanti e cappuccetti di tutte le misure.

 

4.1    Gradi di libertà

La ripresa della mano guantata deve avvenire lungo un’asse che sia, grosso modo, perpendicolare al piano del palmo, come in un'icona bizantina;  i sei parametri caratteristici della collocazione tridimensionale del gesto, sono soggetti ai seguenti vincoli:

4.1.1      Traslazione nel piano XY

Gli spostamenti non modificano la geometria del gesto (salvo piccole distorsioni della lente della webcam), purché tutta la mano sia contenuta nel campo visivo. Il margine di manovra si riduce avvicinandosi all'obiettivo.

4.1.2      Traslazione in Z

La coordinata Z non viene esplicitamente misurata, ma occorre tener conto delle conseguenze del movimento in avvicinamento o in allontanamento dall'obiettivo, azioni che ingrandiscono o riducono le misure dell'immagine della mano, anche se conservano tutte le proporzioni.
La minima distanza utile rende il gesto grande quanto l'intero campo visivo, mentre la massima deve garantire un minimo di pixel dopo il campionamento discreto dell'immagine.

4.1.3      Rotazione intorno Z

Le coordinate assolute dei punti di riferimento saranno modificate, ma le distanze relative e gli angoli tra le dita restano invariati, purché né il primo né l'ultimo dito oltrepassi l'asse verticale di riferimento: il movimento rotatorio possibile sarà circa di 270°.

4.1.4      Rotazione intorno X e Y

Le rotazioni intorno agli assi X e Y non possono essere misurate con un'unica webcam. Come conseguenza si ottiene, rispettivamente, uno schiacciamento verticale oppure orizzontale del gesto, con ovvia distorsione delle misure e degli angoli interni; le variazioni sono tollerabili fino a rotazioni di qualche decina di gradi (in entrambi i versi).
Inoltre, quando l'asse di vista non è più perpendicolare al piano della mano, può accadere che un dito occluda parzialmente o totalmente un altro dito, impedendone la misura.

 

 

5   Segmentazione di un'immagine a colori

La Segmentazione è il procedimento che consente di suddividere una immagine R in un certo numero di regioni omogenee  Ri (insiemi di pixel detti blob) rispetto ad una certa proprietà  P(R)  (nel nostro caso, 'appartenenza ad un colore' e 'connessione dei pixel'). [7] [10]

Siano    le regioni connesse individuate:

§                                  l'unione dei blob ricopre l'intera immagine

§          le regioni devono essere disgiunte

§           i pixel di Ri sono di un unico colore

§          blob adiacenti hanno caratteristiche diverse

Regioni diverse possono anche avere le stesse caratteristiche di colore purché siano disconnesse.

In generale il problema della segmentazione delle immagini è legato alla percezione psicofisica dell'uomo e, pertanto, non è possibile risolverlo con una soluzione puramente analitica, ma richiede informazioni accessorie e scelte interpretative che possono, spesso, indurre in errore.

Nel nostro caso, il gesto sarà costituito da un blob di colore 1, due blob di colore 2 e tre blob di colore 3, opportunamente selezionati tra le regioni individuate.

Tutti i pixel non appartenenti ad alcun colore, verranno associati alla regione Sfondo.

 

5.1    Acquisizione

Il trasferimento di un frame immagine dalla memoria della periferica al buffer di lettura avviene con una cadenza programmabile in base al tipo di applicazione.

Aumentare il parametro fps (numero dei Fotogrammi Per Secondo) rende il movimento apparente più fluido, ma richiede un maggior carico computazionale; inoltre il passaggio da un gesto della mano all'altro, per quanto veloce, introdurrebbe situazioni intermedie di indecisione.

Al contrario, aumentare l'attesa tra un frame e il successivo, consente di valutare correttamente ogni singolo gesto, dando il tempo all'utente di posizionare correttamente le dita della mano, ma rischia di mostrare un fastidioso effetto 'a scatti'.

Nel nostro caso, il valore 10 fps (corrispondente alla frequenza di percezione dell'occhio umano) sembra essere un buon compromesso: verrà perciò garantita un'attesa di circa 100 ms tra una lettura e la successiva, introducendo un delay complementare al tempo di elaborazione di un frame. Per computer più lenti (come nel caso di un Netbook) i tempi di elaborazione dell'immagine si allungano fino a 120-140 ms, ottenendo un refresh di 7-8 fps, che risulta comunque accettabile.

 

5.2    Risoluzione immagine

Le telecamere disponibili oggi sul mercato, offrono svariate combinazioni di risoluzione, prestazioni, qualità, ecc…; operare con immagini ad alta risoluzione permette maggior precisione di intervento, ma richiede, ovviamente, un maggior carico computazionale.

Per uniformare le operazioni, rendendole indipendenti dall'hardware a disposizione, ho scelto di trasformare qualunque immagine in una risoluzione prefissata, con 3 byte per pixel. Ma quale scegliere ?

Innanzitutto, non avendo informazioni dai produttori hardware, ho fatto qualche semplice rilevamento sperimentale, posizionando un oggetto di dimensioni conosciute in posizioni diverse, fino a ricoprire esattamente la larghezza dell'immagine (analoga operazione per l'altezza) e misurando la distanza dell'oggetto dall'obiettivo:

       

Mediamente tutte le webcam che ho esaminato hanno un angolo di visuale di 40° in orizzontale e 30° in verticale.

Considerando che una mano (con guanto colorato) occupa almeno un quadrato di 22 cm, e volendo lasciare un margine di qualche centimetro per il movimento, si deduce che la distanza operativa minima è circa 50 cm.

Allontanandosi dall'obiettivo, i particolari si riducono in proporzione; la misura in pixel rilevata dipende dalla risoluzione del sensore:

Volendo operare ad una distanza massima di 150 cm (una scrivania) ed ottenere che un oggetto di 3 cm di spessore (le dita) misuri almeno 8 pixel (valore empirico per riuscire a compensare i disturbi)

Arrotondando al formato 4:3 standard 320 x 240 pixel, si ottiene un buon compromesso tra qualità d'immagine e prestazioni.

5.3    Sfocatura

Anche utilizzando telecamere di qualità, le immagini sono affette da jitter più o meno pronunciato, che si manifesta con una oscillazione di luminosità dei pixel, nonché con un leggero tremolio degli stessi.

L'acquisizione di due frame successivi per volta, mediando i pixel corrispondenti, rende il tremolio quasi impercettibile nelle immagini statiche, ma riduce drasticamente le prestazioni e, soprattutto, introduce una vistosa scia nei cambiamenti di gesto.

Un risultato migliore si ottiene applicando una leggera sfocatura del frame (blurring) con un filtro lineare 3x3. In tal modo, si riducono rumore e piccoli dettagli irrilevanti, e si evidenziano maggiormente le grandi aeree uniformi (blob) che corrispondono alle componenti del gesto (dita).

Per ogni pixel dell'immagine, e per ogni canale RGB, sarà effettuata la media tra il pixel e gli otto vicini in orizzontale, verticale e diagonale, assegnando il risultato al pixel centrale.

 

1

1

1

1/9 x

1

1

1

 

1

1

1

 

5.4    Campionamento e sottrazione dello sfondo

Un errore solitamente presente nell'interpretazione delle immagini è dovuto alla presenza di elementi di disturbo sullo sfondo, spesso dello stesso colore delle dita colorate del guanto.

Se consideriamo lo sfondo statico e con illuminazione costante, è possibile campionare lo sfondo per poi procedere alla sua eliminazione dai frame successivi; occorre tener presente che le oscillazioni dei valori acquisiti dalla webcam (jittering) rendono necessario l'esame di una sequenza di frame della durata di qualche secondo.

A tale scopo, predisponiamo due spazi di memoria (array) delle medesime dimensioni di un frame e, per ogni pixel dell’immagine, memorizziamo i valori minimi e massimi misurati sui canali Red, Green e Blu nell'arco della prova (alcune decine di frame): l'utente sceglie quando è opportuno interrompere il campionamento.

L’immagine Differenza tra i valori massimi e i valori minimi, mostrata solo durante il campionamento dello sfondo, mostra quanto possa oscillare la misura RGB in un’inquadratura apparentemente statica.

      

Nella fase operativa, ogni frame acquisito dalla webcam sarà esaminato per l’eliminazione dello sfondo: tutti i pixel con coordinate RGB che rientrano nell’intervallo [minimo, Massimo] campionato per quella posizione, verranno eliminati (ovvero portati a Nero 000):

A seguito di prove eseguite in diversi spazi colore, la sottrazione dello sfondo influisce solo leggermente sulle prestazioni complessive, ma dà risultati assai positivi operando nello spazio RGB.

Difatti l'eliminazione di elementi di disturbo riduce il successivo numero delle operazioni di interpretazione.

La procedura fallisce se l'illuminazione dello sfondo cambia a causa di:

·     adattamenti automatici dell'esposizione della webcam;

·     ombre dovute al movimento dell'operatore;

·     movimenti sullo sfondo.

Piccole interruzioni negli oggetti, quando i pixel coincidono con lo sfondo, saranno eliminate nelle fasi successive.

   

 

5.5    Sogliatura dei colori: Pixel Certi e Probabili

Per suddividere l’immagine nei diversi componenti sono stati proposti innumerevoli algoritmi, più o meno efficaci, in base alle caratteristiche delle specifiche applicazioni. [7] [8] [9]

Nel problema in esame, dovendo operare in real time, l’esigenza fondamentale è la velocità computazionale; useremo dunque un algoritmo relativamente semplice, valutando che metodi più complessi porterebbero a miglioramenti insignificanti nella scomposizione dell’immagine.

5.5.1      Conversione HSI

Ogni frame acquisito, eventualmente ripulito dallo sfondo, viene innanzitutto convertito dallo spazio colore RGB allo spazio HSI, utilizzando le formule di conversione proposte al paragrafo 3.3.

5.5.2      Segmentazione

La prima fase della segmentazione consiste nella ricerca dei pixel appartenenti a ciascuno dei tre colori catalogati, in modo da costruire una maschera (a quattro valori) che indichi per ogni pixel l'appartenenza allo sfondo o ad uno dei tre colori.

Utilizzeremo un intervallo [minimo, Massimo] per selezionare la Tonalità, ed un livello minimo per la Saturazione e per l'Intensità.

Una soglia di accettazione rigida consente di eliminare oggetti spuri, ma elimina anche tutte le zone periferiche degli oggetti, a causa dell'ombreggiatura 3D.

Viceversa, un criterio di selezione più rilassato, rischia di prendere in considerazione anche componenti di disturbo.

Distinguiamo inizialmente i pixel in tre categorie:

·     Pixel certamente appartenenti ad un colore catalogato (soglia rigida);

·     Pixel probabilmente appartenenti ad un colore (soglia rilassata, ottenuta raddoppiando la dimensione dell'intervallo Hue e riducendo la soglia minima per intensità e saturazione);

·     Pixel dello sfondo (tutti i restanti).

I pixel probabili, che siano adiacenti a pixel certi, saranno accettati come parte del gesto, viceversa saranno considerati appartenenti allo sfondo.

L'algoritmo procede in due passate:

1.    Nella prima passata, procedendo sul frame dall'alto verso il basso e da sinistra verso destra, per ogni colore c, etichettiamo i pixel come 'Certi' (valore = c), 'Probabili' (valore = c+16) o 'Sfondo' (valore = 0).

2.    I pixel Probabili che sono 8-connessi in alto e a sinistra con pixel Certi, sono immediatamente promossi a 'Certi'.

3.    Nella seconda passata si esamina solo la maschera delle etichette, procedendo dal basso verso l'alto e da destra verso sinistra: promuoviamo a 'Certi' tutti i pixel 'Probabili' che sono 8-connessi in basso e a destra con pixel certi equivalenti (l’etichetta viene conseguentemente modificata, sottraendo 16).         

4.    I pixel probabili non connessi con pixel certi sono assegnati allo sfondo.

Al termine la Maschera possiede solo valori 0 per lo sfondo e valori 1, 2, 3 per i blob che potrebbero formare il gesto.

 

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

3

3

3

3

o

o

o

o

o

o

o

o

o

o

o

o

o

o

1

1

1

o

o

3

3

3

3

3

3

o

o

2

2

2

2

o

2

o

o

o

o

o

1

1

1

o

o

3

3

3

3

3

3

o

o

2

2

2

o

o

o

o

o

o

o

o

1

o

1

o

o

o

3

3

3

3

o

o

o

2

2

2

2

o

o

o

o

o

o

o

1

1

1

o

o

o

o

o

o

o

o

o

o

2

2

2

2

o

o

o

o

o

o

o

1

1

1

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

1

1

1

o

o

o

2

2

2

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

1

1

1

o

o

o

2

2

2

2

o

o

o

o

3

3

o

o

3

o

o

o

o

o

o

o

o

o

o

o

2

2

2

2

o

o

o

3

3

3

3

o

o

o

o

o

o

o

o

o

o

o

2

o

o

2

2

2

o

o

o

3

3

3

3

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

o

 

 

5.6    Eliminazione disturbi

Per eliminare i piccoli disturbi e per riempire i buchi nell'immagine, ricorriamo agli operatori della Morfologia Binaria, adattati al caso di una maschera a quattro valori. [7]

Basandoci sulla matrice della maschera costruita, vista come un sottoinsieme dell’insieme 2D dei numeri interi N2 definiamo:

A: gli insiemi dei punti dell’immagine marcati con il valore i, per i=1,2,3.

A0 : l’insieme dei punti dello sfondo

B :  un insieme detto elemento strutturante, rappresentato con valori binari in una matrice 2D, con l’origine in un punto qualsiasi.

o

o

1

o

o

o

1

1

1

o

1

1

1

1

1

o

1

1

1

o

o

o

1

o

o

 

Gli operatori morfologici manipolano la forma degli oggetti dell’immagine secondo la “forma elementare” definita dall’elemento strutturante.

5.6.1      Dilatazione

L’operazione di Dilatazione (detta anche Somma di Minkowsky) è definita come

A Å  B = { c Î N2 :  c = a + b ,  a Î A  e  b Î B }

ovvero, sovrapponendo l’origine dell’elemento strutturante ad ogni punto dell’immagine, l’immagine stessa si espande inglobando i punti dello sfondo coperti dai punti dell’elemento strutturante. [7]

Nel problema in esame, ogni blob colorato (insiemi A1, A2 e A3) può espandersi solo a spese dello sfondo e non degli altri colori. Saranno utilizzati due elementi strutturanti simmetrici con l’origine al centro: un quadrato 3x3 (9 pixel) ed un rombo 5x5 (13 pixel):

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

L’algoritmo di dilatazione sviluppato agisce in due passate, per ciascuno degli elementi strutturanti:

1.    scorrendo la maschera in un verso qualsiasi, ogni pixel colorato dell’immagine prelaziona gli 8 pixel intorno (vexed area) che siano vuoti, marcando i 4 bit più alti di ogni byte; in caso di competizione, vince il primo colore arrivato.

2.    scorrendo nuovamente la maschera, ogni pixel con i 4 bit bassi nulli (ovvero inizialmente vuoto) viene promosso al colore del primo oggetto che lo ha prelazionato, shiftando a destra i 4 bit più alti; quelli non prelazionati restano appartenenti allo sfondo.

Due successive dilatazioni con un quadrato 3x3 ed un rombo 5x5, corrispondono ad una dilatazione con un cerchio di raggio tre (37 pixel) che porterebbe ad un risparmio del 30% del tempo; due piccole dilatazioni successive, però, fanno crescere più uniformemente gli oggetti vicini di diverso colore.

5.6.2      Erosione

L’operazione di Erosione (detta anche Sottrazione di Minkowsky) è definita come

A y B  = { c Î N2 :  c + b Î A,  per ogni  b Î B }

ovvero, l’elemento strutturante viene posizionato su ogni punto P dell’immagine e, se l’elemento strutturante è completamente sovrapposto a punti dell’immagine, il punto P viene conservato nella nuova immagine.

L'erosione di un’immagine corrisponde alla dilatazione dello Sfondo, scambiando il ruolo dello sfondo e degli oggetti.   Useremo come elemento strutturante un cerchio raggio 3 di 37 pixel;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I contorni degli oggetti presenti sono contratti di tre pixel in orizzontale e verticale e due in diagonale, assegnando cioè allo sfondo tutti i punti che hanno almeno un vicino nullo a distanza inferiore a 3.2 pixel.

L'algoritmo di erosione sviluppato agisce in due step:

1.    scorrendo la maschera dall'alto in basso e da sinistra verso destra, ogni pixel dello sfondo lascia una scia portando a 0 i nove pixel superiori:

 

 

 

 

 

 

 

 

 

 

 

 

o

o

o

 

 

 

 

 

o

o

 

o

o

 

 

 

 

 

o

 

o

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

 

 

2.    scorrendo la maschera dal basso verso l’alto e da destra verso sinistra, ogni pixel dello sfondo lascia la scia portando a 0 sette pixel inferiori:

 

 

 

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

o

 

o

 

 

 

 

 

 

o

 

o

 

 

 

 

 

 

o

o

o

 

 

 

 

 

 

 

 

 

 

 

 

I pixel già modificati nel primo passo, permettono di ricoprire correttamente tutta la superficie del cerchio.

5.6.3      Apertura e Chiusura

Eseguiamo sulla maschera delle etichette-colore un'operazione di Apertura ottenuta con la successione di un’erosione con il cerchio di 37 pixel, una dilatazione con il quadrato di 9 pixel, una dilatazione con il rombo di 13 pixel: in questo modo vengono eliminati i disturbi di spessore fino a 6 pixel.

Eseguiamo ora un’operazione di Chiusura, ovvero, in successione, una dilatazione con il quadrato di 9 pixel, una dilatazione con il rombo di 13 pixel, un'erosione con il cerchio di 37 pixel: in questo modo vengono riempiti i fori ed uniti gli elementi con spazi fino a 6 pixel.

Il valore di soglia di 6 pixel utilizzato è la misura sperimentale che sembra dare i migliori risultati, nell’ambito della risoluzione immagine scelta al paragrafo 5.2.

 

5.7    Ricerca delle componenti connesse

I pixel colorati dell'immagine saranno ora raccolti in Componenti Connesse (blob), costruendo la maschera delle Label.

L'algoritmo sviluppato etichetta le componenti 8-connesse con un contatore progressivo NextLabel, inizialmente pari a 1.

L'immagine presente nella maschera dei colori viene esaminata in una sola passata, dall'alto in basso e da sinistra verso destra:

v   ogni pixel di colore 0 (sfondo) è etichettato con Label = 0;

v   ogni pixel colorato viene confrontato solo con i vicini di sinistra e del rigo superiore (i quali hanno già una Label assegnata) verificando se il colore dei pixel sia lo stesso:

 

 

 

 

 

 

 

 

 

L2

L3

L4

 

 

 

 

L1

P

 

 

 

 

 

 

 

 

 

 

o    se nessuno dei quattro vicini è dello stesso colore del punto esaminato, etichettiamo il pixel con una nuova Label (e incrementiamo il contatore);

o    se uno o più vicini sono dello stesso colore del punto esaminato, con la stessa label, etichettiamo anche il nostro pixel con quella label.

o    se due vicini hanno lo stesso colore del pixel, ma label differenti, una delle due etichette verrà sostituita con l'altra su tutti i pixel già esaminati dell’immagine; questo caso è assai poco probabile, visto che i blob utilizzati sono convessi.

o    non possiamo trovare più di due vicini dello stesso colore ma con label differenti, poiché punti 8-connessi hanno già la stessa etichetta; gli unici casi sono L1-L4 e L2-L4 .

Viene così costruita la maschera Label, in cui le componenti connesse sono etichettate da 1 al massimo valore raggiunto dal contatore, anche se, al termine, non tutti i valori intermedi risultano assegnati.

Le etichette sono rappresentate con un Byte, quindi non sono accettati più di 255 blob, anche se, in pratica, saranno esaminati al più qualche decina di componenti per frame.

 

5.8    Scelta delle componenti connesse

Le componenti connesse trovate possono essere o no parte del gesto.

In primis, accettiamo come zone possibilmente associabili ad una parte del gesto, quelle di area non inferiore ad un valore prestabilito di 110 pixel;  il valore 110 approssimativamente pari alla superficie di un ovale 8x16, è stato ricavato sperimentalmente come la soglia più efficace per scartare oggetti gli estranei al gesto, riconoscendo però i blob del guanto posto a distanza fino a 1,5 metri dalla webcam.

Di ogni zona accettata calcoliamo il Baricentro come media delle coordinate X e Y di tutti i pixel del blob.

Suddividiamo quindi in tre gruppi le zone, in base al colore: per poter procedere occorre disporre almeno di una zona per il colore 1 (Palmo), due zone per il colore 2 (Indice e Anulare) e tre zone per il colore 3 (Pollice, Medio e Mignolo). Ordiniamo le zone in base all’area (decrescente).

Come vedremo in seguito, distinguiamo due situazioni:

1.    Nella fase di addestramento supervisionato, sotto il controllo dell’operatore, scegliamo la zona più ampia del colore 1 e la associamo al palmo; prendiamo quindi le due zone più ampie di colore 2 e le tre più ampie di colore 3. Ordiniamo le dita in base alla posizione angolare rispetto al palmo e valutiamo (a occhio) se il gesto è significativo e, quindi, degno di essere archiviato.

2.    Nella fase operativa, è necessario interpretare in modo automatico la giusta combinazione di zone che potranno formare un gesto.    Pertanto prendiamo, se disponibili, anche un certo numero di zone in esubero per ciascun colore e valutiamo tutte le combinazioni possibili, scegliendo quella che più si avvicina ad un gesto significativo.   Con una zona in più per ogni colore, occorre esaminare 24 combinazioni, con due zone in più, le combinazioni diventano 180.        Ovviamente, con pochi disturbi, le combinazioni saranno pochissime.

 

5.9    Dimensioni

Se supponiamo che ogni segmento dell'immagine, valutato come dito, abbia la forma di un ellisse con rapporto lunghezza:larghezza pari a 2:1, possiamo dedurne le dimensioni in base all’area in pixel. Detti a la semiasse minore e b=2a la maggiore:

In realtà, ogni cappuccetto del guanto (come indicato al cap. 4) avrà più la forma di un salsicciotto, sempre con rapporto lunghezza:larghezza = 2:1.  La forma regolare più simile, è composta da due semicerchi di raggio a, separati da un quadrato di lato b=2a. La dimensione approssimata del dito, in base all'area in Pixel, sarà più fedelmente ottenuta con:

La media delle dimensioni approssimate dei cinque cappuccetti può essere assunta come unità di misura per le distanze tra i baricentri delle dita e il baricentro del palmo: l’esame diretto del guanto usato, supportato da numerose verifiche sulle immagini catturate, mostra che la misura della distanza varia tra 0 e 3.

Se si elimina il fattore moltiplicativo 1.496 nel calcolo delle singole lunghezze, i blob sembreranno più corti e le distanze misurate aumenteranno in proporzione, distribuendosi in un campo da 0 a 5.

Per evitare inutili operazioni, si userà come unità di misura direttamente la Somma delle misure dei cinque blob delle dita; in tal modo le distanze interne saranno automaticamente normalizzate tra 0 e 1.

Come verificato in varie prove, l’apparente superficialità delle scelte suddette non inficia minimamente i risultati ottenuti, rivelandosi il modo più efficace per l’analisi del gesto.

 

5.10  Coordinate polari

Le coordinate dei Baricentri dei blob sono trasformate in coordinate polari nel sistema di riferimento centrato nel palmo, con l’asse 0° rivolta verso il basso.

Ordiniamo i blob secondo l’angolo teta, in base alla mano utilizzata (indicazione che l’utente dovrà selezionare opportunamente).

Considerando che l'immagine verrà ruotata a specchio per facilitare il controllo da parte dell'utente, avremo:

 

5.10.1   Mano Destra

ordiniamo i tre blob di colore 3 in verso decrescente e li assegniamo a Pollice (teta massimo), Medio e Mignolo; analogamente ordiniamo i due blob di colore 2 in verso decrescente e li assegniamo a Indice e Anulare.

5.10.2   Mano Sinistra

ordiniamo i tre blob di colore 3 in verso crescente e li assegniamo a Pollice (teta minimo), Medio e Mignolo; analogamente ordiniamo i due blob di colore 2 in verso crescente e li assegniamo a Indice e Anulare.

 

In base all'angolo di posizionamento delle dita, è possibile calcolare i quattro angoli intermedi: questo valore è invariante, anche se ruotiamo il gesto intorno all'asse di visuale della webcam (asse Z), purché nessuna delle dita oltrepassi l'asse verticale di riferimento 0°.

 

5.11  Estrazione di Feature Invarianti

Le informazioni estrapolate dall'immagine del gesto possono essere considerate Feature Invarianti per Traslazione e/o Rotazione nel piano XY, nonché traslazione lungo l'asse Z (Allontanamento e Avvicinamento).

I risultati ottenuti, sono pressoché uguali utilizzando sia la mano destra, sia la sinistra (a patto di comunicare al programma la mano giusta!).

5.11.1   Normalizzazione delle distanze

Come visto al paragrafo 5.9, la distanza in pixel tra il baricentro di un dito e il baricentro del palmo è divisa per la somma delle lunghezze dei cinque cappuccetti colorati, ricavando un valore normalizzato tra 0 e 1 (in genere valori inferiori a 0.5 indicano un dito chiuso, oltre 0.5 un dito aperto); valori superiori ad 1, vengono comunque forzati al limite dell'intervallo.

5.11.2   Normalizzazione degli angoli

L'angolo tra due dita consecutive non può certamente superare 90°, ovvero 1.5708 radianti. Useremo perciò l'angolo retto per normalizzare in [0,1]; eventuali valori negativi (esempio il pollice che scavalca l'indice) vengono portati a zero.

5.11.3   Feature

Saranno elaborate le nove feature fondamentali:

1.   distanza del pollice dal palmo

2.   distanza dell'indice dal palmo

3.   distanza del medio dal palmo

4.   distanza dell'anulare dal palmo

5.   distanza del mignolo dal palmo

6.   angolo tra pollice e indice (vertice nel palmo)

7.   angolo tra indice e medio   (    "    "    "  )

8.   angolo tra medio e anulare  (    "    "    "  )

9.   angolo tra anulare e mignolo(    "    "    "  )

In letteratura sono state proposte numerose altre caratteristiche invarianti (quali i momenti o la rappresentazione tramite curve [8]) ma la loro elaborazione appesantisce notevolmente i calcoli, senza apportare, nel nostro caso, sufficienti migliorie.

 

 

6   Classificazione dei Gesti

 

6.1    Definizioni

La classificazione è un processo che consente di ripartire un insieme di oggetti in classi di equivalenza in base a caratteristiche fissate a priori.

La struttura delle classi dovrà essere tale da poter stabilire se un oggetto appartiene ad una delle classi o no.

Un sistema di riconoscimento che utilizzi la classificazione è strutturato in due parti fondamentali:

1.    Un modulo di Apprendimento Automatico, per acquisire i campioni da memorizzare in un opportuno Data Base, estraendone le caratteristiche significative e suddividendoli in classi.

2.    Un modulo Classificatore che associ le caratteristiche di un nuovo oggetto acquisito ad una delle classi archiviate, tramite una funzione di decisione.

6.1.1      Apprendimento Automatico

Tra le varie forme di apprendimento automatico, in questo lavoro è utilizzato l’Apprendimento per Esempi che consiste nel fornire al sistema un elenco di esempi, statisticamente rappresentativi dell’insieme di dati su cui il classificatore dovrà poi operare. [13]

Il lavoro di apprendimento sarà Supervisionato dall’utente (learning with a teacher): ogni campione (gesto) acquisito sarà etichettato a cura dell’utente con il nome della classe di appartenenza .

Anche il numero p delle classi da utilizzare è deciso dall’utente.

Da ogni gesto, come visto al paragrafo 5.11.3, è estratto il vettore  delle caratteristiche numeriche, dette feature, ove d è il numero delle feature estratte per ogni campione.

Chiameremo training set l’insieme

L’algoritmo di addestramento deve separare i dati in regioni di decisione, cioè in zone in cui la classe di appartenenza rimane costante al variare del nuovo vettore di feature in ingresso.

Ogni regione dello spazio multidimensionale esaminato sarà rappresentata da un punto detto Centroide, non necessariamente appartenente al training set, cui è associata una classe di appartenenza .

Chiameremo Codebook l'insieme  dove k«n; l'insieme M è rappresentativo delle regioni di decisione del training set; il generico elemento (mi,vi)ÎM sarà chiamato codevector.

6.1.2      Classificazione

Durante la fase operativa, da ogni gesto acquisito sono estratte le d caratteristiche significative.

Il gesto sarà classificato attribuendogli la classe del codevector più vicino, considerando la distanza euclidea multidimensionale

Poiché al riconoscimento del gesto è associata un’azione, si è dovuto definire un meccanismo di scarto al fine di rendere più robusto possibile il sistema.

Per evitare la possibilità di classificare erroneamente un elemento estraneo, si è pensato di fissare una soglia massima di accettazione per la distanza;  se il centroide più vicino dista più del valore di tale soglia, il gesto acquisito non è classificato affatto e, perciò, scartato (rejected).

 

6.2    Modulo di Apprendimento

Durante la fase di istruzione, l’utente ha la responsabilità della corretta associazione di ogni gesto acquisito alla relativa etichetta di classe.

Le operazioni ciclicamente eseguite in questa fase sono:

1.    Acquisizione di un frame dalla webcam, sottrazione dello sfondo e trasformazione dell’immagine nello spazio HSI.

2.    Segmentazione dell'immagine nelle componenti connesse dei tre colori catalogati, con eliminazione di piccoli disturbi (paragrafo 5.6).

3.    Se possibile, viene scelta la più ampia zona del colore 1 ed associata al palmo; le due zone più ampie di colore 2 e le tre più ampie di colore 3 sono associate alle cinque dita, che sono ordinate in base alla posizione angolare rispetto al palmo (paragrafo 5.8).

4.    Il risultato è mostrato all'utente che può decidere di 'congelare' l'immagine per archiviare il campione.

5.    Su decisione dell'utente, che indica anche l'etichetta da usare (carattere), viene aggiunto all'archivio SignImg.db la maschera delle etichette delle componenti connesse (un byte per pixel).     Il primo byte di ogni record, indica il carattere associato al gesto (numeri 48..57 o lettere 65..90 per un totale di 36 simboli possibili; il simbolo è incrementato di 128 per indicare un gesto della mano Sinistra), mentre in ogni altro pixel del frame, i 4 bit bassi indicano il colore, mentre i 4 bit alti indicano il dito di appartenenza.  Tutte le altre informazioni già elaborate (aree, distanze e angoli), vanno perse e andranno ricalcolate nella fase successiva.

Viene così costruito un archivio di immagini che, per poter fornire informazioni sufficientemente attendibili, dovrà contenere decine di campioni per ciascuno dei segni da riconoscere.

Il file SignImg.db ha un formato 'proprietario' e quindi non è modificabile con un qualsiasi editor; nel software sviluppato sono presenti le funzioni:

Ø    Visualizzazione dell’archivio dei gesti (in modalità 'a falsi colori');

Ø    Eliminazione di eventuali frame erroneamente acquisiti;

Ø    Unione di due archivi acquisiti in momenti diversi.

 

6.3    Estrazione Feature

L'archivio SignImg.db viene trasformato in un elenco di dati a nove dimensioni, corrispondenti alle feature significative, invarianti per mano destra o sinistra, per rotazione e per traslazione.

Supponiamo che in ogni record sia correttamente memorizzata la maschera di 76800 byte rappresentativa dei sei blob di un gesto, con i pixel etichettati da 1 a 6: il blob numero 1 è associato al palmo, il 2 al pollice, il 3 all'indice, il 4 al medio, il 5 all'anulare, il 6 al mignolo.

1.    calcola il baricentro, l'area e la lunghezza dei sei blob (paragrafo 5.9);

2.    calcola le coordinate polari delle dita rispetto al palmo (paragrafo 5.10);

3.    calcola i quattro angoli interni tra le dita (il verso dipende dalla mano, se destra o sinistra);

4.    normalizza le cinque distanze tra i baricentri delle dita e il palmo, in base alla somma delle dimensioni dei blob delle dita (paragrafo 5.11.1);

5.    normalizza i quattro angoli interni in base all'angolo retto (massimo angolo possibile, paragrafo 5.11.2);

6.    crea il record di 10 campi separati da spazi: nove feature normalizzate tra 0 e 1, più l'etichetta del campione (paragrafo 5.11.3); i campi sono numerati a partire da [0], secondo la sintassi del linguaggio C.

[0] distanza del pollice dal palmo

[1] distanza dell'indice dal palmo

[2] distanza del medio dal palmo

[3] distanza dell'anulare dal palmo

[4] distanza del mignolo dal palmo

[5] angolo tra pollice e indice  (vertice nel palmo)

[6] angolo tra indice e medio   

[7] angolo tra medio e anulare

[8] angolo tra anulare e mignolo

[9] carattere ASCII di riferimento

 

Al termine otteniamo il file Feature.db (il primo record riporta l'indicazione del numero delle dimensioni):

9 lvq

0.47974 0.35947 0.30230 0.28202 0.30953 0.11097 0.20340 0.27651 0.25967 A

0.41685 0.31726 0.24934 0.26641 0.28778 0.13681 0.22432 0.28666 0.25529 A

0.44499 0.35739 0.29619 0.31131 0.32139 0.14274 0.17467 0.25134 0.21320 A

0.37216 0.51287 0.61962 0.63305 0.59972 0.34618 0.18338 0.14984 0.16798 B

0.40383 0.61904 0.64243 0.59843 0.51592 0.25771 0.14792 0.13598 0.16956 B

0.53150 0.63559 0.24721 0.19832 0.54351 0.53004 0.00000 0.37693 0.16569 C

: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

 

6.4    Codebook

Per costruire il codebook, è utilizzato LVQ (Learning Vector Quantization), un algoritmo supervisionato per la classificazione dei dati multidimensionali basato sulla creazione di uno o più codevector per ciascuna delle classi in cui deve essere suddiviso l'insieme dei dati:  un punto apparterrà alla classe del codevector più vicino. [14]

L'algoritmo di LVQ si sviluppa nei seguenti passi:

1.    Inizializza il codebook M, scegliendo casualmente k punti all’interno del training set; il vincolo è che esista almeno un punto per ogni classe;  k deve essere determinato empiricamente: per default poniamo  k = 2 p.

2.    Fissa il numero delle iterazioni T, solitamente pari a circa 30-40 volte il numero n dei campioni. Inizializza un contatore t = 1.

3.    Sceglie casualmente un campione  (x,y)Î S

4.    Trova il centroide (m,v)ÎM tale che sia minima la distanza tra x e m, ovvero cerca il vicino più prossimo.

5.    Se il vicino m appartiene alla stessa classe di x, m è 'leggermente' avvicinato ad x; viceversa, m è 'leggermente' allontanato.

gli altri codevector restano invariati; il valore di α(t) (learning rate) deve decrescere linearmente con t; un valore iniziale, valutato sperimentalmente, può essere  α(0) = 0.05.

6.    Se t < T incrementa t e ripeti dal passo 3.

6.4.1      LVQ  Software

L'algoritmo LVQ è implementato in un package (scaricabile da [15

])  composto di vari eseguibili, ciascuno corrispondente ad una funzione differente. Per costruire un codebook con LVQ occorre:

A.   Inizializzare il codebook con il comando

propinit -noc 26 -din Feature.db -cout Temp1.db -knn 3

dove -noc indica il numero iniziale dei codevector (empiricamente pari al doppio del numero delle classi), -din indica il file con il training set,  -cout assegna il nome del codebook da creare;     tutti i punti iniziali usati devono rientrare nei confini della classe corrispondente: -knn 3 verifica che almeno i tre campioni più vicini ad ogni codevector appartengano alla stessa classe.

B.   Trasformare il primo file temporaneo cercando di distribuire al meglio i prototipi in modo da uniformare le distanze dei campioni dal centroide; nelle classi in cui la mediana delle distanze dal centroide è maggiore della media, un nuovo prototipo è aggiunto; viceversa, in quelle ove la mediana delle distanze è più piccola della media, viene eliminato qualche prototipo (lasciandone sempre almeno uno per classe):

balance  -din Feature.db -cin Temp1.db  -cout Temp2.db

l'output sulla console di sistema sarà del tipo

Some codebook vectors are removed

Some new codebook vectors are picked

Codebook vectors are redistributed

In class         P   6 units, min dist.: 0.109

In class         A   5 units, min dist.: 0.245

In class         B   3 units, min dist.: 0.207

: : : : :        : : : : : : : : : : : : : : :

In class         C   1 units, min dist.: 0.000

In class         F   1 units, min dist.: 0.000

 

C.   Eseguire il programma di addestramento vero e proprio:

olvq1 -din Feature.db -cin Temp2.db

      -cout CnTable.db -rlen 18000 -alpha 0.05

Il secondo file temporaneo è trasformato nel codebook definitivo con l'algoritmo LVQ; -rlen indica il numero delle iterazioni (assai superiore al numero dei campioni che, quindi, saranno usati molte volte);  -alpha è il valore iniziale del parametro α(t).

D.  L'affidabilità del codebook ottenuto può essere misurata con il comando

accuracy -din Feature.db -cin CnTable.db

che valuta il numero dei campioni del file indicato da -din che sono correttamente assegnati alla loro classe;          l'output sulla console di sistema sarà del tipo

Recognition accuracy:

        P:   97 entries 100.00 %

A:  109 entries 100.00 %

        4:   42 entries  83.33 %

       : : : : : : : : : : : : :

        Y:   41 entries 100.00 %

        3:   40 entries  97.50 %

        L:   39 entries 100.00 %

        F:   23 entries 100.00 %

Total accuracy:  391 entries  96.53 %

 

 

6.5    Modulo Classificatore

Esaminiamo ora la fase operativa relativa all'Interpretazione di un gesto, tramite la ricerca nella tabella dei Centroidi.

Mentre nella fase di addestramento si agisce sotto il controllo diretto dell'operatore, nella fase di classificazione è necessario interpretare in modo automatico la giusta combinazione dei blob colorati che possono formare un gesto.       Le operazioni ciclicamente eseguite sono:

1.    Acquisizione di un frame dalla webcam, sottrazione sfondo e trasformazione nello spazio HSI.

2.    Segmentazione dell'immagine nelle componenti connesse dei tre colori catalogati, eliminazione piccoli disturbi.

3.    Se esistono, vengono scelte tra le più ampie, fino a tre zone del colore 1, fino a quattro zone di colore 2 e fino a cinque di colore 3; in pratica tra componenti connesse individuate sono estratti fino a due blob in esubero per ciascun colore; elaboriamo tutte le combinazioni possibili di un blob di colore 1, due di colore 2 e tre di colore 3:

Con pochi disturbi, il numero dei blob supererà di poco il numero necessario e quindi le combinazioni da esaminare saranno pochissime.   Ciascuna delle combinazioni viene valutata come un gesto, calcolando aree, distanze ed angoli, da cui estrarre le nove feature invarianti; cerchiamo quindi il centroide più vicino nel codebook (distanza Euclidea 9D).

Sceglieremo la combinazione che più si avvicina ad un gesto significativo. Per evitare di accettare comunque un gesto privo di significato, occorre fissare un limite superiore alla distanza.

L’utente inserisce un fattore di tolleranza tra 0 e 100 che sarà associato alla distanza massima ammessa tramite una tabella.

4.    Se è stato interpretato un gesto, il risultato è mostrato all'utente, in modalità 'falsi colori'.

5.    Se previsto, viene eseguita l'azione associata al gesto.

6.5.1      Errori di Interpretazione

Come in altri problemi di classificazione, occorre valutare il rischio di interpretazioni errate.

Per evidenziare la peculiarità del problema in esame, vediamo qualche esempio di confronto con un problema simile, quale il riconoscimento automatico di caratteri:

ü    I caratteri vengono acquisiti a blocchi, separati dal nulla (uno spazio bianco), mentre tra due gesti consecutivi la mano non può sparire!

ü    Un carattere illeggibile deve essere comunque interpretato per dare un senso alla parola, mentre un gesto sconosciuto sospende semplicemente l’acquisizione dei comandi.

ü    Le parole possono essere confrontate con un dizionario per verificarne la coerenza.

ü    I caratteri sono generalmente allineati, in modo da poter scartare lo sporco della pagina, mentre nell’immagine del gesto i disturbi di sfondo possono essere presenti ovunque.

Fondamentalmente possiamo individuare tre tipi di errore:

Un elemento valido non è riconosciuto

In questo caso il sistema di interpretazione non compie alcuna azione, rimandando le operazioni all’istante in cui il gesto divenga riconoscibile; questo sembra essere la situazione meno pericolosa.

Un elemento valido è classificato in modo errato

L’algoritmo LVQ è strutturato in modo da ridurre il più possibile questa eventualità. La funzione accuracy (paragrafo 6.4.1.D) fornisce un indice dell’affidabilità del codebook in base ad un training set fornito.

Un disturbo è classificato come un elemento valido

Questa è la condizione più pericolosa per il funzionamento del sistema, causata da un gesto non previsto, una posizione intermedia tra due gesti, uno o più blob di disturbo sullo sfondo che si mescolano ai blob delle dita.

Come già detto, occorre fissare una soglia massima di accettazione per la distanza; se il centroide più vicino dista più del valore di soglia, la forma acquisita non è classificata affatto e, perciò, scartata.

6.5.2      Calcolo del valore di soglia per la distanza

Ciascuno dei centroidi può essere visto come il centro di una ipersfera a 9 dimensioni, il cui volume è calcolabile con

Se consideriamo che il campo dei valori delle feature è normalizzato nell’intervallo [0,1], un punto casuale qualsiasi sarà contenuto nell’ipercubo [0,1]9 : la probabilità che il punto sia contenuto nell’ipersfera è data dal rapporto tra il volume della sfera e quello dell’ipercubo (=1).

Al crescere del numero dei centroidi e del raggio, questo approccio non è più valido, sia perché un’ipersfera può oltrepassare le pareti dell’ipercubo, sia perché le ipersfere possono intersecarsi tra loro.

Procediamo con un metodo sperimentale, estraendo punti casuali e valutando la possibilità che ricadano o no nell’ipersfera di un centroide:

1.    Fissato il training set S, costruiamo il parallelepipedo a 9 dimensioni con i lati pari all’intervallo tra minimo e Massimo per ogni feature:

  Il volume del parallelepipedo è    

2.    La distanza massima tra gli spigoli opposti del parallelepipedo è 3

Troncando le distanze possibili alla terza cifra decimale, avremo una risoluzione di 3001 possibilità: predisponiamo così il vettore Dist[3001] inizialmente vuoto, che riporta la numerosità dei campioni con una data distanza minima dai centroidi.

3.    Assegnato il codebook da analizzare e scelto N ≈ 106 il numero dei campioni casuali da estrarre, per ogni  nÎ [1, N] :

o             estraiamo 9 coordinate casuali

o             valutiamo la minima distanza Distmin da uno dei centroidi

o             calcoliamo l’indice j = Distmin*1000 e incrementiamo la relativa casella del vettore numerosità Dist[j].

4.    Dividendo ogni casella di Dist per N otteniamo la Funzione di Distribuzione della probabilità che un punto cada ad una certa distanza minima da un qualsiasi centroide.

5.    La Funzione di Distribuzione è mutata in Funzione di Ripartizione, sostituendo ad ogni cella la sommatoria dei valori precedenti.      Moltiplicando tutti i valori per 100, la cella [j] contiene la probabilità percentuale che la distanza di un punto casuale da un centroide sia inferiore o uguale a  j/1000; di conseguenza Dist[3000]=100 e Dist[0]=0 (Dist[0] potrebbe essere maggiore di 0 se molti punti casuali hanno colpito esattamente un centroide).

6.    La Tabella delle probabilità, di 101 righi, viene costruita ponendo Tab[0]=0, cercando poi per ogni k=1,100 il più alto valore di j tale che Dist[j] ≤ k e assegnando Tab[k] = j / 1000.

 0.00 0.22 0.25 0.26 0.27 0.28 0.29 0.30 0.31 0.31 0.32 0.32 0.33 0.33 0.34

 0.34 0.35 0.35 0.35 0.36 0.36 0.36 0.37 0.37 0.38 0.38 0.38 0.39 0.39 0.39

 0.39 0.40 0.40 0.40 0.41 0.41 0.41 0.41 0.42 0.42 0.42 0.42 0.43 0.43 0.43

 0.43 0.44 0.44 0.44 0.44 0.45 0.45 0.45 0.46 0.46 0.46 0.46 0.47 0.47 0.47

 0.47 0.48 0.48 0.48 0.48 0.49 0.49 0.49 0.50 0.50 0.50 0.50 0.51 0.51 0.51

 0.52 0.52 0.52 0.53 0.53 0.53 0.54 0.54 0.55 0.55 0.56 0.56 0.56 0.57 0.57

 0.58 0.59 0.59 0.60 0.61 0.62 0.63 0.64 0.66 0.69 3.00

Il risultato viene salvato nel file ErTable.db.

Il file viene caricato durante la fase di classificazione: l’utente, tramite un cursore decide il livello di tolleranza di errore t:

t = 0             sarà accettato e classificato solo un gesto che corrisponda esattamente ad un centroide;

1 ≤ t ≤ 99     saranno accettati solo i gesti le cui feature distano da un centroide meno di Tab[t];

t = 100         verrà dato un significato a qualsiasi forma di blob.

 

6.6    Scelta dei gesti

Considerati i vincoli 'bizantini' sulle possibili posizioni della mano, ho selezionato solo alcuni dei classici gesti dell'alfabeto dei segni (con qualche piccola modifica per non far accavallare mai le dita), aggiungendone però qualcuno apocrifo.

La scelta è stata fatta tenendo conto dell'agilità media di una mano umana, e facendo in modo da tenere sempre separate le dita dello stesso colore, senza che nessuna rimanesse occlusa.

Ad ogni gesto è stato associato un carattere dell'alfabeto o un numero:

A, B, C, F, L,   P,  U,  V,  W, Y,  3,   4,   5.

Naturalmente, il set di gesti, nonché i relativi caratteri associati, possono essere cambiati dall'utente finale, senza alcuna modifica del programma.

 

6.7    Azioni

Sviluppare una completa procedura di interazione uomo-computer in base ai gesti riconosciuti, è un impegno che esula degli scopi del presente lavoro. Sono state, perciò, implementate solo alcune funzioni di base a scopo dimostrativo.

6.7.1      Output grafico

Il modulo classificatore, visualizza in un’apposita finestra l’immagine associata a ciascun gesto riconosciuto, salvata in un file jpeg con il nome Gesto#.jpg, ove # rappresenta il carattere del segno.

ove il punto esclamativo (file Gesto.jpg) indica il cenno non riconosciuto.

I semplici file mostrati, possono essere sostituiti con un’altra serie di immagini jpeg, rispettando la regola di naming, purché la risoluzione non sia superiore allo schermo.

6.7.2      Movimento Cursore

Per simulare il movimento del cursore sullo schermo, solitamente associato al movimento del mouse, occorre scegliere tre gesti facilmente eseguibili e commutabili con la mano; sono da preferire i gesti che mostrino completamente l’ovale del palmo, in modo che sia più stabile il baricentro di riferimento da associare al movimento del mouse.

Per evitare false interpretazioni dovute ad occasionali movimenti della mano, occorre che il gesto sia tenuto costante per più frame (il numero attualemente programmato è NCENNI = 3). Per default usiamo B per muovere il mouse, P per il clic sinistro e W per il destro.

8   Quando il gesto di movimento è ripetutamente riscontrato, la differenza delle ultime due posizioni è usata per muovere il cursore; quando il gesto cambia, il cursore è lasciato nell’ultima posizione.

8   Se riscontriamo il codice clic-sinistro, il pulsante sinistro viene (virtualmente) premuto; continuando a tenere questo gesto, possiamo spostare il cursore con il clic premuto (ad esempio per trascinare un oggetto o disegnare sullo schermo): quando il gesto cambia, il pulsante sinistro viene rilasciato.

8   Se riscontriamo il codice clic-destro, il pulsante destro viene premuto (ad esempio, per aprire un menu contestuale); quando il gesto cambia, il pulsante destro è rilasciato.

6.7.3      Presentazione Slides

Usando quattro gesti opportunamente scelti, possiamo aprire, visualizzare e chiudere una sequenza di immagini. Per esempio useremo 5 per aprire la presentazione, 3 per avanzare di una pagina, L per tornare alla pagina precedente e Y per chiudere la presentazione.

Anche in questo caso, per evitare false interpretazioni, occorre che il gesto sia tenuto costante per più frame.

Predisponiamo una sequenza di file con nome del tipo Slide##.jpg, con ## numero progressivo da 01 a 99.

4  Il carattere di apertura verifica la presenza almeno del file Slide01.jpg, e lo propone in una finestra grafica; inizializza il contatore di pagina.

4  Il segno di avanzamento verifica l’esistenza del file successivo e lo sostituisce nella finestra della presentazione.

4  Il segno di arretramento, se non siamo al primo file, sostituisce la slide precedente nella finestra.

4  Il gesto di chiusura termina la presentazione e rilascia la finestra.

La funzione “Presentazione Slides” convive con il movimento del cursore, purché i gesti scelti siano differenti.

6.7.4      Sequenze di gesti

Il riconoscimento di sequenze catalogate di gesti è riservato a futuri sviluppi.

 

 

7   Implementazione del Software

Il software è stato sviluppato in linguaggio C++ con Visual Studio 2008 su Microsoft .NET Framework 3.5 per Windows XP. [16]

Per consentire l'accesso alla webcam in modo agevole, ho utilizzato le librerie OpenCV (Open Computer Vision) nate da un gruppo di ricerca sponsorizzato da Intel e sviluppate da ricercatori dalle più svariate provenienze. Le OpenCV forniscono un ampio ventaglio di funzioni per l'acquisizione e l'elaborazione di base delle immagini, nonché per la creazione di finestre grafiche per la loro visualizzazione. [17]

Il package finale fornito (eseguibile + dll runtime + eseguibili LVQ) potrà essere eseguito su qualsiasi sistema con i vincoli:

§    Sistema operativo Windows XP

§    Microsoft .NET Framework 3.5

Non sono richieste particolari performance hardware, potendo utilizzare anche il più umile dei netbook.

 

 

8   Prove di Utilizzo

Il software Handy è stato testato in situazioni differenti, dando generalmente risultati incoraggianti.

Le prove sono state eseguite utilizzando vari tipi di webcam, tutte molto economiche o già integrate nei pc portatili.

Sono stati anche coinvolti diversi operatori, per verificare la tolleranza a variazioni di misure della mano e di postura della stessa, nonché di utilizzo della mano destra e/o della mano sinistra.

 

8.1    Vincoli Ambientali

Il problema fondamentale è la webcam: generalmente, la regolazione della luminosità e del bilanciamento del bianco è un automatismo non modificabile.

Per rendere stabile l’acquisizione dei colori durante la prova, è necessario che i parametri della cam siano modificabili manualmente.

Fatto questo, è possibile operare in un ambiente qualsiasi, con luce diffusa non troppo forte, come in una qualsiasi aula ove sia possibile proiettare diapositive.

Lo sfondo su cui opera la mano dell’utente non crea grossi problemi, purché immobile; le prove sono state eseguite anche con una libreria piena di volumi colorati, senza difficoltà.

Da evitare, naturalmente, oggetti o persone in movimento.

Infine, l’operatore dovrà evitare di indossare gli stessi colori del guanto: l’ideale è un abbigliamento quasi acromatico (scuro o chiaro non fa differenza).

 

 

8.2    Valutazione dei risultati

Le prove sono state effettuate in fasi di addestramento separate, con relativa costruzione di file SignImg.db; i file sono stati verificati (funzione DbViewer) ed eventualmente concatenati (funzione DbAppend) in modo da produrre il training set Feature.db ed il codebook CnTable.db.

I diversi file ASCII sono stati rinominati progressivamente e salvati in una cartella separata, utilizzando le funzioni del sistema operativo: con questa procedura, ed in tempi relativamente rapidi, sono stati creati una mezza dozzina di archivi di base, ciascuno con alcune centinaia di gesti.

A questo punto, è possibile ottenere una valutazione approssimativa della validità del database dei gesti, incrociando training set (insieme di test) e codebook differenti con la funzione Accuracy del package LVQ

accuracy -din i_Feature.db -cin j_CnTable.db

8.2.1      Unico operatore

Se l’archivio dei gesti viene immesso da un’unica persona (utilizzando sia la mano destra sia la sinistra), nella fase di riconoscimento l’errore è praticamente inesistente :

Recognition accuracy:

        B:   89 entries 100.00 %

        A:   81 entries 100.00 %

        C:   73 entries 100.00 %

        F:   73 entries 100.00 %

        5:   73 entries 100.00 %

        3:   72 entries 100.00 %

        4:   71 entries 100.00 %

        L:   65 entries 100.00 %

        Y:   65 entries 100.00 %

        W:   64 entries 100.00 %

        P:   63 entries 100.00 %

        U:   62 entries 100.00 %

        V:   56 entries 100.00 %

Total accuracy:   907 entries 100.00 %

 

In questa configurazione otteniamo la massima efficienza, al prezzo di una perdita di generalità nell’utilizzo del software.

Occorre precisare che la scelta di questa restrizione è a carico dell’utente finale, in quanto non richiede alcuna modifica del package Handy.

8.2.2      Operatori diversi

Se incrociamo i dati di diversi operatori, con caratteristiche fisiche (sesso, massa corporea) e gestuali differenti, le prestazioni sono affette da una certa percentuale di errore, soprattutto quando occorre interpretare alcuni gesti potenzialmente equivoci.

Ad esempio, confrontiamo due archivi ottenuti in fasi successive:

archivio 1: contiene 634 gesti, di 13 classi diverse, caricati da 3 operatori di massa e sesso differente; dal training set è stato calcolato il codebook, contenente più codevector per ciascuna classe.

archivio 2: contiene 907 gesti, distribuiti sulle stesse 13 classi, caricati da 2 operatori di massa differente; il training set verrà usato come test:

accuracy -din 2_Feature.db -cin 1_CnTable.db

Recognition accuracy:

        A:   81 entries 100.00 %

        B:   89 entries 100.00 %

        C:   73 entries 100.00 %

        F:   73 entries 100.00 %

        L:   65 entries 100.00 %

        P:   63 entries 100.00 %

        U:   62 entries  93.55 %

        V:   56 entries  98.21 %

        W:   64 entries 100.00 %

        Y:   65 entries 100.00 %

        3:   72 entries  90.28 %

        4:   71 entries  97.18 %

        5:   73 entries  73.97 %

Total accuracy:   907 entries  96.36 %

 

Nelle varie prove effettuate, a seconda della diversa scelta del training set e del codebook, ho ottenuto risultati leggermente differenti, ma con una accuracy complessiva sempre superiore al 95%.

 

8.3    Considerazioni finali

L’utilizzo del software Handy consente una semplice interazione con il computer tramite la web cam.

Il riconoscimento del gesto, con la relativa associazione di azioni, ha dato risultati assai positivi.

Utilizzando le verifiche del paragrafo 8.2.2, è possibile scegliere un piccolo gruppo di gesti, difficilmente equivocabili, in modo da realizzare un semplice ma efficace modo per la presentazione delle slides.

Viceversa, la gestione del cursore del mouse, con i relativi tasti destro e sinistro, ha rivelato una limitata efficacia, dovuta ad alcuni fattori:

·     per la maggior parte degli esseri umani, è difficile muovere e bloccare il braccio nel vuoto 3D senza un appiglio di riferimento;

·     per eseguire un clic occorre muovere almeno un dito (per cambiare gesto) senza muovere il resto della mano, ovvero senza spostare le coordinate del cursore;

·     la risoluzione della webcam è notevolmente inferiore alla risoluzione dello schermo; inoltre il baricentro del palmo si muove in un sottoinsieme di questa finestra. Le coordinate (X,Y), quindi, dovranno essere amplificate sei-sette volte per distribuire il movimento sull’intero schermo, causando un tremolio difficilmente controllabile.

Un’ultima considerazione sulla fase di addestramento: una particolare cura nell’inserimento dei gesti, consente di riconoscere, successivamente, anche situazioni rumorose; viceversa, un addestramento frettoloso, rischia di costruire un codebook con voci poco utilizzabili.

 

9   Filmato Dimostrativo

Handy.mpg 2'07"
( Download 19.5 Mbyte )

 

Bibliografia

[1]      G.C.Burdea, P.Coiffet, "Virtual reality technology",        New Jersey 2003 – John Wiley & Sons

[2]      www.nintendo.it/NOE/it_IT/wii_54.html

[3]      www.analog.com/UploadedFiles/Data_Sheets/ADXL330.pdf

[4]      www.5dt.com/products/pdataglovemri.html

[5]      www.hitachi-soft.com/starboard/products/interactive_whiteboards

[6]      Cecie Starr, Biology: Concepts and Applications,  2005, Thomson Brooks/Cole.

[7]      Rafael C. Gonzalez - Richard E. Woods, " Digital Image Processing”, Upper Saddle River, New Jersey 2002 - Prentice-Hall, Inc.

[8]      A. Del Bimbo, "Visual information retrievial",       1999, San Francisco – Morgan Kaufmann Publishers

[9]      D. Karatzas, "Text segmentation in web images using colour perception and topological features",       PhD Thesis, 2002, University of Liverpool, UK.

[10]   H.D. Cheng, X.H. Jiang, Y. Sun, Jingli Wang, "Color image segmentation: advances and prospects", Department of Computer Science, Utah State University, USA 2000

[11]   britannica.com/EBchecked/topic/328541/Johann-Heinrich-Lambert

[12]   en.wikipedia.org/wiki/Lambert%27s_cosine_law

[13]   Francesco Camastra - Alessandro Vinciarelli, "Machine Learning for Audio, Image and Video Analysis", Springer-Verlag London 2008.

[14]   T. Kohonen, J. Hynninen, J. Kangas, J. Laaksonen, and K. Torkkola. Lvq pak: the Learning Vector Quantization program package. Technical Report A30, Helsinki University of Technology - 1996.

[15]   www.cis.hut.fi/research/som-research/nnrc-programs.shtml 

[16]   msdn.microsoft.com,  "MSDN Library - Windows Application UI Development".

[17]   OpenCV Documentation, 2009