Studio e Implementazione di un Tracking Match-Up

Transcript

Studio e Implementazione di un Tracking Match-Up
UNIVERSITA' DEGLI STUDI DI TRENTO
FACOLTA' DI SCIENZE MATEMATICHE, FISICHE E NATURALI
CORSO DI LAUREA IN INFORMATICA
ELABORATO FINALE
TITOLO ELABORATO
STUDIO E IMPLEMENTAZIONE DI UN TRACKING MATCH-UP
RELATORI:
LAUREANDO:
Prof. LUIGI PALOPOLI
Prof. RAFFAELE DE AMICIS
dott. GABRIO GIRARDI
ANNO ACCADEMICO
2009/2010
GIULIA CANOBBIO
Sommario
Questo elaborato descrive lo studio e l'implementazione di un sistema di “tracking match-up”.
Con il “Tracking match-up” s’intende tracciare e riconoscere all'interno di un'immagine le orme di un
soggetto, come la mano, il dito o il viso.
Il software prevede la creazione di un “Catalogo Interattivo” con l’utilizzo della tecnica di
“Tracking”.
Per il “Catalogo Interattivo” è prevista una composizione mediante l’impiego di un pannello in plexiglass trasparente, di una webcam sensibile agli IR (infrarossi)[15] e di un proiettore come illustrato
nella Figura 1.
FIGURA 1
Il layout scelto per questo sistema è retro-proiettato. Il contenuto proiettato è una determinata
interfaccia sul pannello per permette all'utente di navigare all'interno del catalogo interattivo così
visualizzato.
FIGURA 2
Come illustrato in Figura 2, l'interfaccia utente è composta da 5 pulsanti, i quali hanno una loro
azione che viene descritta nei seguenti capitoli e nel mezzo dei pulsanti c.d. “Bottone 1” e “Bottone
2” è presente la forma di un manichino.
Il “Catalogo Multimediale” funziona nel seguente modo:
a.
Il contenuto è proiettato sul pannello;
b.
Il software richiede alla webcam la cattura delle immagini durante l'esecuzione;
c.
Si analizza l'immagine per trovare la maschera desiderata;
d.
Qualora la maschera fosse localizzata, il sistema riconosce la funzione da richiamare.
Indice
Introduzione
9
Stato dell'arte
17
Capitolo 1 25
Il “tracking match-up” La differenza d’immagine
25
L’approssimazione dei contorni
29
La segmentazione
30
Il classificatore a cascata di Haar
31
Creazione dell’interfaccia utente
Capitolo 2 Architettura del progetto
27
32
35
35
Finger tracking
36
Algoritmo di tracking
42
Interfaccia utente
Texture Mapping
Integrazione Finger Tracking e Interfaccia Utente
Capitolo 3 Tecnica risolutiva
48
50
52
61
61
La “segmentazione”
62
Tracking finger mediante infrarossi
64
Capitolo 4 Esperimenti
Testing del “tracking finger” mediante il metodo della differenza d’immagine.
71
71
71
Testing del progetto mediante
la differenza d’immagine
75
Testing del progetto mediante IR 77
Conclusioni
87
Bibliografia
89
Appendice “A”
93
Installazione della libreria OpenCV su Visual Studio 2005.
Appendice “B”
Installazione del toolkit GLUT su Visual Studio 2005.
Appendice “C”
Il Progetto a livello di codice
“Finger tracking”
93
95
95
97
97
97
Interfaccia utente
104
Integrazione
108
Appendice “D”
RGB e HSV color space
121
121
Introduzione
La tecnologia, oggi, ha permesso l’evoluzione di tanti sistemi, tra cui i sistemi di interazione
uomo – macchina. Questo progetto è stato pensato per migliorare questa interazione avendo la possibilità di utilizzare strumenti non sofisticati e alla portata di tutti. Per spiegare al meglio questa interazione è utile conoscere i precedenti metodi utilizzati nel corso degli anni e nello specifico affrontare
tematiche riguardanti l’evoluzione: “ieri, oggi e domani”.
Fin dall’inizio dell’era del computer l’unico metodo di comunicazione tra uomo è macchina era
l’interfaccia a riga di comando (“Command Line Interface”). Successivamente è stata implementata
l’interfaccia grafica (“Graphical User Interface”), la quale permetteva e permette ancora oggi l’interazione non solo tramite righe di comando, ma anche manipolando graficamente degli oggetti tramite
l’uso di un nuovo componente hardware cioè il mouse.
Oggi la tecnologia ha migliorato questa interazione e permette all’uomo di interagire direttamente con la macchina eseguendo le azioni desiderate. Questo è dimostrato dall’incremento di dispositivi mobili e computer che utilizzano un’interfaccia “touchscreen”, mediante la quale l’utente è in
grado di eseguire azioni tramite il tocco dello schermo.
Per questo motivo si è deciso di implementare un’applicazione con l’interfaccia “touchscreen”.
L’applicazione è stata divisa in due fasi:
1 |
quella di “tracking match-up”;
2 |
quella di creazione dell’interfaccia utente.
Questi è stato sviluppato in ambiente Windows (Windows XP Professional), utilizzando il tool
Visual Studio 2005.
Il “Catalogo Interattivo” è stato implementato con due librerie (API) utilizzate in Computer
Grafica e soprattutto nel ramo della Robotica e della grafica 2D e 3D.
Studio e implementazione di un tracking match-up
|9
La fase di “tracking match-up”, cioè del riconoscimento della mano o del dito del soggetto, è
stata implementata con l’ausilio della libreria OpenCV (Opensource Computer Vision).
OpenCV è una libreria di “computer vision” e si occupa del salvataggio e della manipolazione
delle immagini da device usb, da video o da file, nonché si occupa di riconoscimento di oggetti, di
forme geometriche, dei volti oppure delle mani di un soggetto.
Questa libreria permette di eseguire il salvataggio dell’immagine recuperata dalla webcam
(chiamata frame), di salvare un’immagine statica (chiamata background), di richiamare la funzione
che serve per trovare la mano dell’utente e quindi di sapere quale azione eseguire.
Nella funzione eseguita per il “tracking” vengono, invece, utilizzati vari filtri per poter privare
l’immagine dei rumori, cioè alcune malformazioni causate dalla luce, dai colori o dalla distanza dell’oggetto dalla webcam.
Il “tracking” può essere eseguito con varie funzioni e in modi differenti.
1 |
Per cercare un oggetto all’interno di un’immagine si può richiamare la funzione OpenCV che
esegue una differenza di immagine: void cvSub(const CvArr* src, const CvArr* src1, const
CvArr* dst, const CvArr* mask = NULL) (oppure voidcvAbsDiff(const CvArr* src1,
const CvArr* src2, CvArr* dst )), che prende due immagini in input ed esegue la differenza
tra le due salvandone il risultato all’interno di una terza immagine (le tre immagini devo avere
la stessa grandezza e lo stesso numero di canali). La differenza è un’immagine contenente i
pixel risultati differenti nel confronto. In questo modo viene trovata qualunque cosa sia diversa
dall’immagine salvata (anche se non appare l’oggetto desiderato).
2 |
L’oggetto può anche essere cercato per colore e si esegue, quindi, una segmentazione, cioè l’immagine viene suddivisa in base al colore dei pixel (elementi che compongono l’immagine in formato
digitale). Per esempio si cerca di far trovare al robot munito di webcam PlayStation Eye, con risoluzione 640x280, una pallina colorata di rosso. Il metodo utilizzato è, quindi, il “color detection”[1].
10 | Studio e implementazione di un tracking match-up
3 |
Se invece si hanno delle maschere con un ampio spettro, si può approssimare il contorno di un oggetto per riuscire a trovarlo tramite l’analisi dell’immagine. In un’immagine il
suo contorno è quella parte in cui i pixel hanno un enorme differenza di luminosità e colore.
Per avere i contorni degli oggetti in un’immagine, si usa l’algoritmo di Canny: void cvCanny(const
CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size=3).
Questa funzione si suddivide in quattro fasi, di seguito descritte:
a |
I pixel dell’immagine sono disturbati dal rumore presente nell’immagine considerata,
quindi all’immagine viene applicato un filtro basato sulla derivata prima gaussina;
b |
Per trovare i contorni in orizzontale, verticale e diagonale, vengono utilizzati quattro filtri
differenti. Per ciascun pixel risultante viene assunta come valida la direzione relativa al
filtro che dà il valore maggiore. Questa direzione, combinata col valore ottenuto applicando il filtro, corrisponde a quella in cui si ha il massimo gradiente di luminosità in ciascun
punto dell’immagine;
c |
La mappa dei gradiente evidenzia il valore dell’intensità luminosa in ogni punto dell’immagine. Se l’intensità è forte significa che è presente un contorno, ma solo i punti
corrispondenti a dei massimi locali (derivata del gradiente è nulla) sono considerati un
contorno apparente, e vengono presi in considerazione;
d |
L’estrazione del contorno avviene con un metodo chiamato “sogliatura con isteresi”, e
prevede che vengano definite due soglie, una alta e una bassa, da confrontare con il gradiente. Quindi se il valore del gradiente è inferiore alla soglia bassa, il punto viene scartato; se invece è superiore alla soglia alta, il punto viene tenuto come parte del contorno e se
invece è compreso tra le due soglie, il punto viene tenuto solo se è contiguo ad un punto
salvato precedentemente.
Studio e implementazione di un tracking match-up
| 11
4 |
Un altro metodo è chiamato il classificatore a cascata di Haar e viene utilizzato quando si vuole
trovare e riconoscere una serie di gestualità della mano, oppure per trovare il viso di un utente
all’interno dell’immagine.
Si può affermare che, purtroppo, questo metodo richiede un periodo abbastanza lungo di apprendimento e di implementazione, perché il classificatore esegue un confronto fra ciò che appare nell’immagine catturata dalla webcam e i campioni positivi (cioè immagini che mostrano
la maschera) e dei campioni negativi (cioè immagini che non la mostrano).
In OpenCV il classificatore di Haar è implementato utilizzando un file xml inserendo al suo
interno i dati dei campioni positivi, con le coordinate all’interno del piano riferito all’immagine
di dove si trova la maschera desiderata, e dei campioni negativi.
Certo è che per funzionare questo metodo nel 90% dei casi deve avere un insieme di campioni
nell’ordine delle 5000 immagini.
Esistono tantissime applicazioni che utilizzano il classificatore e riguardano l’implementazione
del mouse tramite la gestualità della mano [2][3][5] o l’implementazione del mouse tramite il
movimento della testa del soggetto [2][5][6][8].
5 |
Il “tracking” si può effettuare anche con gli infrarossi (IR). La radiazione infrarossa (IR) è la radiazione elettromagnetica con una frequenza inferiore a quella della luce visibile, ma maggiore
di quella delle onde radio.
IR è spesso associata con i concetti di calore e radiazione termica poiché ogni oggetto con
temperatura superiore allo zero assoluto emette spontaneamente radiazione in questa banda.
Ovviamente più la temperatura è alta più l’oggetto diventa visibile. Se un oggetto è abbastanza
caldo o in grado di riflettere il calore emesso da un infrarosso verso la webcam, il programma
sarà in grado di riconoscere l’azione desiderata dall’utente e, quindi, di eseguirla.
La mano dell’utente appartiene all’insieme degli oggetti che si ritiene abbastanza caldi da riflettere il calore emesso dagli IR.
12 | Studio e implementazione di un tracking match-up
Per esempio il dottore Johnny Lee [4] ha creato svariate applicazioni che tramite infrarossi possono implementare una lavagna interattiva o un sistema di tracking di oggetti tramite l’utilizzo
del WiiMote e di un led.
Questi ha collegato il Wiimote tramite Bluetooth al computer (NB: se la macchina è un MacBook
Pro, si può collegarlo direttamente con il Bluetooth interno senza l’ausilio di programmi), ha
alimentato il led tramite usb spiegando che questo è possibile anche collegandolo con una batteria esterna. Ha proiettato lo schermo del computer sul muro e si è posizionato il WiiMote in
modo che la proiezione si trovasse all’interno dell’angolo di visualizzazione dello stesso cioè
in un angolo di 45°. Ha avviato il programma è dopo la calibrazione, l’utente è stato in grado
di utilizzare la parete come se fosse stato lo schermo del computer e con il led ha simulato il
mouse del sistema.
Premesso quanto sopra, qui riportato a titolo di esempio, la creazione dell’interfaccia utente,
descritta in questo elaborato, è stata implementata con l’ausilio della libreria OpenGL (Opensource
Graphics Library) e di un toolkit per Windows chiamato GLUT (The OpenGL Utility Toolkit).
OpenGL è una libreria usata per la creazione di finestre indipendenti di giochi 2D e 3D e di
animazioni.
Si deve registrare che purtroppo questa libreria non permette la creazione dei componenti pulsanti (JButton) come le Applet di Java e, quindi, si utilizzano le funzioni di disegno delle varie forme
geometriche implementate dalla libreria stessa.
La finestra creata con GLUT è una finestra gestita direttamente dalla libreria e indipendente dal
sistema operativo sulla quale è stata creata.
GLUT, invece, ha un proprio meccanismo molto semplice per creare le finestre e per mantenere
la loro esistenza all’interno del sistema.
Studio e implementazione di un tracking match-up
| 13
In questo caso, quando si crea una finestra la prima cosa da fare è “inizializzarla”, cioè darle
un nome, inserire la sua grandezza, darle delle proprietà importanti (come per esempio il sistema di
coordinate bidimensionale o tridimensionale, evidenziare che si vuole eseguire un’animazione e altro), di seguito chiamare la funzione che disegna i componenti, ed infine richiamare il ciclo di GLUT
che permette di visualizzarla fino a quando non viene chiusa.
Obiettivi
Gli obiettivi da raggiungere con questo progetto si erano prefissati dapprima nel creare un catalogo interattivo, estraendo e utilizzando quei procedimenti tipici del tracking e di detection degli
oggetti nelle librerie OpenCV, e successivamente questo programma si completava con l’integrazione
in una finestra realizzata con le librerie OpenGL.
Motivazioni
L’idea posta alla base per questo progetto sta nel tentativo di poter usare in un futuro la tecnologia “touchscreen” abbattendo gli elevati costi di produzione e rendere così accessibile questa
tecnologia ad un numero sempre più elevato di persone/utenti, senza l’impiego di altre tipologie di
materiali quali il cartaceo.
Questa tecnologia potrebbe essere desiderata per il settore commerciale, quali ad esempio i
negozi di abbigliamento e, quindi, il sistema di “tracking match-up” può essere definito come un vero
e proprio catalogo multimediale di quei prodotti presenti nella catena commerciale e merceologica
di settore.
14 | Studio e implementazione di un tracking match-up
Stato dell'arte
Il “tracking match-up” è un metodo di tracciamento di oggetti. Questi si possono identificare
anche in alcune parti del corpo umano quali la mano o il viso di un soggetto.
Oggi quest'operazione la si effettua mediante l'utilizzo della libreria OpenCV ed esistono varie
applicazioni creati per adoperare questi due oggetti, cioè la mano o il viso di una persona, in modo da
implementare un mouse oppure un semplice riconoscimento come “hand detection” e “head detection”, cioè il riconoscimento della mano e del viso.
Sussistono inoltre applixazioni che riescono ad implementare tutto quanto predetto senza l'utilizzo di algoritmi della libreria OpenCV, ma usando al suo posto gli infrarossi (IR), cioè una fonte
di calore che pone in evidenza l'oggetto interessato. Quest’ultimo si presenta con un colore molto
chiaro, che possiamo definire vicinissimo al bianco, ma la webcam a cui si affida questo rilevamento
deve essere sensibile agli IR.
Si può affermare che la maggior parte delle webcam di recente generazione sono sensibili agli
IR [15].
I progetti descritti di seguito implementano il “tracking”:
1 |
“An aibo pink ball tracking”[1]
2 |
Dasher [2]
3 |
HandVu [3]
4 |
Hand Detection [4]
5 |
Finger Mouse [5]
6 |
Face Detection [6]
7 |
Head Mouse [8]
8 |
WiiMote Project [7]
9 |
Motion Tracking [9]
10 | Webcam Signature [13]
Studio e implementazione di un tracking match-up
| 17
Object Tracking
L’applicazione di “An aibo pink ball tracking” cerca di trovare una pallina di colore rosa acceso
all'interno di un'immagine catturata dalla webcam.
In questa applicazione si vuole creare un robot che in un futuro possa essere in grado di riconoscere questa pallina e ipotizzare che questi possa giocarci.
Si analizza l'immagine catturata dalla webcam, cambiando lo spazio dei colori da RGB a HSV.
Di seguito si cerca la pallina in base al colore (rosa chiaro), si esegue il metodo di “Segmentazione”
dividendo l'immagine e lasciando solo i pixel che rientrano nei parametri scelti, cioè rimangono solo
i pixel che hanno il colore rosa chiaro.
Una volta che è rimasta solo la parte d'immagine rosa, si cerca all'interno dell'immagine una
figura geometrica che può approssimare l'oggetto: una sfera o un cerchio.
Quindi, si richiama la funzione OpenCV che approssima l'oggetto con la forma geometrica del
cerchio e, qualora lo si trovi, si evidenzia nell'immagine originale in cui si colloca, viceversa non si
esegue nessuna operazione.
Questa applicazione esegue due procedure: il metodo di “Segmentazione” che divide l'immagine
in base ai pixel scelti e il metodo di “approssimazione dei contorni”, che trova l'oggetto desiderato.
Infatti in questo caso una volta rimasta l'immagine segmentata, si cerca di approssimare la figura rimasta con una forma geometrica.
Dasher
Dasher è un'interfaccia d’informazioni, che contempla nel suo insieme un efficiente metodo
d’immissione testo, anche guidato da gesti naturali o da hardware di puntamento.
Questa applicazione ha una sua particolarità, cioè che può essere utilizzato anche da persone
portatrici di handicap, oppure che non riescono a digitare sulla tastiera oppure maneggiare il mouse
o qualsiasi altro tipo di device.
18 | Studio e implementazione di un tracking match-up
Dasher, infatti, implementa gli insiemi algoritmici per l’esecuzione di “foot tracking” e “head
tracking”, cioè il tracciamento del piede o del viso tramite l'applicazione di un estensione infrarossa
sulla testa o sul piede.
In questo caso la webcam utilizzata dev’essere una di quelle sensibile alle radiazioni infrarosse
emesse dal dispositivo e tramite un filtro la evidenzia, nonché ne trova le coordinate in base al movimento effettuato dalla testa del soggetto.
E’ necessario quindi eseguire un filtro in grado di mettere in evidenza il colore dell'infrarosso
visibile dalla webcam e di tracciarlo per compiere successivamente l'azione desiderata.
HandVu
HandVu è un software di riconoscimento della mano del soggetto e della sua gestualità. Questi
utilizza la mano per implementare il mouse del computer, per l'interazione con l'ambiente circostante,
per esempio per ingrandire la visualizzazione di una determinata zona e per l'interazione con oggetti
virtuali.
HandVu riesce a trovare la posizione della mano e a riconoscere i suoi gesti. Per fare questa
operazione impiega un algoritmo che richiama l'analisi dell'immagine tramite “segmentazione” e
riconoscimento dei contorni dell'oggetto.
Hand Detection
Hand Detection permette di riconoscere all'interno di un'immagine la mano dell'utente e la sua
gestualità.
Questo viene implementato mediante l'utilizzo “Haar Classifier”. Quest’ultimo viene implementato scrivendo codice XML contenente l’elenco di campioni positivi e negativi, nonché le coordinate della posizione dell’oggetto desiderato all’interno dei campioni stessi.
I campioni positivi contengono la mano e le sue gestualità da riconoscere, mentre quelli negati-
Studio e implementazione di un tracking match-up
| 19
vi quelle gestualità che non sono da riconoscere o degli oggetti somiglianti per caratteristiche comuni
quali colore, forma ma che non raggiungono gli standard di defalut.
Haar Classifier permette il riconoscimento dell'oggetto presente nell'immagine con un confronto tra quello presente nell'immagine e quello visualizzato nei campioni.
Finger Mouse
Finger Mouse traccia il dito di un soggetto mediante la cattura dell'immagine dalla webcam e
riconosce la gestualità della mano implementando così le azioni del mouse.
Questa applicazione risulta funzionare solamente se la luce irradiata e il tipo di background
(piano di appoggio della mano) sono sistemati in un determinato modo.
La luce irradiata deve fare brillare bene la mano e il piano di appoggio in modo da rendere visibili i colori e le loro differenze.
Il background, invece, deve essere di un colore nitido, ben preciso e tale da non essere facilmente confondibile con quello della mano.
Face Detection
Face Detection riconosce all'interno di un video il viso dei soggetti, anche di quelli che lo hanno
leggermente di profilo, ruotato verso sinistra o verso destra.
Il metodo utilizzato in questo caso, prevede di analizzare ogni parte dell'immagine e di trovare
il viso del soggetto o di altri soggetti presenti in base a determinati algoritmi che modificano la visualizzazione dell'immagine, la sua luminosità e altri parametri simili.
Head Mouse
Head Mouse riesce a trovare all'interno dell'immagine il viso dell'utente e, a seconda dei suoi
20 | Studio e implementazione di un tracking match-up
movimenti eseguire una delle azioni del mouse.
Questo progetto riesce ad implementare un mouse tramite l'analisi dell'immagine catturata dalla
webcam.
La cattura dell'immagine permette di analizzare i movimenti della testa del soggetto e di riconoscere così l'azione desiderata.
Head Mouse riesce a riconoscere e suddividere le fasi del movimento della testa per implementare un evento del mouse.
WiiMote Projects
I WiiMote Projects implementano il tracking della mano o di altri oggetti utilizzando il WiiMote, cioè il telecomando Bluetooth della console Wii.
Un’applicazione permette di tracciare il movimento delle dita del soggetto, semplicemente applicandogli sopra del materiale riflettente, quale potrebbe essere un nastro adesivo oppure un guanto e
con l’ausilio di questo materiale e una serie di led si posiziona il WiMote nell’area del rilevamento.
Si deve precisare che la serie di Led serve per irradiare luce verso il materiale riflettente che
a sua volta solleciterà il sensore del WiiMote permettendo così il tracciamento delle coordinate dell’oggetto.
In questo modo si riesce a muovere lo spettro dell’oggetto tracciato seguendo le coordinate del
piano 2D.
La forma così riflessa riesce a rimandare gli IR verso il WiiMote consentendo alla sua libreria di
gestione di recuperare le coordinate della stessa e passarle al computer, filtrate nella modalità corretta
per la differenza del piano cartesiano, quest’ultimo all’origine risulta evidentemente disuguale fra la
realtà e quello presente all’interno dell’applicazione.
Un’altra applicazione, invece, sempre tramite il collegamento del WiiMote al computer e la
creazione di una penna led riesce ad implementare una lavagna interattiva.
Si deve precisare che la penna led è un dispositivo esterno composto da un involucro in plastica,
Studio e implementazione di un tracking match-up
| 21
quale potrebbe essere una penna svuotata dallo stilo contenente inchiostro e dal pennino, sostituiti con
un led alimentato tramite usb oppure batteria propria. Questa funziona e accende il Led premendo
uno switch.
In quest’ultimo caso viene proiettata su una superficie di colore uniforme, come un muro o un
tavolo, il desktop del computer.
Si posiziona il WiiMote nella prossimità della proiezione facendo in modo che il suo angolo di
45° riesca a contenere le estremità della proiezione stessa.
Di seguito si procede calibrando i punti che delimitano l'area con cui ci si deve interfacciare. Il
WiiMote recupera così le coordinate di posizione della penna Led e tramite una funzione di trasformazione riesce ad utilizzare le applicazioni presenti sul computer.
In pratica la penna Led è il mouse del sistema.
Con questi due progetti Johnny Lee riesce ad implementare il tracciamento delle dita del soggetto senza utilizzare le OpenCV ma impiegando gli IR.
Motion Tracking
Motion Tracking è un progetto che riesce a tracciare il movimento di un oggetto.
In questa applicazione si esegue una differenza d’immagine tra l'immagine catturata dalla webcam al momento e quella precedente.
Una volta effettuata la differenza d’immagine, per vedere dove si trova la differenza viene chiamato un filtro per cancellare le zone nere ovvero quelle zone dove non vi è stato alcun movimento
nell'immagine.
Successivamente, si riduce il rumore presente nell'immagine e si formano una serie di bolle
intorno all’area dell'immagine dove è presente il movimento.
Di seguito si cercano i pixel luminosi, mentre vengono del tutto ignorati i pixel neri.
Per il tracking si analizza l'area dove sono presenti i pixel con il colore dell'oggetto da tracciare
e si controlla la superficie, perché se risulta essere più grande di una determinata costante, allora si
22 | Studio e implementazione di un tracking match-up
può affermare che sia avvenuto un movimento.
Con questo algoritmo è possibile tracciare il movimento di un qualsiasi oggetto.
Webcam Signature
Webcam Signature implementa il mouse controllato dalla webcam.
In questa applicazione viene tracciato l'elemento del colore desiderato e lo si usa come una
penna per disegnare all'interno di un foglio.
L'algoritmo utilizzato è quello usato per la “segmentazione” perché questi traccia gli oggetti in
base al loro colore.
Per il suo corretto funzionamento sono richiesti oggetti con dei colori molto forti, facilmente
riconoscibili all'interno dell'immagine catturata ed è necessario che all'interno dell'immagine non vi
sia presente un altro oggetto avente lo stesso colore.
Studio e implementazione di un tracking match-up
| 23
Capitolo 1
Il “tracking match-up”
Il “tracking match-up” si è implementato utilizzando i quattro metodi descritti nell’introduzione che sono qui ripetuti per facilità di memoria:
1 |
la differenza d’immagine;
2 |
l’approssimazione dei contorni;
3 |
la segmentazione;
4 |
il classificatore in cascata di Haar.
Bisogna riuscire a capire quali tra i metodi a disposizione è quello più efficiente e veloce per il
“tracking” di un oggetto, quale può essere una mano o un dito del soggetto.
L’oggetto da trovare deve essere visibile all’interno dell’immagine, cioè deve essere evidente
per consentire al sistema di trovarlo facilmente, preferibilmente presente in primo piano e l’immagine
deve avere un’illuminazione favorevole che evidenzi i colori oppure le ombre.
I colori ben visibili e facilmente riconoscibili aiutano a trovare e a rintracciare un oggetto all’interno di un’immagine.
In questo caso i colori sono importanti perché aiutano a riconoscere un oggetto senza dover
effettuare tutta una serie di analisi molto più impegnativa dell’immagine e non di facile interpretazione.
Ci possono essere anche degli errori, per esempio, se all’interno dell’immagine è presente un
qualsiasi altro oggetto o sfondo che mostra un colore simile a quello ricercato. In questo caso si rischia di non trovare l’oggetto d’interesse oppure di trovare più di un oggetto.
Si preferisce di solito utilizzare uno spazio di colori di tipo HSV (vedisi Appendice “D”) nel-
Studio e implementazione di un tracking match-up
| 25
l’immagine, perché questi è uno spazio impiegato soprattutto per il confronto di colori, per la loro
similarità o uguaglianza ed è molto semplice da adoperare.
Si può anche analizzare l’immagine lasciandola nel suo spazio corrente, cioè lo spazio di colori
RGB, anche se è un insieme non di facile manipolazione perché comprende tutti i colori esistenti.
Le ombre evidenti, invece, danno la possibilità di trovare un oggetto in base alla presenza della
sua ombra oppure in base alla forma dell’ombra, anche se la forma dell’oggetto si può notare facilmente con i colori dell’immagine. In tale maniera però per poterlo analizzare bisogna servirsi del
filtro del colore e togliere quella parte d’immagine che non è di alcun interesse.
Analizzando, invece, solo le ombre l’illuminazione conseguente dell’ambiente deve rendere
visibili alla webcam o ad un qualsiasi tipo di device usb, le ombre degli oggetti, della mano o del dito
del soggetto.
Nel caso in esame si cerca quindi di avere un’illuminazione dietro al soggetto e il device usb
deve essere all’interno di una struttura o di una scatola che non permette alla luce esterna di entrare.
In questo modo le ombre sono riflesse sul pannello non trasparente, quindi è un po’ offuscato e
la webcam all’interno della sua immagine avrà una serie di ombre.
Modulando opportunamente la luce e la luminosità dell’ambiente e collocando la webcam in
una posizione favorevole, si può analizzare l’immagine in base alle ombre e tracciarne i suoi contorni
con lo scopo di procedere alla loro analisi.
Per fare questo con le ombre bisogna ottenere la loro traccia e in specie del contorno, vale a
dire tracciare o evidenziare la parte esterna dell’ombra, cioè quella parte d’immagine dove il colore
cambia bruscamente dal chiaro allo scuro, cosi che l’ombra è visualizzata con un colore molto simile
al nero.
Si vuole evidenziare che l’illuminazione dell’ambiente non deve in alcun modo precludere la
creazione delle ombre degli oggetti e la visualizzazione dei colori.
La webcam utilizzata in questo caso non possiede una risoluzione perfetta per visualizzare
correttamente i colori, di conseguenza se la luce emessa da una qualsiasi lampada oppure derivante
26 | Studio e implementazione di un tracking match-up
dall’illuminazione esterna è collocata vicino ad una parete di colore giallo chiaro, questa verrà visualizzata di colore rosa chiaro. In pratica si ottiene uno scambio di identità dei colori, per cui alcuni tipi
di colori non sono riconosciuti come tali e sono scambiati con altri poco simili ma con una caratteristica comune, cioè sono entrambi colori chiari.
L’analisi dell’immagine per colori e quindi la sua suddivisione in base ai pixel che presentano
il colore desiderato, può incorrere in errori causati dalla scarsa risoluzione della webcam e, pertanto,
per un’analisi di questo tipo si suggerisce l’utilizzo di una webcam di ultima generazione, cioè con
una risoluzione maggiore e con una visualizzazione dei colori e dell’immagine migliori.
Queste operazioni possono essere effettuate con le funzioni e gli algoritmi descritti di seguito.
La differenza d’immagine
La differenza d’immagine è un metodo molto semplice e prevede di avere due immagini uguali
o distinte, di eseguire la loro differenza e di salvarla all’interno di una nuova immagine.
In questo caso la funzione void cvSub(const CvArr* src, const CvArr* src1, const CvArr*
dst, const CvArr* mask = NULL) è la funzione OpenCV in grado di eseguire la differenza tra due
immagini (src e src1) e di salvare la differenza all’interno di una nuova immagine (dst).
La funzione cvSub ha la particolarità di poter eseguire perfettamente la differenza se le due immagini sono salvate sul filesystem e, quindi, sono immagini statiche perché non vengono modificate
e rimarranno sempre tali.
Mentre se le immagini da utilizzare provengono dalla webcam, queste sono immagini dinamiche che cambiano ogni volta che è interpellata la webcam. Per farsi passare l’immagine del momento,
serve un’immagine statica, cioè un’immagine di confronto (background) con quella del momento
(frame).
Questo problema ha due possibili soluzioni, la prima è quella di interpellare una sola volta la
webcam per l’immagine background e successivamente interpellarla solamente per il frame, mentre
la seconda è quella di copiare il frame all’interno di un’altra immagine solamente la prima volta.
Studio e implementazione di un tracking match-up
| 27
Nel primo caso sorgono altri problemi nell’immagine background, perché questa risulta essere
sempre vuota, mentre nel secondo caso la copia viene effettuata solamente se nella struttura dell’immagine frame sono stata salvate dinamicamente almeno 90 immagini.
FIGURA 1.1
La webcam interpellata per la cattura del backgorund (nella Figura 1.1 la finestra BG) si modifica esattamente come se fosse il frame stesso, per cui non c’è mai una necessaria differenza di
immagine tra le due.
Copiando, invece, il frame all’interno del background una sola volta, la necessaria differenza di
immagine funziona senza alcun problema (come visualizzato in Figura 1.2).
FIGURA 1.2
28 | Studio e implementazione di un tracking match-up
Come si può notare dalla Figura 1.2, la differenza di immagine funziona utilizzando il metodo
di copia dell’immagine catturata dalla webcam una sola volta.
L’approssimazione dei contorni
L’approssimazione dei contorni è quel metodo che richiede la conoscenza matematica delle
figure geometriche in modo da riuscire ad approssimare il contorno recuperato con uno dei loro.
I contorni sono quella parte dell’immagine dove la luminosità e i colori cambiano bruscamente.
Per esempio la mano e il dito hanno la possibilità di essere approssimati con un’ellissi e un
cerchio come rappresentato in Figura 1.3.
FIGURA 1.3
Per l’approssimazione esiste comunque una funzione OpenCV in grado di approssimare qualunque contorno in quello di una forma geometrica.
In questo caso però non si vuole approssimare l’intera mano, ma ogni suo componente per avere
una figura composta da un cerchio centrale con attaccate cinque ellissi.
I contorni all’interno di un’immagine si possono visualizzare tramite l’algoritmo di Canny implementato nella funzione cvCanny(const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size=3) delle OpenCV.
Studio e implementazione di un tracking match-up
| 29
La segmentazione
La segmentazione è un metodo particolare ed è in grado di accentuare determinati colori dell’immagine.
Segmentare un’immagine significa “partizionare” l’immagine in regioni significative. Essa è
utilizzata per ottenere una rappresentazione più compatta, estrarre degli oggetti o comunque come
uno strumento per l’analisi delle immagini e permette di dividere le immagini in insieme di pixel con
caratteristiche comuni.
La segmentazione richiede la visualizzazione chiara dei colori dell’immagine.
FIGURA 1.4
Un’immagine segmentata per trovare il colore della mano di un soggetto in un ambiente illuminato è rappresentato in Figura 1.4.
Come si può notare il colore della mano è evidenziato da un colore forte, facilmente riscontrabile all’interno dell’immagine.
Ma come si può notare dalla Figura non solo la mano è evidenziata con un colore forte, ma anche un oggetto che si trova in basso a destra. Poi si evidenzia il nuovo colore della mano per riuscire
a fare il “tracking” della stessa.
30 | Studio e implementazione di un tracking match-up
Il classificatore a cascata di Haar
Il classificatore a cascata di Haar permette di creare programmi di “head-tracking” o “handtracking”, cioè consente di tracciare la mano o il viso dell’utente per implementare un mouse di sistema o per riconoscerne la posizione e la gestualità.
Il classificatore è un algoritmo che richiede una serie di campioni positivi, dove l’oggetto da
tracciare è presente e una serie di campioni negativi, dove l’oggetto da tracciare non è presente.
Il classificatore è un algoritmo molto preciso e richiede un insieme di campioni molto ampio per
poter aumentare la precisione di tracciamento.
Il classificatore a cascata di Haar permette tramite il confronto degli oggetti interessati presenti
nei campioni positivi di trovarli all’interno d’immagini catturate dalla webcam.
Studio e implementazione di un tracking match-up
| 31
Creazione dell’interfaccia utente
La creazione dell’interfaccia utente è stata implementata con l’ausilio delle OpenGL e del suo
toolkit GLUT.
L’idea è di realizzare una finestra con 5 pulsanti con una forma di manichino al centro della finestra, quest’ultimo con sopra degli indumenti e l’animazione della finestra decisa in base al “tracking”
della mano.
La finestra prevede quindi il caricamento di alcune immagini presenti all’interno dei cataloghi.
Il caricamento dell’immagine in una finestra GLUT si deve eseguire tramite il Texture Mapping, procedimento questi che permette di rendere simili alla realtà i paesaggi, le superficie o gli
oggetti virtuali.
Si deve quindi caricare prima l’immagine all’interno di una struttura particolare in grado di
racchiuderla.
In questo caso serve quindi una struttura in grado di recuperare tutti i dati legati all’immagine
d’interesse e di sistemarla una volta caricata all’interno della finestra nella posizione designata.
Per poter eseguire correttamente il texture mapping in OpenGL, le informazioni necessarie per
l’immagine sono le dimensioni e i pixel o dati, cioè quello che viene visualizzato all’interno dell’immagine stessa.
32 | Studio e implementazione di un tracking match-up
Capitolo 2
Architettura del progetto
Il modello hardware del progetto prevede l’utilizzo di una webcam usb, di un proiettore e di un
pannello come rappresentato nella Figura 2.1.
FIGURA 2.1
Il proiettore permette all’utente di vedere il desktop del computer sul pannello e, conseguentemente, avviato il software si è in grado di vedere la finestra con cui si andrà ad interagire.
Prima di descrivere l’intero progetto, saranno qui di seguito analizzate le due parti:
1 |
“Finger Tracking” che riguarda la fase delle OpenCV, di cattura delle immagini e di riconoscimento dell’azione scelta dall’utente e, quindi, il recupero di un ID identificativo che permette
di riconoscere il pulsante toccato;
2 |
“Interfaccia Utente” che riguarda la parte delle OpenGL, di creazione della finestra, dei suoi
componenti e dell’animazione legata poi all’ID recuperato dalla parte di “Finger Tracking”.
Studio e implementazione di un tracking match-up
| 35
Finger tracking
La parte di “Finger Tracking” è stata implementata con l’ausilio delle OpenCV, cioè la libreria
che permette di catturare, modificare, applicare filtri sulle immagini, giungendo perfino a creare l’immagine perfetta con cui riuscire a trovare le coordinate o la zona dove si trovano le dita dell’utente.
FIGURA 2.2: Use Case Diagram del Finger Tracking
Come si può notare dalla Figura 2.2, vi è una webcam usb che viene utilizzata per catturare due
tipi di immagini:
a |
il frame, un’immagine che viene salvata ogni secondo oppure ogni 90 frame ed è l’immagine
visualizzata al momento;
b |
il background, un’immagine salvata quando si avvia il programma, quindi un’immagine statica
che non cambia ed è salvata una sola volta per evitare che la futura differenza d’immagine possa
risultare non esistere perché il background è stato modificato.
L’azione “Trovare i rettangoli presenti nell’immagine” esegue una funzione che permette, tra-
mite dei calcoli matematici, di ottenere i rettangoli presenti all’interno di un immagine in qualsiasi
posizione e con qualsiasi colore di sfondo.
36 | Studio e implementazione di un tracking match-up
Questa funzione è stata inserita perché nel piano di lavoro si è previsto che la finestra d’interazione con l’utente abbia dei componenti (pulsanti rettangolari) e in questo modo il progetto stesso
riesce a trovare questi pulsanti e le coordinate dei loro vertici.
Le suddette coordinate sono salvate in una struttura dati di tipo CvSeq (vedi Appendice “C”)
utilizzabile perché può essere trattata come uno stack, una coda oppure un array.
Tale struttura dati è, quindi, una struttura adattabile a qualsiasi esigenza e i dati contenuti si
possono recuperare facilmente decidendo solamente in quale modo trattarla.
L’azione “Trovare le differenze all’interno dei rettangoli dell’immagine” analizza solamente
quella parte d’immagine posta all’interno dell’area dei rettangoli e, quindi, risulta come se analizzasse un’immagine indipendente, cioè che riguarda solamente un’area rettangolare, indicando le coordinate del vertice che si trovano in basso a sinistra.
In questa fase sono, inoltre, rimossi i colori per avere due immagini in scala di grigio ed in
questo modo i colori, la luminosità e altri fattori che tendono a distorcere anche se leggermente l’immagine, sono eliminati totalmente.
Entrambe le immagini in scala di grigio sono di conseguenza passate a una funzione che fa la
differenza tra le due, o meglio il risultato della funzione è un’immagine in scala di grigio, che può essere nera qualora le due immagini risultino uguali, viceversa contiene la loro differenza e cioè quella
parte dell’immagine che risulterà diversa.
Di seguito tramite l’analisi dei pixel e cioè gli elementi puntiformi che compongono l’immagine, si cerca di trovare le coordinate di tale differenza che, qualora esistente saranno sottoposti ad
analisi i pixel (l’immagine non è altro che una matrice con nr X righe e nr Y colonne, dove X è diverso
da Y), per trovare quelli che sono diversi da zero, perché questo significa essere diversi dal colore
nero e avere una certa luminosità, la quale determina l’esistenza di un qualche oggetto oppure forma
nell’immagine.
Studio e implementazione di un tracking match-up
| 37
FIGURA 2.3: Activity Diagram del Finger Tracking
Nella Figura 2.3 si pone in evidenza come le OpenCV, cioè quella parte del software del progetto, riescano ad interfacciarsi nonché ad interagire con il componente hardware, la webcam usb e
l’utente che utilizza la tastiera.
Il sistema comincia inizializzando nella funzione principale tutte quelle strutture utili per il
riconoscimento del device usb, per il salvataggio dinamico delle immagini, per la memoria dinamica
in generale, per il salvataggio delle coordinate dei punti che servono per i vertici dei rettangoli, per i
punti dei contorni e per i pixel esistenti all’interno della differenza di immagini.
L’accesso alla webcam permette di salvare l’immagine del momento e il background.
L’immagine del momento è utilizzata per trovare i rettangoli, mentre entrambe sono poi utilizzate per cercare la loro differenza.
Il sistema aspetta, ad un certo punto, una chiave dalla tastiera per poter continuare a catturare
l’immagine ed eseguire le altre funzioni oppure per terminare il programma.
38 | Studio e implementazione di un tracking match-up
In questo momento si rimane in attesa per l’interazione tra software e l’utente che, come rappresentato nella Figura 2.3, qualora l’utente prema il tasto ‘q’ il programma termina, mentre se non
lo preme il programma continua a catturare l’immagine del momento e non il background, dato che
quest’ultimo risulta essere già stato catturato e al sistema serve solo una volta per evitare di avere
delle differenze di immagini sbagliate.
FIGURA 2.4: State Machine Diagram del Finger Tracking
La Figura 2.4 evidenzia, in modo meglio dettagliato che nella Figura 3, la lista delle azioni
chiamate all’interno del programma e sistemate in ordine cronologico.
Si riesce a notare come il sistema continui a recuperare solamente l’immagine del momento
per confrontarla con il background e ottenere, quindi, la sola parte d’immagine che si differisce tra
le due.
Studio e implementazione di un tracking match-up
| 39
FIGURA 2.5: Sequence Diagram del Finger Tracking
La Figura 2.5, invece, evidenzia come il sistema si evolve nel tempo e la tipologia d’interazioni
tra i componenti chiamati in causa dalle varie funzioni.
Si nota che l’inizializzazione della struttura che controlla se nel sistema vi sia presente un device video, permette alle OpenCV d’interagire con un componente hardware in modo sincrono.
Inizializzata la struttura, si chiama una funzione che cerca il device all’interno del sistema e se
il device esiste, ritorna un numero identificativo unico.
Si ottiene quindi un’interazione del tipo “sistema – webcam” e “webcam – sistema”.
Questo tipo di relazione esiste anche quando si recuperano le immagini dal device e queste sono
salvate all’interno di una struttura dati IplImage.
40 | Studio e implementazione di un tracking match-up
Si esegue quindi la seguente lista di istruzioni:
1 |
Inizializzazione delle strutture IplImage*, delle strutture dati CvSeq* e della memoria dinamica
CvMemStorage*.
2 |
Inizializzazione della struttura che permette l’accesso alla webcam via usb, per la cattura delle
immagini.
3 |
Interrogazione della webcam per salvare l’immagine attualmente vista in una struttura IplImage* già inizializzata.
4 |
Seconda interrogazione della webcam per salvare il background (sempre una struttura di tipo
IplImage*) e controllo che la struttura non sia vuota.
5 |
Chiamata alla funzione che trova i rettangoli presenti nell’immagine attuale(frame).
6 |
Ingresso in un ciclo per la cattura dell’immagine attuale della webcam; l’utente per uscire da
tale ciclo deve premere sulla tastiera la lettera ‘Q’.
7 |
Chiamata alla funzione che trova la differenza tra le due immagini; se tale differenza esiste, le
coordinate vengono salvate in una struttura globale di tipo CvSeq*.
8 |
Se questa struttura non è vuota, si stampano a video le coordinate, altrimenti si cercano ancora.
9 |
Premendo il tasto ‘Q’, il programma esce dal ciclo e vengono rilasciate tutte le strutture utilizzate e la memoria occupata (a parte la memoria dinamica CvMemStorage*).
Come evidenziato nei capitoli precedenti, l’”Object Detection” può essere eseguito in modi
diversi e con metodi differenti, ma comunque tra di loro simili.
Per la prima versione del “Tracking Finger” è stato deciso di provare con la differenza di immagine perché per la “proiezione” è stato utilizzato un pannello non trasparente ma composto da un
materiale confacente per la retro-proiezione.
Quando l’utente appoggia la sua mano su di un pannello come quello utilizzato e sopra descritto, la webcam percepisce solo la sua ombra. Non vede nemmeno l’ombra del corpo dell’utente, ma
solamente quella della sua mano appoggiata sul pannello.
Studio e implementazione di un tracking match-up
| 41
Algoritmo di tracking
Per eseguire il tracking di un oggetto o il recupero delle sue coordinate all’interno dell’immagine, in un piano cartesiano 2D dove l’asse delle ascisse è la “width” (con la risoluzione della webcam
utilizzata ha il suo massimo nel valore 320) e l’asse delle ordinate è la”height” (con la risoluzione
della webcam ha il suo massimo nel valore 240), esistono varie opzioni e quasi tutte funzionanti.
Il pannello non è trasparente e il background dell’immagine catturata non cambia se dietro al
pannello passano le persone e, pertanto, questa è una parte dell’immagine sempre uguale.
L’unica parte che cambia è quando l’utente appoggia la sua mano sopra il pannello, perché a
quel punto l’ombra è riflessa solamente verso la webcam.
La differenza di immagine è risultata in questo caso la scelta migliore.
Nell’esecuzione di questo metodo si deve prima salvare un’immagine statica, cioè che non sia
più modificabile, pertanto l’unico modo per realizzare questa operazione è di utilizzare la funzione di
clonazione d’immagine.
Si deve registrare che, purtroppo, la funzione di OpenCV cvCloneImage() ha una particolarità,
e cioè che la clonazione è eseguibile solamente dopo l’avvenuta cattura di almeno 90 immagini da
parte del software.
Si deve dare atto che, invece, provando con la funzione che interpella la webcam per avere
l’immagine visualizzata al momento, eseguendo tale funzione una sola volta e non interpellandola più
successivamente, l’immagine sia esattamente uguale a quella del momento e, di conseguenza, non si
catalogherà mai una differenza d’immagine. Il risultato sarà l’assenza totale di quell’elemento, come
ad esempio la mano, appoggiato sul pannello.
42 | Studio e implementazione di un tracking match-up
FIGURA 2.6
La situazione mostrata in Figura 2.6 è riconducibile solamente nel caso in cui si voglia interpellare la webcam anche per la cattura del background.
Infatti la differenza d’immagine non viene eseguita correttamente.
Quanto sopra affermato non si verifica con la clonazione d’immagine implementata dalla libreria OpenCV.
L’algoritmo utilizzato in questo caso è il seguente:
1 |
Inizializza le struttura CvCapture*, CvMemStorage*, IplImage*;
2 |
Interpella la webcam per il salvataggio dell’immagine attuale con la funzione cvQueryFrame();
3 |
Incrementa il contatore della cattura dei frame;
4 |
Se il contatore == 90, allora fai la clonazione dell’immagine del momento e controllo = true e
fr = 0.
5 |
Ogni 90 frame, esegui a funzione di differenza dell’immagine tra il frame e il background: cvSub().
Questo semplice algoritmo permette di avere l’immagine comprensiva della differenza.
Questo algoritmo nondimeno analizza l’intera immagine passata, mentre la parte da analizzare
è l’area dei rettangoli, perché l’interfaccia utente è stata ideata con i componenti pulsanti con i quali
l’utente dovrà interagire.
Serve perciò una funzione in grado di trovare qualsiasi rettangolo all’interno dell’immagine e
con qualsiasi colore.
Studio e implementazione di un tracking match-up
| 43
Si conosce che la forma geometrica del rettangolo ha tutti i suoi angoli di 90°, di conseguenza
questi sono angoli retti.
Si trova all’interno dell’immagine un insieme di pixel abbastanza grandi e con caratteristiche
comuni, quali il colore, di seguito si controlla se esistono 4 linee che racchiudono quest’area. Successivamente si controlla se l’angolo d’incontro è di 90° gradi e se questi sia il punto in cui le linee
terminano.
Con questa procedura si trovano tutti i rettangoli presenti in un’immagine.
FIGURA 2.7
Nella Figura 2.7 è rappresentato il risultato della funzione sopra descritta, la quale riesce a trovare i rettangoli eseguendo una “Square Detection”.
Si deve registrare che, avendo sostituito il pannello in un lastra in plexiglass trasparente, la
suddetta funzione trovava i rettangoli anche nello sfondo dell’immagine e ugualmente se la persona presentava una forma geometrica simile nel capo di vestiario che indossava in quel momento.
Nel progetto si è scelto, quindi, di adoperare un approccio statico alle coordinate dei vertici dei rettangoli.
Questi sono stati inseriti nel modo di “variabili globali” all’interno di un struttura di tipo
CvPoint.
Avendo ottenuto a questo punto le coordinate dei vertici dei rettangoli per utilizzare il ROI, cioè
l’area di interesse che è quella parte dell’immagine che si vuole analizzare senza eseguire i filtri o
44 | Studio e implementazione di un tracking match-up
altre operazioni su tutta l’immagine ed appesantire così il programma o la funzione utilizzata, servono
anche altri due dati e cioè “width” e “height” (Figura 2.8).
FIGURA 2.8
In un’immagine che ha una dimensione dipendente dalla risoluzione della webcam, per calcolare la lunghezza di due lati del rettangolo (width e height) si utilizza la seguente formula.
sqrt((x1-x2)2 - (y1-y2)2)
Con lo scopo di avere dei rettangoli con le stesse misure della finestra (come in Figura 2.7), in
questo caso sono presi in considerazione solo i rettangoli più piccoli, per evitare di andare ad analizzare quei rettangoli che non sono effettivamente dei pulsanti. Questo errore è presente nella funzione,
perché viene visto parte dello sfondo esterno dello stesso colore e quindi secondo la funzione si tratta
di un rettangolo.
Si deve registrare che ora sono presenti tutti i dati, anche le coordinate del vertice chiamato pt0
in Figura 2.8, pertanto, si può evidenziare la regione d’interesse per avviarsi ad analizzare solamente
quella parte d’immagine che appartiene all’area dei pulsanti.
Si può affermare che il ROI è molto utile per evitare di analizzare l’intera immagine, quando è
nota la possibile posizione di apparizione dell’oggetto interessato.
Questo metodo di delimitazione prende un’area a forma geometrica rettangolare, in cui si espli-
Studio e implementazione di un tracking match-up
| 45
cita la coordinata che si trova in basso (o in alto) a sinistra e la lunghezza dei lati che vanno in altezza
e in larghezza.
FIGURA 2.9
Nella Figura 2.9 è visualizzato il funzionamento del ROI.
Questo criterio crea un’immagine vista dal sistema come un’immagine indipendente dalla precedente, anche se effettivamente sono la stessa cosa ed anche la struttura è sempre quella, con una sola
differenza e cioè che all’interno della struttura IplImage* sono stati salvati tutti i dati relativi al ROI.
Si deve annotare che a questo punto, però, avendo utilizzato il pannello trasparente in plexiglass non
è più possibile eseguire la differenza d’immagine, perché essendoci persone e cambiamenti di sfondo
con maggior frequenza, la differenza d’immagine secondo il sistema è sempre presente.
In questo caso si cerca, quindi, di usare un algoritmo che implementa la segmentazione, cioè la
“detetion” di un oggetto in base al colore, tenuto conto che la trasparenza del pannello permette alla
webcam di vedere i colori.
FIGURA 2.10
46 | Studio e implementazione di un tracking match-up
Il nuovo algoritmo è:
1 |
IplImage* frame = cvQueryFrame();
2 |
CvScalar colori tra cui il rosa è compreso;
3 |
Eseguo il filtro per accentuare il colore;
4 |
Se il colore == trovato allora mano == trovata.
Con la segmentazione [27][28][29] si può evidenziare qualsiasi colore per rendere la capacità
di “tracking” molto più facile rispetto ad altre metodologie.
Si deve ricordare che non sempre la segmentazione funziona su ogni tipo di sfondo, infatti l’oggetto evidenziato deve trovarsi su di uno sfondo molto diverso e non confondibile. L’oggetto, inoltre,
deve essere anche ben illuminato in modo omogeneo.
In questo caso, a volte, la luce riesce a far percepire alla webcam un colore diverso da quello
che è nella realtà e se questo succede la segmentazione può fallire e non trovare l’oggetto desiderato
ma un altro qualsiasi.
Studio e implementazione di un tracking match-up
| 47
Interfaccia utente
La parte dell’interfaccia Utente è stata implementata con l’ausilio di OpenGL e del toolkit
GLUT.
Questa parte prevede solo la creazione della finestra con i suoi componenti, quali pulsanti e
immagini dinamiche, o meglio l’utilizzo di componenti “immagine” nell’animazione.
OpenGL non prevede la creazione dei pulsanti come l’applet java e, quindi, sono state utilizzate
solamente le immagini.
FIGURA 2.11
Nella Figura 2.11 è mostrata l’interfaccia con cui l’utente deve interagire, la quale prevede 5
pulsanti intorno ad un manichino che indosserà gli indumenti presenti nel catalogo del negozio.
Per inserire i pulsanti e il manichino con gli indumenti si utilizza un metodo chiamato texture
mapping, il quale serve per rendere realistici o vicini alla realtà degli oggetti, delle superfici o solamente per inserire in una finestra delle immagini.
48 | Studio e implementazione di un tracking match-up
Questo metodo permette di utilizzare le immagini come semplici componenti della finestra.
E’ molto utilizzato nei giochi quando si vuole ricreare un paesaggio o un edificio, ma anche
delle semplici superfici.
Le immagini utilizzate possono essere di qualsiasi formato, purché venga utilizzata la libreria
più adatta a salvarle all’interno di una struttura dati, dato che GLUT e OpenGL non hanno nessuna
implementazione che gli consenta di salvare le immagini durante il caricamento.
Oltre al metodo di texture mapping, i pulsanti possono essere creati anche tramite le funzioni
di disegno di OpenGL, che permettono di disegnare diverse forme geometriche come appunto il quadrato e il triangolo.
FIGURA 2.12
In Figura 2.12 è rappresentato il funzionamento del pannello sul quale è retro-proiettata la finestra creata con le OpenGL.
Si noti come le OpenGL prima di tutto creano la finestra utente, inseriscono tutti i componenti
con il texture mapping, eseguono l’animazione delle texture (che senza la parte delle OpenCV non
è implementata), eseguono il ridimensionamento della finestra stessa nel caso in cui qualcuno la ingrandisca e, per recuperare i dati degli indumenti mostrati al momento sul manichino, eseguono la
lettura da file e salvano, poi, i dati in un array.
La scrittura sulla finestra è una parte dell’animazione del sistema ed è seguita solo nel caso in
cui l’utente appoggi la sua mano sul pulsante “info” (per le azioni vedere il capitolo di Integrazione).
Studio e implementazione di un tracking match-up
| 49
Texture Mapping
Con questo metodo è stata creata l’interfaccia utente riprodotta nella Figura 2.11.
Il texture mapping in OpenGL è un metodo che cerca di rendere il più reale possibile le superfici, i colori, e altro presenti all’interno della finestra, ma è un metodo particolarmente adatto quando
si cerca di realizzare dei paesaggi, sistemare la luminosità dell’ambiente o altro.
In questo caso si possono notare i 5 pulsanti: “back” in alto a sinistra, “next” in alto a destra,
“modifica sopra” in basso a sinistra, “modifica sotto” in centro, “informazioni prodotti” in basso a
destra.
Al centro è riprodotto un manichino con sopra due immagini, nel caso in questione trattasi
d’indumenti.
Per caricare le immagini all’interno di una struttura dati, è possibile usare una libreria che possa
caricarne diversi tipi (jpg, png, bmp e altro), quali DevIL, LodePNG, libpng oppure la struttura dati
delle OpenCV IplImage*. Quest’ultima permette di caricare soprattutto le immagini in formato jpg.
Per il texture mapping i dati dell’immagine che interessano particolarmente sono la dimensione
dell’immagine (IplImage* -> width e IplImage*-> height) e i dati salvati al suo interno (IplImage*
-> data).
Una volta caricata l’immagine in una struttura dati si eseguono alcune funzioni di OpenGL per
riconoscere tale immagine come texture.
In questo caso per prima cosa si inizializza l’id della texture, cioè quel valore GLuint che permetterà di riconoscere la texture in modo univoco. Con la funzione glGenTextures all’id è assegnato
un valore, mentre con la funzione glBindTexture s’identifica la texture che si vuole utilizzare o posizionare all’interno della finestra.
La funzione glTextParameteri() sistema i parametri della texture e i valori passati di solito
sono: GL_TEXTURE_MIN_FILTER (texture minifying) viene utilizzata quando si possono usare
più texture per una superficie; GL_TEXTURE_MAG_FILTER (texture magnification) viene usata
50 | Studio e implementazione di un tracking match-up
quando i pixel da collocare in un’area sono minori o uguali a un elemento della texture.
GL_LINEAR è, invece, una media ponderata dei quattro elementi della texture che sono più
vicini al centro del pixel. Successivamente con glTexImage2D si inserisce l’immagine nella texture.
Si può affermare che per inserire la texture all’interno di un rettangolo è come disegnare una
semplice forma geometrica, ma bisogna inserire prima le coordinate della texture, che in questo caso
sono in un piano bidimensionale (glTexCoord2f) e dopo inserire le coordinate dei vertici del rettangolo (glVertex3f).
Studio e implementazione di un tracking match-up
| 51
Integrazione Finger Tracking
e Interfaccia Utente
Avendo creato le due parti del progetto in modo autonomo, ora si andrà a posizionare insieme il
codice scritto in OpenGL e in OpenCV (per il codice nel dettaglio si veda in Appendice C).
In questo modo il sistema crea la finestra, esegue la cattura dell’immagine attuale e procede alla
sua analisi, continua a visualizzare la finestra grazie al ciclo delle OpenGL.
La cattura dell’immagine attuale ha bisogno di essere eseguita in continuazione, la visualizzazione della finestra dell’interfaccia utente ha bisogno, invece, della chiamata alla funzione glutMainLoop(), che è una funzione implementata per eseguire la continua visualizzazione dei componenti e dell’animazione.
L’integrazione del sistema prevede di continuare a visualizzare la finestra creata e, allo stesso
tempo, di continuare la cattura dell’immagine e la sua analisi.
Le due parti del sistema devono però comunicare tra loro, cioè la parte di “Finger Tracking”
deve passare ID identificativo del pulsante scelto dall’utente alla parte di animazione dell’interfaccia,
in modo tale da poter eseguire successivamente l’animazione collegata al pulsante prescelto.
Mettendo insieme il codice precedente si avrebbe un enorme problema, cioè due cicli dai quali
non si può uscire senza chiudere la finestra o la cattura dell’immagine.
Infatti mettendo insieme il codice e chiamando semplicemente le due funzioni, quella delle
OpenCV e quella delle OpenGL, si crea solamente un programma che prima esegue una cattura dell’immagine del momento e procede con la sua analisi, una volta premuto ‘q’ (che come mostrato nelle
figure dei diagrammi è il tasto per uscire), il sistema visualizza la finestra con i vari componenti e,
visto che sono parti completamente indipendenti, non viene eseguita alcuna azione.
52 | Studio e implementazione di un tracking match-up
FIGURA 2.13
Nella Figura 2.13 si mostra come il sistema deve far comunicare la parte di OpenCV con le
OpenGL, anzi si può affermare che questi fa in modo che la parte di OpenCV venga completamente
inglobata dalle OpenGL.
Inglobare la parte delle OpenCV significa che per migliorare la loro comunicazione, l’ID del
pulsante trovato con il “Finger Tracking” deve essere una variabile per l’animazione della finestra
OpenGL.
L’integrazione del sistema può essere eseguita in 3 modi:
SOLUZIONE 1:
Si esegue “Finger Tracking” all’interno della funzione che disegna i componenti della finestra.
In questo modo è utilizzato il ciclo del toolkit GLUT e si toglie il ciclo di cattura dell’immagine.
Si deve annotare che un possibile problema potrebbe essere rappresentato dalla velocità, perché catturare l’immagine e analizzarla rallenta il rendering delle immagini di OpenGL.
Rallentando il rendering delle immagini, si rallenta anche la visualizzazione della finestra e
la cattura delle immagini trova maggiore difficoltà. Quest’ultima, infatti, è diminuita a causa della
pesantezza del codice e, quindi, ogni volta la cattura dell’immagine si blocca e rende impossibile il
tracciamento della mano del soggetto.
Studio e implementazione di un tracking match-up
| 53
Essendo resa più lenta tutta l’operazione dell’animazione e della cattura, il sistema si blocca e
non è possibile recuperare l’ID del pulsante.
Si ritiene che questa possa essere una soluzione da evitare.
SOLUZIONE 2:
Si esegue “Finger Tracking” all’interno della funzione che concretizza le animazioni, ritornando un determinato valore in modo da interrompere l’evento delle OpenCV e alleggerire il rendering
della finestra.
In questo modo una volta ricevuto il valore di ritorno, si chiama di nuovo la funzione di disegno.
Questa soluzione è ritenuta affidabile. Infatti nell’esecuzione sistema il “Finger Tracking” all’interno della funzione corretta.
L’animazione della finestra richiama la funzione che esegue il “tracking” della mano o dell’oggetto, ritornando un valore intero, identificativo del pulsante scelto.
I valori di ritorno sono:
-
0 nessun pulsante selezionato;
-
1 pulsante “next”;
-
2 pulsante “back”;
-
3 pulsante “sopra”;
-
4 pulsante “sotto”;
-
5 pulsante “info”.
Le azioni dei pulsanti sono le seguenti:
1 |
il pulsante “next” visualizza le immagini, relative alla parte sopra se è stato precedentemente
scelto il pulsante sopra, altrimenti quelle relative alla parte sotto, in senso crescente;
54 | Studio e implementazione di un tracking match-up
2 |
il pulsante “back” visualizza le immagini, relative alla parte sopra se è stato precedentemente
scelto il pulsante sopra, altrimenti quelle relative alla parte sotto, in senso decrescente;
3 |
il pulsante “sopra” indica di visualizzare le immagini degli indumenti per la parte sopra del
corpo;
4 |
il pulsante “sotto” indica di visualizzare le immagini degli indumenti per la parte sotto del corpo;
5 |
il pulsante “info” permette di scrivere delle informazioni, quali costo, taglie e colori, degli indumenti visualizzati al momento.
SOLUZIONE 3:
Si utilizzano thread separati per il “Finger Tracking” e per la notifica dell’evento da passare alla
funzione di disegno delle OpenCV.
In questo caso è previsto di utilizzare una fifo oppure una pipe per rendere le due parti del progetto completamente indipendenti ma comunicanti lo stesso tra di loro.
Il “Finger Tracking” va ad inserire l’ID del pulsante all’interno della pipe con una variabile che
indica di leggerlo. Nel frattempo la finestra viene visualizzata e la parte di animazione apre la pipe,
la quale se trova l’indice di lettura lo legge e poi lo eguaglia al letto, altrimenti non lo legge e non
esegue alcuna azione.
Una volta che l’ID è stato recuperato e segnato come letto, il “Finger Tracking” controlla tale
indice, riesegue la cattura e l’analisi dell’immagine.
Come anticipato, per l’implementazione del progetto è stata scelta la soluzione 2 perché è
quella che si adegua di più alle esigenze di programmazione e che rende la cattura dell’immagine
parte dell’animazione del sistema, in modo tale da creare prima la finestra per poi passare all’analisi
dell’immagine attuale e, nel prosieguo, ritornare l’evento alla finestra stessa per la nuova visualizzazione.
Studio e implementazione di un tracking match-up
| 55
FIGURA 2.14
Nella Figura 2.14 si mostrano le relazioni, in ordine cronologico, tra la parte di “Finger Tracking”
(OpenCV) e dell’interfaccia utente (OpenGL) con l’utente (User).
Scegliendo la soluzione 2, comunque si crea un ulteriore problema, cioè l’inizializzazione e il
rilascio della memoria avviene all’interno dell’animazione della finestra.
Per evitare di dover eseguire queste operazioni ogni volta e di occupare una quantità di memoria eccessiva, si è scelto di effettuare l’operazione di inizializzazione prima di creare la finestra,
mentre il rilascio della memoria è eseguito dopo la chiusura della finestra.
Il diagramma mostra che la prima operazione effettuata è l’inizializzazione delle strutture (1).
Successivamente si crea la finestra di interazione con l’utente (2). In seguito se l’utente sceglie di
effettuare una azione, questa è trovata dal “Finger Tracking” (3) e poi l’ID del pulsante è passato
all’animazione delle finestra (4) che eseguirà una delle azioni descritte prima (5).
56 | Studio e implementazione di un tracking match-up
FIGURA 2.15
La Figura 2.15 pone in evidenzia le relazioni tra i componenti e la parte di procedimento per
terminare l’esecuzione del progetto.
In questo diagramma è evidenziata il procedimento nel caso in cui l’utente decida di eseguire
un’azione.
Studio e implementazione di un tracking match-up
| 57
FIGURA 2.16
La Figura 2.16 evidenzia le possibilità dei comportamenti del progetto in qualsiasi situazione,
cioè sia che l’utente esegua un azione e sia che non la esegua.
Anche in questo caso sono inizializzate le strutture delle OpenCV, poi è creata la finestra d’interfaccia e visualizzata insieme ai suoi componenti. Se l’ID del pulsante è diverso dal valore intero
zero, è mostrata l’animazione, quindi è recuperata l’immagine successiva o precedente dell’indumento da modificare.
• Il progetto continua nella sua visualizzazione fino a quando la finestra non si chiude.
• In generale l’algoritmo del progetto è il seguente:
• Iinizializzazione delle strutture di manipolazioni delle immagini: IplImage*, CvMemStorage*,
CvCapture*, CvPoint e altre;
• Lettura dei dati da file per eseguire la scrittura delle informazioni degli indumenti visualizzati al
momento;
• Creazione della finestra: aggiunta dei componenti immagine ed esecuzione dell’animazione;
58 | Studio e implementazione di un tracking match-up
• Animazione: analisi dell’immagine catturata da webcam per recuperare tramite segmentazione
l’azione scelta dall’utente;
• Ritorno del valore ID, intero identificativo del pulsante scelto;
• Modifiche a livello visivo degli indumenti indossati al momento del manichino o visualizza la
stringa delle informazioni.
Studio e implementazione di un tracking match-up
| 59
Capitolo 3
Tecnica risolutiva
Come descritto nel capitolo precedente (Architettura del sistema), il progetto è stato integrato
con l’interfaccia utente divenendo tutt’uno con la finestra OpenGL.
La parte di “Tracking Finger” è stata implementata con l’utilizzo del metodo di “segmentazione” il quale come già evidenziato tratta l’analisi dell’immagine e la sua suddivisione in base al colore
dell’oggetto cercato.
I filtri di segmentazione comunque vengono eseguiti in serie e su vari livelli dell’immagine,
questo per avere alla fine un’immagine pulita con solo l’oggetto che si vuole tracciare o trovare.
In questo caso, avendo integrato il progetto, risulta un elemento di disturbo in più, cioè il
pannello retro-proiettato che non permette di vedere in modo nitido l’oggetto desiderato e, se quest’ultimo si fosse trovato in primo piano anche con uno sfondo multicolore o molto complicato da
analizzare, si sarebbe potuto ricorrere all’utilizzo di algoritmi di segmentazione complessi ed efficaci
che riescono ad estrarre ugualmente l’oggetto dall’immagine d’interesse.
Inoltre, nel caso in esame anche la luce non è situata in punti strategici che consentono di poter
aiutare la visualizzazione delle caratteristiche dell’oggetto.
In questo caso essendo però una situazione abbastanza diversa e con pochi cambiamenti che
precludono un certo tipo di analisi, si deve pensare ad una soluzione differente.
Nella sezione successiva si andranno ad evidenziare i difetti del metodo di “segmentazione”,
analizzando anche altri algoritmi che lo usano, nonché la descrizione del metodo risolutivo dei problemi riscontrati nella segmentazione con la descrizione della soluzione, che nel suo insieme può
definirsi elementare.
Studio e implementazione di un tracking match-up
| 61
La “segmentazione”
La segmentazione è un metodo che richiede l’oggetto cercato in primo piano, perché in questo
modo il colore è messo in risalto e l’illuminazione dell’ambiente permette di non confonderlo con
altri.
A livello d’implementazione la “segmentazione” può essere utilizzata in vari modi e attraverso
l’impiego di svariati algoritmi di manipolazione dell’immagine in grado di evidenziare al meglio i
colori desiderati per poter trovare l’oggetto cercato nella maggior parte dei casi.
Una volta evidenziato e trovato il colore, per controllare che sia l’oggetto desiderato o per vedere se esiste, si può eseguire l’algoritmo di Canny e controllarne il contorno.
Il controllo del contorno però è una soluzione abbastanza complicata, perché bisogna cercare di
approssimare un determinato tipo di contorno che può appartenere alla mano o al dito oppure ad una
gestualità della stessa, con una serie di figure geometriche quali l’ellissi o il cerchio.
Gli algoritmi [27][28][29] oggi esistenti per “head - hand detection” o per il loro “tracking”
sono basati sui metodi di segmentazione, cioè all’interno di questi algoritmi è presente una funzione
o un procedimento che richiama l’analisi dei colori dell’oggetto ricercato.
L’algoritmo [27] utilizza una tecnica basata sul “k-means clustering and filtering” per il “face
detection”. In questo caso si possono presentare due tipi di immagini, quella con lo sfondo omogeneo
e quella con lo sfondo complesso. Quest’ultima necessità dell’azione di segmentazione, cioè della
suddivisione in segmenti di pixel dello stesso colore.
Questo algoritmo cerca di ottenere la “zona calda” dell’immagine, vale a dire quella parte di
zona in cui è molto probabile trovare il volto della persona.
Vengono successivamente eseguite le tre fasi di seguito descritte:
1 |
La suddivisione in cluster;
2 |
trovare il segmento che comprende il volto;
3 |
filtrare tale segmento per il riconoscimento dei veri segmenti corretti.
62 | Studio e implementazione di un tracking match-up
Nella prima fase si utilizza lo spazio di colori CIELAB, che è composto dalla luminosità compresa da 0 (nero) a 100 (bianco), dall’asse R - G e dall’asse Y(giallo) - B. Questi è’ uno spazio di
colori assoluto e ne comprende la maggior parte.
Con l’algoritmo “k-means” si valuta la distanza dei colori e si partizionano i punti della matrice
in ingresso (IplImage*) in un numero di cluster. La base del “k-means” è rendere minima la somma
di tutti i cluster delle distanze punto - centro di massa all’interno di ogni cluster.
La suddivisione in cluster ha evidenziato che per le immagini a sfondo uniforme è meglio utilizzarne 3, mentre per quelle con sfondi eterogenei è meglio utilizzarne 4.
Nella seconda fase si trova il segmento che comprende il volto. In questo caso si calcolano i
centroidi di massa dei singoli cluster, cioè il punto che appartiene al cluster rispetto al quale la somma
di tutte le distanze risulta minimizzata.
Nella terza fase si applicano due filtri ai segmenti, uno in base al colore togliendo i pixel ritenuti
inutili, e l’altro di pulizia dell’immagine per riempire i buchi lasciati all’interno delle aree trovate.
Alla fine si applica il filtro per avere un immagine binaria (bianco e nero) per controllare la
dimensione delle aree trovate e classificarle come accettabili.
L’algoritmo [28] usa anche questo la segmentazione in base ai colori e, inoltre, fa indossare un
guanto su cui sono presenti 20 colori diversi e molto forti. In questo modo è stato implementato un
algoritmo “color pattern” per il “tracking” della mano.
L’algoritmo [29] usa invece l’algoritmo di “Mean Shift” e il filtro “Kalman” per un controllo
in 3D.
Si conclude affermando che la “segmentazione” è un metodo che non risulta applicabile se
l’oggetto si trova in secondo piano rispetto ad un altro all’interno dell’immagine analizzata, anche se
l’elemento di disturbo è un pannello trasparente.
Questo preclude la corretta visualizzazione dei colori, delle forme e anche in alcuni casi delle
ombre, perché la segmentazione può essere utilizzata anche nel caso in cui si cerchino delle ombre
(colore nero o scuro).
Studio e implementazione di un tracking match-up
| 63
Nella considerazione che questo progetto non è un vero e proprio tracciamento della mano, si è
preferito utilizzare un altro tipo di approccio e lasciando perdere i problemi legati ai colori, ai contorni
o ad altri elementi che richiedono un analisi per livelli e l’utilizzo di algoritmi complessi. Inoltre, il
pannello trasparente preclude anche la segmentazione, nel caso in cui non ci sia la retro-proiezione,
perché anche una superficie che riflette la luce, come fa il vetro quando scatti una foto con il flash,
rende l’immagine piena di disturbi.
Nella sezione successiva si analizza il tracciamento della mano mediante l’utilizzo degli IR.
Tracking finger mediante infrarossi
Come detto nella Sezione precedente si sono riscontrati dei problemi con il metodo di segmentazione, ampiamente utilizzato per qualunque software che esegue un’operazione di “hand - head
tracking” oppure la “object detection” e l’unica soluzione fattibile per questo progetto è stato l’utilizzo degli infrarossi.
La radiazione infrarossa è una fonte di calore che illumina l’oggetto irradiato e lo rende ben
visibili all’occhio di quelle webcam o telecamere in grado di vederli [15]. Infatti l’oggetto viene percepito con un colore molto chiaro vicinissimo al bianco.
Gli infrarossi permettono di evitare qualunque tipo di algoritmo complicato, come il classificatore di Haar, la segmentazione a livelli, l’algoritmo “k-means” oppure il filtro Kalman, e di sostituirli
con funzioni elementari che filtrano semplicemente eliminando i colori molto scuri.
FIGURA 3.1
64 | Studio e implementazione di un tracking match-up
La Figura 3.1 evidenzia la nuova struttura del sistema hardware. In questo caso sono stati aggiunti i faretti IR e sono stati entrambi posizionati vicino al pannello, in modo tale da irradiare tutti e
5 i pulsanti.
Gli IR sono il metodo più efficace ed efficiente per dei buoni risultati in tempo di esecuzione e
in quantità di errori, come dimostrano le applicazioni di Johnny Lee [7].
Infatti, tali applicazioni, anche se utilizzano il WiiMote, sono precisi e non hanno alcun tipo di
problema a livello di filtri o di altro, perché il sensore utilizzato è sensibile solo IR.
In questo modo sono cancellati i problemi relativi alla luminosità dell’ambiente, ai colori e ad
altri fattori di disturbo che non permettono di visualizzare l’immagine in modo nitido e corretto.
Per riuscire ad inserire il filtro infrarosso, questo progetto è stato modificato solamente nella
parte di analisi dell’immagine del momento, cioè in quella parte del sistema in cui si analizzano le
aree dei rettangoli per recuperare la mano o il dito del soggetto.
Un oggetto irradiato dalla luce IR risulta essere molto vicino al bianco (in RGB il suo codice
è descritto con la seguente tupla di valori (255, 255, 255)) e lo si può isolare usando un filtro con un
valore minimo di 254 su 255 nella sua tupla di valori. Questo tipo di filtro si utilizza solamente con
una telecamera con alta definizione e dopo aver ottenuto un’immagine in scala di grigio.
Nell’immagine in scala di grigio, viceversa, l’oggetto irradiato dagli IR risulta essere completamente bianco. In questo caso solamente un filtro che rimuove dall’immagine stessa quei colori diversi
dal bianco è in grado di isolare l’area dell’oggetto d’interesse.
Utilizzando una webcam con fissato sopra il suo occhio una pellicola fotografica, il filtro da applicare assume un valore minimo di 70 nella sua tupla di valori. Anche in questo caso sono eliminati
quei colori che sembrano provenire da un oggetto irradiato ma sono troppo deboli per essere presi in
considerazione, in quanto potrebbe trattarsi di sfumature riconducibili alla presenza dei due faretti
vicino al pannello.
Studio e implementazione di un tracking match-up
| 65
FIGURA 3.2
Come si può notare dalla Figura 3.2 l’oggetto risulta essere di un colore chiarissimo, ma d’altra
parte non si può abbassare i valori del filtro perché bisogna evitare quei piccoli disturbi che creerebbero confusione nella cattura dell’immagine d’interesse.
In questo caso i faretti sono stati posizionati davanti al pannello, in quanto se fossero stati dietro
di esso avrebbero irradiato solo il pannello di IR. Quest’ultimo li avrebbe riflessi verso la webcam
facendo così tracciare il pannello stesso privo dell’immagine d’interesse.
Infatti qualsiasi superficie è in grado di riflettere tali infrarossi. Si può notare, inoltre, che sull’immagine catturata in questo modo è presente solamente l’oggetto agli IR e niente altro, perché il
resto dell’immagine è ovviamente inesistente.
Si aggiunge che con questo metodo la capacità di visualizzazione della webcam viene ridotta a
causa della pellicola fotografica applicata.
A livello di analisi dell’immagine non si esegue più la “segmentazione”, perché in questo caso
non sono presenti tanti oggetti con colori disparati, ma risulta un unico oggetto sopra uno sfondo nero.
Quindi vengono eseguite le seguenti istruzioni:
1 |
Attivazione del ROI sul frame (immagine del momento);
2 |
Inizializzazione delle immagini per i filtri;
3 |
Trasformazione dell’immagine in scala di grigi;
4 |
Trasformazione dell’immagine in binaria (bianco e nero);
66 | Studio e implementazione di un tracking match-up
5 |
Applicazione dell’algoritmo di Canny;
6 |
Calcolo dei contorni trovati;
7 |
Se esistono contorni == true, allora ritorna 1;
8 |
Altrimenti 0.
I filtri eseguiti nelle istruzioni indicate nei punti 3, 4 e 5 sono molto semplici perché non richiedono calcoli particolari, ma solamente una conoscenza elementare del filtro minimo, nella funzione di
trasformazione binaria dell’immagine per riuscire a vedere l’oggetto irradiato di infrarossi.
L’algoritmo di Canny è utilizzato, come detto in precedenza, per recuperare i contorni degli
oggetti e, siccome l’immagine è nera tranne che per la parte dove si trova l’oggetto, se trova un solo
contorno questi è quello dell’oggetto stesso, quindi si tratta della mano del nostro utente.
Per scongiurare di trovare contorni di elementi che nulla hanno a che fare in questo caso, si
può evitare di utilizzare l’algoritmo di Canny. Un modo per il controllo dell’area è lasciare il filtro in
un’immagine binaria (bianco e nero), recuperare i vertici dei pixel che si trovano il più lontano possibile tra di loro e, quindi, questi sono sul margine del contorno e calcolarsi un’area approssimata ad un
quadrato o ad altro. Cercare quindi di dare un intervallo per cui l’area riscontrata è quella della mano
e ritornare a 1 se è così, altrimenti a 0 (il relativo codice si trova in Appendice “C”).
In questo caso, oltre a cercare di tracciare la mano dell’utente, si vuole riconoscere se l’oggetto
effettivamente trovato può considerarsi una mano. E’ eseguita l’operazione di “Hand detection”.
D’altra parte, per evitare totalmente di trovare oggetti esterni a quello cercato e di rendere il
codice ancora più veloce e leggero, si dovrebbe irradiare il pannello di infrarossi e quando l’utente
preme uno dei pulsanti per far eseguire al sistema l’azione scelta, il piano omogeneo degli infrarossi
troverebbe una distorsione a livello del pulsante selezionato.
A questo punto la webcam sarebbe in grado di trovare direttamente questo cambiamento e di passare subito il valore all’animazione della finestra creata come interfaccia per l’interazione con l’utente.
Con gli IR si possono eseguire differenti metodi di risoluzione di un problema che si crea per
Studio e implementazione di un tracking match-up
| 67
l’utilizzo degli algoritmi di manipolazione delle immagini.
Se si analizzano altri progetti che prevedono la “detection” o il “tracking”, nessuno di loro
presenta una struttura di retro-proiezione e, quindi, nessuno di questi ha l’oggetto interessato, cioè
quello da tracciare e riconoscere nascosto dietro ad un pannello il quale riesce a rimuovere tutte le
caratteristiche, in particolare che lo rendono riconoscibile, quali colore, forma ed area.
In questo elaborato si è utilizzata una libreria di “computer vision” e una serie di componenti rientranti in una fascia economica, con l’intenzione di realizzare un “catalogo interattivo” destinato a quei
commercianti e negozi che non hanno la possibilità di acquistare uno strumento di “touchscreen”.
La modifica apportata per poter eseguire l’azione desiderata dall’utente, in questo caso ha visto
la scelta di un cambiamento a livello strutturale del progetto di base.
Si può affermare che, a questo punto, il progetto è funzionante anche se non si utilizzano completamente le tecniche intrinseche delle OpenCV.
Nel capitolo successivo è descritta tutta la procedura di testing.
68 | Studio e implementazione di un tracking match-up
Capitolo 4
Esperimenti
I vari test effettuati hanno evidenziato alcuni difetti dei metodi utilizzati precedentemente e
alcune soluzioni corrette dei vari problemi.
Le attività di testing sono servite per capire quali dei metodi presi in considerazione nei precedenti capitoli sono veramente in grado di creare il progetto descritto in questo elaborato.
Si deve registrare che vi è anche un’altra soluzione lievemente diversa da quella progettata e per
questo motivo non è stata analizzata nella sua architettura.
Di seguito è descritto il test della parte di “Tracking Finger” mediante il metodo della differenza
d’immagine, mentre successivamente sono descritti i test del progetto, prima con lo stesso metodo del
“Tracking Finger” e poi mediante l’utilizzo degli infrarossi.
Testing del “tracking finger”
mediante il metodo
della differenza d’immagine.
La parte di “Tracking Finger” implementata con il metodo della differenza d’immagine è analizzata con delle finestre, per evidenziare i risultati ottenuti e quindi per controllare il comportamento
di questa parte del progetto.
Essendo la differenza d’immagine uno dei metodi più semplici per tracciare un oggetto senza
andare incontro ad enormi difficoltà, si deve analizzarlo in ogni dettaglio in quanto pur risultando il
più semplice è anche quello con il maggior numero di problemi e di limitazioni.
Per prima cosa si procede con il controllo di entrambe le immagini (frame e background), ne-
Studio e implementazione di un tracking match-up
| 71
cessarie per eseguire una differenza d’immagine, e che queste non siano vuote. In questo caso significherebbe che una delle due immagini è salvata con un procedimento ritenuto non corretto e che porta
ad avere una delle due immagini inesistenti. Quando un’immagine è inesistente questa viene mostrata
come un insieme di pixel completamente neri.
Se una delle due immagini è nera, l’altra risulta essere la differenza tra le due e pertanto esistendo sempre porta il sistema a riscontrare una serie di azioni mai scelte dall’utente.
FIGURA 4.1
Nella Figura 4.1 appare che sia il frame e sia il background sono salvati in modo corretto, perché
le due immagini non sono nere e mostrano perciò l’immagine rilevata al momento dalla webcam.
Il background è uguale al frame in quanto è il primo salvataggio effettuato dell’immagine stessa
e non essendoci l’interferenza di un oggetto esterno al momento, questo procedimento sembra essere
tutto corretto.
L’immagine al centro visualizza i rettangoli trovati dalla funzione che controlla l’immagine e
cerca i rettangoli presenti al suoi interno. Questi possono essere in qualsiasi posizione e di qualsiasi
colore.
Si nota però che c’è ne sono alcuni i quali hanno l’area grande quanto la finestra, ma questi non
sono presi in considerazione, perché si sa già a priori che i rettangoli da trovare sono quelli che rappresentano i pulsanti della finestra utilizzata dall’utente, quindi, non ne possono esistere di grandezza
eguale alla finestra o di altre determinate grandezze.
72 | Studio e implementazione di un tracking match-up
Anche questa è un’informazione conosciuta a priori, in quanto si conosce la risoluzione della
webcam utilizzata, cioè 320x240.
Si vuole inoltre evidenziare che di un unico rettangolo composto da 4 vertici, il “Tracking Finger” ne evidenzia almeno 16. Qui è presente un eccesso di dati , quindi, un utilizzo eccessivo della
memoria di salvataggio (la struttura CvSeq*). Questa infatti continua ad incrementarsi ogni volta che
il sistema trova un numero eccessivo di rettangoli. Anche in questo caso si vuole evidenziare che a
priori si conosce già che il numero dei rettangoli non deve eccedere i 5, quindi il numero massimo di
vertici è di 20.
FIGURA 4.2
Nel caso in cui, viceversa, all’interno dell’immagine appare un altro oggetto al momento della
cattura, si può notare che entrambe le immagini risultano modificate e, quindi, non esisterà mai una
differenza di immagine.
A causa della scelta di far catturare entrambe le immagini dalla webcam, si deve registrare che
ogni qual volta appare un oggetto diverso da quello di background originale, il sistema stesso modifica sia il frame che il background.
Si rende così inutile la metodologia della differenza d’immagine, quindi si è cercato di trovare
un altro modo per salvare il background, soprattutto evitando di non renderlo dipendente dalla webcam ed in modo tale da escludere la modifica dell’immagine ogni volta.
Le modifiche apportate a livello di codice rivedono il salvataggio delle immagini e la creazio-
Studio e implementazione di un tracking match-up
| 73
ne dell’immagine background, quella cioè che serve per realizzare la differenza d’immagine con il
frame.
Per fare questo, qualunque operazione di analisi si effettua dopo ogni 90 frame catturati, mentre
il salvataggio del background si esegue una sola volta tramite la clonazione del frame stesso.
Quindi il background è salvato solamente dopo il primo raggiungimento dei 90 frame e non è
più modificato successivamente. Si può affermare che tale immagine diventi di tipo statico.
FIGURA 4.3
La Figura 4.3 dimostra che la scelta effettuata per il salvataggio del background è corretta.
Difatti se all’interno dell’immagine appare un altro oggetto (come in questo caso le dita della mano),
l’immagine frame è modificata perché salvata l’immagine del momento vista dalla webcam. In questo caso nell’immagine background, avendola salvata con la clonazione dopo il primo raggiungimento dei 90 frame, si nota, dalla figura 4.3, che l’oggetto presente nel frame non è visualizzato al suo
interno.
La funzione di differenza d’immagine è eseguita correttamente. Il sistema trova all’interno del
rettangolo un oggetto diverso da quello presente sul background e, quindi, trova le coordinate dell’oggetto stesso, o meglio trova il primo pixel analizzato della matrice che risulta essere diverso e stampa
tali coordinate a video (44,23).
74 | Studio e implementazione di un tracking match-up
Si precisa però che le coordinate stampate non rappresentano quelle effettive all’interno dell’immagine totale, ma si riferiscono al sistema di coordinate all’interno del rettangolo stesso.
Testing del progetto mediante
la differenza d’immagine
Avendo sistemato il problema relativo al salvataggio del background, si procede con il test del
progetto mediante la differenza d’immagine.
Si deve segnalare che, purtroppo, a causa della variazione della luce e della luminosità dell’ambiente, il programma riesce a trovare alcune differenze tra il frame e il background inesistenti
all’occhio umano. Infatti, l’utente non ha effettivamente scelto alcuna azione eppure il programma
continua a trovarne.
Per evitare che il software segnali delle differenze causate dalla luce e dall’ambiente circostante, è stato scelto di utilizzare una funzione OpenCV diversa dalla cvSub().
La funzione cvAbsDiff() esegue sempre la differenza tra due immagini, ma ne differisce per un
particolare, è eseguito il modulo della differenza, cioè se all’interno del frame e del background un
oggetto differisce a causa della luce, questa piccola differenza non viene presa in considerazione.
Tale funzione esegue, quindi, la differenza di immagine senza rilevare quei cambiamenti dovuti
alla luminosità o all’ambiente né agli sbalzi di luce.
FIGURA 4.4
Studio e implementazione di un tracking match-up
| 75
La Figura 4.4 evidenzia dapprima l’idea di essere provvisti di un tavolo retro-proiettato e chiuso sui lati per evitare alla luce esterna di entrare, in modo tale da sfruttare le ombre come in questo
progetto che vuole realizzare un sistema di “touchscreen” economico [30].
Il concetto è quello di ottenere il massimo rendimento dall’illuminazione e dall’ambiente per
catturare le ombre della mano o di altri oggetti ed eseguire di conseguenza l’azione desiderata all’utente.
Si deve registrare che, purtroppo, la retro-proiezione sul pannello dà origine agli stessi problemi
della funzione cvSub().
Il sistema vede una finta azione e cerca di eseguirla, a volte segna che l’utente ha scelto di eseguire due azioni che non sono eseguite in quanto si deve premere un pulsante alla volta.
Avendo riscontrato questo tipo di problematica con la retro-proiezione, si è ideata una struttura
diversa rispetto a quella provata in quel momento. Infatti, il modulo di proiezione è stato spostato per
proiettare l’interfaccia utente sul muro dietro alla struttura mentre il pannello è utilizzato come una
tastiera.
Si deve registrare anche in questo caso un problema. Qualora si cerca di premere un pulsante
per cui bisogna passare sopra gli altri, il sistema vede entrambe le ombre e interpreta questa situazione
come “l’utente ha premuto due pulsanti, sbagliato, non eseguo niente”.
Questo si può risolvere velocemente eseguendo un controllo dell’area dell’ombra rilevata e
calcolandone un valore approssimativo per stimare se si tratta della mano o di un altro oggetto.
Anche in questo caso il tipo d’implementazione non rappresenta l’idea del progetto descritto in
questo elaborato, pertanto non è stata presa in considerazione.
Per vari motivi legati al sistema di retro-proiezione e per i problemi risultati nell’attività di testing
effettuata, si è proceduto a cercare di utilizzare altri metodi implementati anche in altre applicazioni,
come per esempio la “segmentazione”, il riconoscimento delle ombre, il classificatore di Haar.
Nessuno di questi è risultato di possibile implementazione nel progetto in esame, in quanto
l’oggetto richiesto non si trova in primo piano, cioè non è presente davanti alla webcam.
76 | Studio e implementazione di un tracking match-up
Gli altri metodi sono già di difficile implementazione quando l’oggetto desiderato si trova direttamente in primo piano, ma se questi è addirittura presente in secondo piano e senza la possibilità
di essere tracciato mediante la ricerca del colore o il riconoscimento della sua ombra, tutti questi
algoritmi si rilevano totalmente inutili all’esigenza progettuale.
Non avendo l’opportunità di utilizzare i classici metodi di “tracking” e “detection” delle OpenCV, si è preferito provare con gli infrarossi.
Di seguito sono descritti i risultati ottenuti dal testing del progetto, mediante l’utilizzo degli
infrarossi (IR).
Testing del progetto mediante IR
Per poter utilizzare gli IR la struttura risulta essere stata modificata rispetto a quella utilizzata
nei precedenti test. Si è infatti dovuto trovare un modo per sistemare i due faretti IR collocandoli
vicino al pannello e in posizioni adeguate allo scopo di coprire tutti e 5 i pulsanti che sono presenti
sull’interfaccia utente.
FIGURA 4.5
Studio e implementazione di un tracking match-up
| 77
In Figura 4.5 si può notare la nuova struttura nella quale i due faretti sono stati fissati, uno sotto
il pannello per coprire i 3 pulsanti presenti sul basso e quello in alto a destra e l’altro a lato in modo
da coprire il pulsante in alto a sinistra e di riuscire anche a coprire quello in alto a destra.
Si deve inoltre ricordare che a causa della pellicola fotografica posizionata davanti all’occhio
della webcam, quest’ultima ha ridotto la sua risoluzione in quanto le risulta difficile riuscire a visualizzare dei particolari, quali un colore molto tenue e leggero che prima riusciva a vedere e a tracciare,
senza incorrere in alcun tipo di problema.
Nella tabella 1 riportata di seguito sono raffigurati gli esisti dei test effettuati. In questi test sono
stati utilizzati due oggetti diversi, la mano di un soggetto e un oggetto di metallo in grado di riflettere
gli IR verso la webcam e di renderli visibili al suo occhio.
Questo per confrontare i test effettuati tra i due oggetti e riscontrare i possibili problemi del
sistema.
La tabella riporta le modifiche apportate alla struttura in Figura 4.5, l’oggetto utilizzato per il
test, i pulsanti trovati e le azioni eseguite (X significa non trovato, V trovato), infine il risultato complessivo del test.
78 | Studio e implementazione di un tracking match-up
MODIFICA APPORTATE
ALLA STRUTTURA
Angolazione Faretto:
spostato verso l'utente
Differenza di immagine
Tolta la differenza di
immagine
Abbassato il filtro a 50
cvThreshold
Alzato il filtro a 55
cvThreshold
Alzato il filtro a 60
cvThreshold
Alzato il filtro a 65
Angolazione faretto:
spostato verso il pannello
Angolazione faretto
Faretto che segue l'oggetto
distante 10 cm dalla mano.
OGGETTO
NEXT
BACK
SOPRA
SOTTO
INFO
RISULTATO
Mano
X
X
X
X
X
Fallito
Metallo
V
V
V
V
V
Passato
Mano
X
X
X
X
X
Fallito
Metallo
V
V
V
V
V
Passato
Mano
X
X
X
X
X
Fallito
Metallo
X
X
V
V
V
Fallito: vede
sempre un Next
inesistente
Metallo
V
V
V
V
V
Passato
Mano
X
X
X
X
X
Fallito
Mano
X
X
X
X
X
Fallito: vede
piccolissimi
riflessi dell'IR
Metallo
V
V
V
V
V
Passato
Mano
X
X
X
X
X
Fallito: problemi
con il bottone
sotto e sopra
Metallo
V
V
X
X
V
Fallito
Mano
X
X
X
X
X
Fallito: vede
bottoni a caso
Metallo
X
X
X
X
X
Fallito: vede
bottoni a caso
Mano
X
X
V
V
V
Fallito
Metallo
V
V
V
V
V
Passato
Mano
X
X
V
V
V
Fallito: non vede
due bottoni
Metallo
V
V
V
V
V
Passato
Mano
X
X
X
X
X
Fallito
Metallo
V
V
V
V
V
Passato
Mano
V
V
V
V
V
Passato
Metallo
V
V
V
V
V
Passato
TABELLA 1
Studio e implementazione di un tracking match-up
| 79
Come si nota dalla Tabella 1, i primi tre test effettuati sono stati eseguiti senza modificare nulla
all’interno della sua struttura (per il codice si veda l’Appendice “C”).
Si può notare che la webcam non è in grado di trovare la mano irradiata dagli infrarossi, mentre
un oggetto di metallo riesce a vederlo senza alcun problema, eseguendo così l’azione scelta dall’utente. In questo caso si è rilevato il problema del faretto in basso e quello a lato i quali non riescono a
coprire tutti e 5 i pulsanti.
Infatti, il faretto in basso copre solo i due pulsante sopra lo stesso, mentre quello a lato copre
solo quello vicino a se. Restano così scoperti due pulsanti, quello in basso a sinistra e quello in alto
a destra.
E’ stato comunque difficile riuscire a far trovare alla webcam l’oggetto metallico, in quanto
bisogna collocare l’oggetto con un’angolazione favorevole ed in modo da mandare gli IR verso la
webcam.
Si è, quindi, deciso di modificare l’angolazione del faretto in basso, con lo scopo di far irradiare
meglio il pannello e lo si è leggermente spostato verso il pannello stesso.
Nonostante la modifica apportata alla struttura, la mano non riesce a riflettere gli IR.
Nemmeno con le modifiche successive, cioè riprovare con la differenza d’immagine oppure
abbassare il filtro di eliminazione dei colori scuri, si è riesciti a far rilevare al sistema la mano all’interno dell’immagine.
D’altra parte l’oggetto metallico è trovato sempre all’interno dell’immagine e il sistema esegue
sempre le azioni richieste.
I test effettuati evidenziano che un oggetto in grado di riflettere IR è visto immediatamente dalla
webcam, mentre la mano a causa della potenza e della posizione dei faretti utilizzati non riesce a farsi
trovare all’interno dell’immagine stessa.
Si aggiunge inoltre che i due faretti non hanno un raggio di azione molto ampio nè un angolo
adeguato all’esigenza, in quanto sembra che l’angolo di azione di questi faretti non superi i 25°.
Anche la webcam utilizzata ha dei limiti, meglio impiegarne una con maggiore risoluzione o
80 | Studio e implementazione di un tracking match-up
usare una telecamera in grado di vedere IR, così come avere a disposizione 4 faretti, ognuno sulle
coordinate di un pulsante.
A questo punti si evidenzia che nell’ultimo test effettuato, il faretto situato sotto il pannello lo si
è utilizzato in mobilità, cioè questo rimane a poca distanza dalla mano, a circa 10 cm.
In questo caso la webcam riesce a trovare la mano e il sistema esegue esattamente le azioni
scelte dall’utente.
Questo test sopra descritto ha dato esito positivo, in quanto il faretto era posto ad una distanza
accettabile per irraggiare la mano che è così risultata idonea per riflettere IR.
Quindi, si può affermare che il problema responsabile del fallimento dei test precedenti è stata
la distanza dei faretti dalla mano o dall’oggetto da trovare.
FIGURA 4.6
Controllando le immagini ricevute dalla webcam, un oggetto di metallo si vede come un fascio
di colore molto chiaro, simile al bianco azzurrato, mentre la mano si vede poco e con un colore troppo
simile al nero. Per questi motivi durante la fase di filtraggio del colore, il sistemo scambia quest’ultimo per il colore nero, cioè come se all’interno dell’immagine quella parte di oggetto non esistesse,
ed esso viene completamente ignorato.
Nella Figura 4.6 si vede che la mano è leggermente accentuata e quando l’immagine è trasformata in una in scala di grigio, questo colore risulta simile al nero pur essendo quasi impercettibile, ed
è effettivamente trasformato in nero.
Studio e implementazione di un tracking match-up
| 81
Il sistema, una volta avviato, presenta l’interfaccia utente sul pannello in plexiglass, i faretti
avviati ed il software pronto al tracciamento della mano dell’utente.
FIGURA 4.7
La Figura 4.7 evidenzia il funzionamento del sistema e la parte utilizzata dall’utente.
L’utente alla fine deve vedere soltanto la parte dell’interfaccia, cioè quella parte di programma
con cui interagire.
Il progetto prevede di chiudere tutto il resto all’interno di una struttura e lasciare solamente il
pannello visibile.
Il problema riscontrato in questa fase è la distanza del faretto dall’oggetto utilizzato, perché
l’ultimo test ha dimostrato che se il faretto è abbastanza potente da coprire tutto il pannello, la webcam non ha alcun tipo di difficoltà a trovarlo.
Per risolvere il suddetto problema, legato alla difficoltà della webcam nel tracciamento della
mano, ci sono varie soluzioni e tutte collegate all’avvicinamento dei sistemi IR in modo da coprire
tutto il pannello.
82 | Studio e implementazione di un tracking match-up
SOLUZIONE 1
Il pannello visualizza un’interfaccia con 5 pulsanti, ognuno di questi posizionato in un determinato punto.
FIGURA 4.8
La Figura 4.8 rappresenta il piano cartesiano dei pulsanti e le possibili coordinate su cui inserire
dei faretti in grado di rendere visibili gli oggetti o le mani e quindi eseguire le azioni desiderate.
In questa soluzione si prevede semplicemente di aumentare il numero di faretti da due a cinque
e di posizionarli in modo da coprire l’intera area dei pulsanti.
Studio e implementazione di un tracking match-up
| 83
SOLUZIONE 2
I pulsanti hanno determinate coordinate da coprire e conseguentemente, posizionando dei led
sulle coordinate dei pulsanti è possibile tracciare l’oggetto desiderato, come nelle applicazioni di
Johnny Lee [7] oppure irradiare il pannello di IR.
FIGURA 4.9
In questo modo, se la mano dell’utente tocca il pulsante desiderato, gli IR dei led sono deformati e la webcam riesce a rilevare l’oggetto e ad eseguire l’azione desiderata.
84 | Studio e implementazione di un tracking match-up
Conclusioni
I procedimenti di “tracking” analizzati in questo elaborato, non sono stati utilizzati per la presenza di rumori e distorsioni dei colori all’interno dell’immagine catturata dalla webcam e a causa
della retro-proiezione alcuni di questi non sono impiegabili.La “differenza di immagine” esegue la
differenza tra due immagini ma, se la parte di immagine che dovrebbe non influire poichè al suo interno non è presente l’oggetto desiderato, la funzione ne segnala l’esistenza a causa dei cambiamenti
di luce.
La “segmentazione”, come detto in precedenza, ha bisogno di immagini nitide e di un contrasto
quasi perfetto per la visualizzazione corretta dei colori. Tentare di cercare il colore della mano non
ha portato a risultati positivi, anche perché la ricerca dei colori necessari è troppo generica e questi
possono essere confusi con altri. D’altra parte la “segmentazione” deve riscontrare l’oggetto in primo
piano rispetto ad uno sfondo che può essere di qualunque tonalità.
Il classificatore in cascata di Haar non può essere utilizzato in quanto cerca la mano, la cui
forma non è definita in modo da poterla trovare. Perciò, anche creando dei campioni positivi e dei
campioni negativi, la probabilità di successo di questo procedimento è quasi nulla, perché come per la
“segmentazione”, questi ha bisogno dell’oggetto in primo piano in quanto realizzare dei campioni di
un oggetto in secondo piano non è possibile. Infatti, non si basa più sul confronto tra forma e colore
ma di un confronto con una semplice forma. Basandosi solo sulla forma si può incorrere in un errore
di scambio di oggetti, cioè un oggetto è riconosciuto come se fosse un altro.
Il tracking” può giungere a miglioramento utilizzando semplicemente gli infrarossi, cioè una
fonte di calore in grado d’illuminare un determinato tipo di oggetto dotato di un calore proprio.
Questo può essere implementato con dei faretti IR oppure con un determinato numero di led.
Come si è potuto constatare se i faretti non sono in grado di coprire una determinata area e sono
in un numero tale da non riuscire neppure a racchiudere una piccola area del piano, l’oggetto o la
mano non possono essere tracciati.
Studio e implementazione di un tracking match-up
| 87
Le soluzioni a cui si è pervenuti per questo problema sono le seguenti:
1 |
l’applicazione di un numero maggiore di faretti in modo da coprire l’intera area del pannello;
2 |
l’applicazione dei led sulla superficie in modo da coprire le coordinate dei pulsanti oppure irradiare il pannello di infrarossi.
In entrambe le soluzioni il sistema è in grado di eseguire correttamente le azioni richieste
dall’utente, in quanto in grado di trovare la mano dell’utente, ma soprattutto la webcam è in grado
di vederla. A questo punto è possibile affermare quanto predetto significando che questo ultimo test
effettuato con il faretto che segue la mano, ha dimostrato che se i faretti o i led sono vicini all’oggetto
utilizzato per toccare i pulsanti, il sistema riesce a trovarlo.
Si è potuto, quindi riscontrare che per il tipo di architettura e di struttura esterna non è stato possibile eseguire un vero e proprio “tracking” utilizzando le classiche metodologie delle OpenCV che tutti i
programmi esistenti implementano. Questo problema è stato comunque risolto utilizzando un’implementazione non molto legata all’analisi dell’immagine in base ai colori o forme, cioè utilizzo degli infrarossi.
E’ comunque presente un problema, si deve pensare al filtro che poteva rendere visibili solamente gli IR. Senza andare a fondo nell’analisi del problema, in quanto il risultato sarebbe stato che
si doveva analizzare l’immagine e cercare di trovare gli IR o gli oggetti illuminati dagli stessi. Si è
semplicemente pensato di applicare alla webcam una pellicola fotografica quale filtro.
In questo modo la webcam non riesce a vedere niente altro che la luce infrarossa emessa dai
faretti e, quindi, non si pone il problema di analisi dell’immagine in base al colore o altro.
Solo per togliere determinati rumori che possono creare dei problemi a livello di filtro delle
piccole parti di riflesso degli IR, si è pensato di applicare la funzione di filtraggio dei colori delle
OpenCV, che permette di eliminare i colori troppo scuri.
Questo progetto può essere ripreso per una futura implementazione di sistemi multimediali utilizzabili in ambito commerciale con ampio spettro merceologico. Potrebbe anche servire come base
per una futura implementazione di un “catalogo multimediale” utilizzabile da un numero maggiore di
persone, anche per il basso costo di acquisto dei materiali.
88 | Studio e implementazione di un tracking match-up
Bibliografia
[1] Using OpenCV on the Beagleboard to track an Aibo pink ball
http://mechomaniac.com/node/72
[2] Dasher: Foot or Hand Mouse
http://www.inference.phy.cam.ac.uk/dasher/SpecialNeeds.html
[3] HandVu: vision-based hand gesture interface
http://www.movesinstitute.org/~kolsch/HandVu/doc/InstallationWindows.html
[4] Hand Detection
http://longbin.org/handDetection.aspx
[5] Finger Mouse
http://sites.google.com/site/tarandeep/fingermouse
[6] Face Detection
http://vasc.ri.cmu.edu/NNFaceDetector/
[7] Johnny Chung Lee (using WiiMote)
http://johnnylee.net/
[8] Head Mouse
http://nipg.inf.elte.hu/headmouse/headmouse.html
[9] Progetto di Motion Tracking: Detection Of Objects Movement
http://blog.soulwire.co.uk/code/actionscript-3/webcam-motion-detection-tracking
[10] Lumen Digital (interactive experiences)
http://www.lumendigital.co.nz
[11] http://blog.damiles.com/
[12] Hough Transformation for Circle Detection
http://www.mathworks.com/matlabcentral/fileexchange/9833
[13] Webcam Signature
http://webcamsignature.wikidot.com/
[14] Wikipedia
http://en.wikipedia.org/wiki/Wiki
[15] Trasformare la webcam in una IR webcam
http://mondoemule.blogspot.com/2009/04/trasformare-lar-webcam-in-una-webcam.html
Studio e implementazione di un tracking match-up
| 89
[16] Visual Studio 2005
http://msdn.microsoft.com/it-it/library/ms269115(VS.80).aspx
[17] Learning OpenCV – Computer Vision with OpenCV Library by Gary Bradski, Adrian Kaehler, O’Reilly Media, 2008
[18] COLOR SEGMENTATION BY ORDERED MERGINGS by Jesùs Angulo, Jean Serra
[19] Forum RoboItalia
http://forum.roboitalia.com/index.php
[20] Forum Stackoverflow
http://stackoverflow.com/
[21] Forum Bernardotti
http://www.bernardotti.it/portal/forumdisplay.php?f=7
[22] OpenCV Wiki
http://opencv.willowgarage.com/wiki/
[23] OpenCV 1.0 Api
http://www.cs.indiana.edu/cgi-pub/oleykin/website/OpenCVHelp/
[24] OpenGL Tutorial
http://nehe.gamedev.net/
[25] OpenGL video tutorial
http://www.videotutorialsrock.com/
[26] GLUT Tutorial
http://www.lighthouse3d.com/opengl/glut/index.php?1
[27] FACE DETECTION TECHNIQUES BASED ON K-MEANS CLUSTERING AND FILTERING – Roberto Aloi
http://prof3ta.netsons.org/repo/facedetection.pdf
[28] REAL-TIME HAND-TRACKING WITH COLOR GLOVE – Robert Y. Wang, Jovan Popović
– ACM SIGGRAPH 2009
http://people.csail.mit.edu/rywang/handtracking/
[29] A ROBUST METHOD FOR HAND TRACKING USING MEAN-SHIFT ALGORITHM
AND KALMAN FILTER IN STEREO COLOR IMAGE SEQUENCES – Mahmoud Elmezain, Ayoub Al-Hamadi, Robert Niese, Bernd Michaelis – 2009
http://www.waset.org/journals/waset/v59/v59-52.pdf
[30] MT Mini MultiTouch
http://sethsandler.com/multitouch/mtmini/
90 | Studio e implementazione di un tracking match-up
Appendice
Studio e implementazione di un tracking match-up
| 91
Appendice “A”
Installazione della libreria OpenCV
su Visual Studio 2005.
Per utilizzare la libreria OpenCV bisogna installarla su Windows, scaricando la versione 1.0,
facendo in modo che il programma Visual Studio 2005 (VS2005) riesca ad accedervi per poterla utilizzare.
Con i seguenti passi l'installazione non ha dato alcun tipo di errore:
1 |
Installare Windows Platform SDK, in questo caso Visual Studio 2005 deve essere già stato installato sulla macchina.
2 |
Aggiornare Visual Studio 2005 scaricando la versione chiamata “C++ 2005 Express Edition
SP1 - VS80sp1-KB926748-X86-INTL.exe “.
3 |
Scaricare la libreria OpenCV 1.0 per Windows e installarla.
4 |
Sistemare la directory per OpenCV in VS2005:
5 |
a |
Scegliere dal menu "Tools" e selezionare "Opzioni";
b |
In “Progetti e Soluzioni” andare in "VC++ Directories";
c |
Mostrare la directory "Library Files";
d |
Aggiungere "C:\Program Files\OpenCV\lib" alla lista;
Aggiungere in “Include Files” C:\Program Files\Microsoft Platform SDK for Windows Server
2003 R2\Include\mfc;
6 |
Ora scegliere dal menu "Build" e selezionare "Build Solution". Questo procedimento può impiegare dai dieci minuti ad un'ora.
Studio e implementazione di un tracking match-up
| 93
Giunti a questo punto tutto il necessario risulta essere installato e funzionante in modo corretto.
Per creare un'applicazione OpenCV, bisogna però includere alcune librerie dinamiche e qualche
cartella in più.
Per realizzare un progetto che utilizzi le openCV bisogna scegliere un progetto di tipo Applicazione Console Win32. Fatta questa premessa bisogna selezionare con il tasto destro il nome del
progetto e scegliere “Proprietà”. Selezionare la cartella C/C++ andare in “Generale” e aggiungere le
seguenti directory con tutto il percorso:
..\..\cvaux\include\
..\..\cxcore\include\
..\..\cv\include\
..\..\otherlibs\highgui\
..\..\otherlibs\cvcam\include\
In conseguenza delle azioni di cui sopra si dovrà scegliere la cartella “Linker” e selezionare la
cartella “Dipendenze Aggiuntive” nella quale aggiungere i seguenti .lib con tutto il percoso:
“..\..\lib\cv.lib“
“..\..\lib\cvaux.lib“
“..\..\lib\cxcore.lib“
“..\..\lib\cvcam.lib“
“..\..\lib\highgui.lib"
A questo punto si può cominciare ad utilizzare le OpenCV senza ricevere alcun errore.
94 | Studio e implementazione di un tracking match-up
Appendice “B”
Installazione del toolkit GLUT
su Visual Studio 2005.
Installare OpenGL e GLUT su di un sistema Windows è abbastanza semplice. Per poter utilizzare GLUT in VS2005 bisogna eseguire i seguenti passi per la sua installazione:
1 |
Scaricare GLUT.
2 |
Collocare il file “glut32.dll” nella cartella “C:\WINDOWS\system32”.
3 |
Collocare il file “glut.h” nella cartella “C:\Program Files\Microsoft VisualStudio.NET\Vc7\
PlatformSDK\Include\gl”.
4 |
Collocare il file “glut32.lib” nella cartella “C:\Program Files\Microsoft Visual Studio.NET\
Vc7\PlatformSDK\lib”.
5 |
Linkare GLUT nel progetto: Scegliere menu “Progetto” andare in “Proprietà”, scegliere “Linker”
poi “Input” e aggiungere sotto “Dipendenze Aggiuntive”: glut32.lib, glu32.lib, opengl32.lib.
6 |
Aggiungere al progetto la libreria glut.h con il comando “include”.
Studio e implementazione di un tracking match-up
| 95
Appendice “C”
Il Progetto a livello di codice
“Finger tracking”
Nel codice sono presenti 5 funzioni:
1 |
double angle( CvPoint* pt1, CvPoint* pt2, CvPoint* pt0 ) che calcolano il coseno dell’angolo tra i vettori pt0 → pt1 e pt0 → pt2;
2 |
CvSeq* findSquares4( IplImage* img, CvMemStorage* storage ) che presa in input un’immagine e una cella di memoria dinamica ne trova i rettangoli presenti nella figura;
3 |
void drawSquares( IplImage* img, CvSeq* squares ) disegna i rettangoli trovati con la funzione precedente;
4 |
int xQuadrato(int x) calcola il quadrato di x;
5 |
CvSeq* findFingers(IplImage* frame, IplImage* bg, CvSeq* point_square) trova le dita
dell’utente all’interno dei rettangoli trovati con la funzione findSquares4().
FIGURA 1
Studio e implementazione di un tracking match-up
| 97
Si possono notare le librerie incluse e le variabili globali che servono a più funzioni.
Int thresh viene utilizzata dalla funzione findSquares4() per eseguire un filtro Canny, ovvero per evidenziare i contorni di alcune forme che rispecchiano i parametri inseriti. CvMemStorage* storage è
la memoria dinamica, che viene utilizzata da più funzioni presenti. Le due variabili const char*sono
i nomi che verranno poi usati per far apparire delle finestra di testing. L’array di interi è l’array nel
quale verranno salvate le coordinate dei vertici dei 5 rettangoli. Si ritiene di dover evidenziare che le
funzioni angle(), findSquares4()e drawSquares() sono state prese dall’esempio “squares” presente
nella cartella di OpenCV. CvSeq* findFingers(IplImage* frame, IplImage* bg, CvSeq* point_
square). funzione prende in input il frame, ovvero l’immagine attuale, il background, l’immagine
salvata precedentemente, e la struttura CvSeq*nel quale sono salvati i vertici dei 5 rettangoli trovati
dalla funzione findSquares4().
FIGURA 2
All’inizio sono inizializzate le variabili e le strutture che saranno utilizzate in seguito: CvSeqReader è una struttura che serve per leggere i dati dalla CvSeq*; CvPoint serve per le coordinate
dei vertici; CvScalar serve per i valori dei pixel; 3 immagini per i filtri; CvSeq* pointsFingers è la
struttura ritornata dalla funzione che conterrà le coordinate delle dita dell’utente trovate all’interno di
uno dei 5 rettangoli.
98 | Studio e implementazione di un tracking match-up
FIGURA 3
In questo caso se la struttura CvSeq* point_squar econtiene i dati, si dà inizio alla lettura
dei primi 4 vertici (un rettangolo) tramite il comando CV_READ_SEQ_ELEM e ad inserirli all’interno del CvPoint. In seguito dopo aver controllato il rettangolo attuale, si passa al successivo.
FIGURA 4
Studio e implementazione di un tracking match-up
| 99
Il punto pt0 è quello che si trova in basso a sinistra, in quanto la funzione findSquares4() salva i
vertici dei rettangoli in modo che pt0, sia il vertice in basso a sinistra; pt1, sia il vertice in alto a sinistra;
pt2, sia il vertice in alto a destra; pt3, sia il vertice in basso a destra.Si può notare che si entra in questa
parte della funzione solamente se il rettangolo catturato non è lo schermo intero. Si deve segnalare che
certe volte la funzione findSquares4() salva le coordinate di un rettangolo grande quanto tutta l’immagine, perché a causa dei colori o della luce legge un rettangolo unico.
Se il rettangolo non è l’immagine intera è assegnato il ROI, in altre parole la regione d’interesse, cioè una porzione d’immagine, che in questo caso è l’intera area del rettangolo trovato prima.
Di seguito sono inizializzate altre 3 immagini, che servono per i filtri successivi. L’inizializzazione delle immagini avviene dopo aver messo il ROI sia al frame sia al background, perché così le 3
immagini prendono la dimensione ROI del frame o del background e, quindi, finché il ROI non è tolto
le 3 immagini, il frame e il background hanno la stessa dimensione e, quindi, le funzioni successive
non danno errori.
Successivamente il frame e il background con la chiamata alla funzione cvCvtColor() e con
il tipo uguale a CV_BGR2GRAY, diventano due immagini in scala di grigi salvate, rispettivamente,
nelle immagini greye grey_bg. Mentre l’ultima funzione la cvSub(), esegue la differenza tra il frame
e il background, salvandola in diff.
L’immagine diff è salvata la differenza tra frame e background, se questa esiste, il valore dei
pixel è diverso da zero, cioè il colore del pixel non è nero. L’immagine è trattata come una matrice
con 240 righe e 320 colonne (i due numeri dipendono dalla risoluzione della webcam).
FIGURA 5
100 | Studio e implementazione di un tracking match-up
Per controllare il valore di una cella, bisogna eseguire due cicli for. La variabile CvScalar
pixels serve per salvare il valore della cella o del pixel in posizione (i,j). Per recuperare tale valore è
chiamata la funzione CvScalar cvGet2D(IplImage*, int, int) che ritorna il valore del pixel in posizione (int,int) dell’immage IplImage*. Si controlla poi il valore all’interno di pixels.val[0], perché
essendo le due immagini in scala di grigi, se il valore di luminosità è diverso da zero, allora c’è la
differenza d’immagine e quindi salva le coordinate del pixel all’interno della struttura CvSeq* pontsFinger, che è l’output della funzione.
FIGURA 6
Alla fine si rilascia il ROI, così le due immagini tornano alle loro dimensioni normali. In questo caso è rilasciata anche la memoria legata alle immagini usate per i filtri in scala di grigi e per la
differenza.
È ritornata la struttura in cui sono state salvate le coordinate della differenza.
Il main
FIGURA 7
Studio e implementazione di un tracking match-up
| 101
Per prima cosa si devono inizializzare le varie strutture, tra cui quella che permette la cattura dell’immagine dalla webcam.
FIGURA 8
Si cattura successivamente l’immagine attuale e poi la si salva all’interno della struttura IplImage frame. Si cattura il background e si controlla se questi è stato salvato.
FIGURA 9
Si esegue una prima ricerca dei rettangoli e salva i loro vertici all’interno della strutturaCvSeq* points.
All’interno del ciclo “for” viene salvata in continuazione l’immagine attuale. Se sono stati trovati
dei rettangoli viene chiamata la funzione per trovare le dita dell’utente, altrimenti vengono cercati i
rettangoli. Poi vengono disegnati.
102 | Studio e implementazione di un tracking match-up
FIGURA 10
Una volta trovati i punti della differenza ed averli salvati all’interno della struttura CvSeq* points_finger, tramite CV_READ_SEQ_ELEMvengono salvati all’interno di una struttura CvPoint* e
stampati a video.
FIGURA 11
Alla fine sono rilasciate tutte le strutture utilizzate: la struttura per l’utilizzo della webcam, le
finestre per eseguire i testing e la memoria dinamica.
Studio e implementazione di un tracking match-up
| 103
Interfaccia utente
FIGURA 12
Le variabili globali vengono utilizzate per l’animazione del rettangolo blu in alto a destra.
FIGURA 13
104 | Studio e implementazione di un tracking match-up
La funzione resize() serve per ridimensionare con la prospettiva corretta la finestra, quando
questa viene ridimensionata manualmente dall’utente.
FIGURA 14
Studio e implementazione di un tracking match-up
| 105
In questo modo è creata una finestra con un determinato colore di background.
La finestra è settata per avere la profondità, l’animazione e i colori in formato RGBA.
Il vertice in alto a sinistra della finestra sarà posto nel punto con coordinate (0,0), la dimensione
sarà 1400x830 e il nome visualizzato sarà “Catalogo Interattivo”.
La funzione glutDisplayFunc() che richiama draw() è la funzione di inserimento dei componenti,
mentre glutIdleFunc() che richiama animation() è la funzione che sistema l’animazione dell’oggetto.
In seguito è inserita la funzione di ridimensionamento e infine è chiamata la funzione glutMainLoop() che continuerà a mostrare la finestra finché l’utente non la chiuderà.
FIGURA 15
Una volta caricata l’immagine in una struttura dati, che in questo caso si chiama Image*, si
eseguono alcune funzioni di OpenGL per riconoscere tale immagine come texture. Per prima cosa si
inizializza l’iddella texture (textureId), ovvero quel valore GLuint che permetterà di riconoscere la
texture in modo univoco.
Con la funzione glGenTextures all’id assegnato un valore. In seguito con la funzione glBindTextures’identifica la texture che si vuole modificare.
106 | Studio e implementazione di un tracking match-up
Sono sistemati i parametri della texture e i valori passati servono per:
1 |
GL_TEXTURE_MIN_FILTER (texture minifying) viene utilizzata quando si possono usare
più texture per una superficie;
2 |
GL_TEXTURE_MAG_FILTER (texture magnification) viene usata quando i pixel da mettere
in un’area sono minori o uguali a un elemento della texture;
3 |
GL_LINEAR è una media ponderata dei quattro elementi della texture che sono più vicini al
centro del pixel.
Successivamente con glTexImage2D si inserisce l’immagine nella texture.
FIGURA 16
Di conseguenza, per inserire la texture all’interno di un rettangolo si deve prima di tutto richiamare la texture che si vuole utilizzare (glBindTexture), inserire poi le coordinate della texture che in
questo caso si trovano in un piano bidimensionale (glTexCoord2f) e inserire dopo le coordinate dei
vertici del rettangolo (glVertex3f).
Questa parte è stata eseguita per ogni componente presente nella finestra.
Studio e implementazione di un tracking match-up
| 107
Integrazione
L’integrazione delle OpenGL con le OpenCV prevede l’utilizzo del ciclo di creazione della
finestra per la cattura dell’immagine attuale. Il codice non ha subito modifiche significative, vi è comunque una struttura differente rispetto a prima.
Il progetto è stato diviso in 5 classi:
1 |
webcam.h,
2 |
webcam.cpp,
3 |
interfaceUsers.h,
4 |
interfaceUsers.cpp,
5 |
main.cpp.
WEBCAM.H
FIGURA 17
Nell’header file webcam.h, mostrato in Figura 17, sono definite le funzioni che sono chiamate
dopo dal main e utilizzate nell’animazione delle OpenGL. La funzione cv_init()inizializza tutte le
variabili globali, main_webcam() eseguirà la cattura e l’analisi dell’immagine, cv_release() libererà
la memoria una volta terminato il programma.
108 | Studio e implementazione di un tracking match-up
WEBCAM.CPP
FIGURA 18
Per prima cosa vengono inizializzate le variabili globali. Come si può notare dal codice (Figura
18), le coordinate dei vertici dei rettangoli non sono più trovate tramite una funzione, ma sono statiche perché si è cercato di evitare che trovasse rettangoli inesistenti, come si è dimostrato nel testing
eseguito prima, la funzione su 3-4 rettangoli presenti riusciva anche a trovarne 116, quindi, così facendo si occupava gran parte della memoria.
Le coordinate dei rettangoli dipendono dalla posizione della webcam e, pertanto, se questa è
spostata devono essere modificate.
Sono stati aggiunti una serie di variabili intere, che sono spiegate in seguito.
Studio e implementazione di un tracking match-up
| 109
FIGURA 19
La funzione cv_init() è quella che si occupa dell’inizializzazione delle strutture utilizzate per la
cattura dell’immagine e della memoria in cui saranno salvati i vari dati. Si aggiunge che sono state inserite due funzioni di supporto, le funzioni calculateHeight() e calculateWidth(), che come indicato
dal loro nome servono solamente per calcolare l’altezza e la lunghezza del rettangolo.
FIGURA 20
La funzione cv_release()libera la struttura di CvCapture* e la memoria dinamica.
110 | Studio e implementazione di un tracking match-up
FIGURA 21
La funzione findFingers() richiama le funzioni che calcolano la lunghezza e la larghezza tra i
punti dati, settare il ROI perché serve ad analizzare solo una parte dell’immagine, cioè quella parte
del piano bidimensionale dove si trovano i pulsanti.
FIGURA 22
Studio e implementazione di un tracking match-up
| 111
Una volta inserito il ROI sono inizializzate le immagini che servono per i filtri. Dopo è eseguita
la differenza d’immagine con la funzione cvSube la differenza salvata nella struttura IplImage* diff
è trasformata in un’immagine in scala di grigi (CV_BGR2GRAY).
Infine, sono mostrati i contorni dell’immagine presente in diff tramite il filtro di Canny.
Se nell’immagine è trovato almeno un contorno, ritorna 1, perché significa che l’utente ha toccato quel pulsante, altrimenti ritorna 0. Figura 23: filtri per togliere la luce presente.
FIGURA 23
Nella Figura 23 si nota che dopo aver riscontrato i problemi con la differenza di immagine a
causa della luce e di altri fattori simili, si è provato ad utilizzare l’altra funzione OpenCV per effettuare la differenza mediante modulo delle due immagini.
FIGURA 24
Nella figura 24 è stata tolta la differenza di immagini per utilizzare gli IR.
112 | Studio e implementazione di un tracking match-up
FIGURA 25
Ed ecco la funzione principale di webcam.cpp: int main_webcam(). Qui è’ incrementato un
contatore e l’immagine è catturata solo se questa è pari a 90, perché per non appesantire il programma, si è deciso di non catturare continuamente l’immagine. Quando il contatore fr è pari a 90, ciò
vuole dire che è catturata l’immagine attuale. Se è la quinta volta che entra in questa condizione,
alcuni contatori sono inizializzati a zero.
FIGURA 26
Studio e implementazione di un tracking match-up
| 113
Qualora l’immagine attuale è stata inizializzata correttamente e qualora la variabile booleana
è pari a “false”, allora è copiata l’immagine attuale e utilizzata come background. Quest’operazione
è eseguita una sola volta perché dopo la clonazione, la variabile booleana è eguagliata a “true”e non
verrà più modificata.
Per ogni pulsante è chiamata la funzione findFingers() e se è presente una differenza d’immagine quelle variabili intere diventeranno pari a 1, altrimenti 0.
FIGURA 26 b
114 | Studio e implementazione di un tracking match-up
Per ogni pulsante il valore di ritorno è diverso e solo uno di questi pulsanti può contenere la differenza
di immagine, perché altrimenti sarebbe come se l’utente avesse toccato due pulsanti contemporaneamente.
Inoltre ci sono dei contatori che a seconda dell’azione scelta, uno di loro viene posto pari a 1 oppure
tutti pari a zero. Questi contatori servono per evitare che venga vista un’azione se la mano dell’utente
rimane a lungo su un pulsante. In questo modo, l’utente prima di rieseguire la stessa azione, deve
togliere la mano e poi rimetterla sul pulsante.
Interfaceusers.H
FIGURA 27
Le funzioni descritte nell’header file sono poi richiamate nel main del sistema. La funzione readFromFile legge da un file di testo, mentre la funzione dividiBuffer prende la stringa letta dal file e
la suddivide in tante sottostringhe. La funzione init_wind() inizializza la finestra.
Studio e implementazione di un tracking match-up
| 115
Interfaceusers.CPP
FIGURA 28
Per prima cosa analizziamo le variabili globali presenti nel file. Nelle variabili globali sono
presenti: una variabile di tipo intero, che serve per recuperare il valore di ritorno della funzione
OpenCV; GLuint arrayper il texture mapping; char arrayper recuperare il percorso delle immagini
da usare come texture e per la lettura da file; una serie di variabili booleane e intere per l’animazione
della finestra.
Una volta recuperata la stringa dal file di testo, la funzione in Figura 29 permette di stamparla
sulla finestra alle coordinate desiderate.
116 | Studio e implementazione di un tracking match-up
FIGURA 30
La funzione init() è uguale alla funzione main() della parte di creazione dell’interfaccia utente.
L’unica differenza è il caricamento delle immagini da usare come texture. La struttura dati di salvataggio dell’immagine dipende dalla libreria utilizzata.
FIGURA 31
Nella funzione animation() è chiamata alla funzione che avvia la cattura dell’immagine e la sua
analisi, per richiamare poi in seguito la draw().
Studio e implementazione di un tracking match-up
| 117
FIGURA 32
Lo switch, rappresentato nella figura sopra, all’interno della funzione draw() gestisce l’animazione della finestra. Le variabili globali di tipo booleano o intero vengono modificate in questo
codice. La variabile intera r_webcam eguagliata alla funzione OpenCV nell’animazione, a seconda
del valore che assunto, determina l’azione da seguire.
La variabile r_webcampuò assumere i seguenti valori:
0– se l’utente non ha eseguito alcuna azione;
1– se ha premuto il pulsante next: a questo punto devono essere incrementati i contatori it_sopra, se
il valore booleano sopra è true, e it_sotto, se il valore booleano sotto è true;
2– se ha premuto il pulsante back: a questo punto devono essere decrementati i contatori it_sopra,
se il valore booleano sopra è true, e it_sotto, se il valore booleano sotto è true;
118 | Studio e implementazione di un tracking match-up
3– se ha premuto il pulsante modifica sopra: sopra viene eguagliato a true e sotto a false;
4– se ha premuto il pulsante modifica sotto: sotto viene eguagliato a true e sopra a false;
5– se ha premuto il pulsante informazione prodotti: writeText viene eguagliato a true.
FIGURA 33
Le texture sono aggiunte in modo dinamico, perché i due contatori interi it_soprae it_sotto non sono altro che due indici per lo scorrimento dell’array in cui sono state salvate le texture.
Come si può notare, invece, la variabile booleana writeText, serve per scrivere delle informazioni relative ai prodotti visualizzati sul manichino al momento, quindi utilizza i due contatori.
Mentre in fondo si può notare un esempio generale del caricamento dei pulsanti sulla finestra, dove il
contatore i appartiene all’intervallo [0,4].
Studio e implementazione di un tracking match-up
| 119
Main.CPP
FIGURA 34
La funzione main() è composta da una serie di chiamate alle funzioni presenti negli header file
delle OpenCV e delle OpenGL. Analizzando la funzione si nota che prima è eseguita la lettura da file,
poi sono inizializzate le variabili delle OpenCV, e chiamata la funzione di creazione della finestra
OpenGL, quando la finestra sarà chiusa, è rilasciata la memoria utilizzata dalle OpenCV.
120 | Studio e implementazione di un tracking match-up
Appendice “D”
RGB e HSV color space
L’immagine è una composizione di valori dei colori rosso (Red), verde (Green) e blu (Blue),
quindi lo spazio dei colori delle immagini è detto RGB. Lo spazio RGB è un cubo ed è uno spazio
molto facile da utilizzare e da capire.
FIGURA 1: RGB color space
Esiste però anche lo spazio detto HSV, ovvero colore (Hue), saturazione (Saturation) e valore
(Value), ed è lo spazio delle percentuali dei colori, perché i valori di saturazione e valore sono delle
percentuali. Lo spazio HSV è una piramide.
FIGURA 2: HSV color space
HSV è uno spazio molto più pratico del RGB e si utilizza molto per controllare la somiglianza
e la similarità dei colori.
Studio e implementazione di un tracking match-up
| 121
Luglio 2010