università politecnica delle marche

Transcript

università politecnica delle marche
UNIVERSITÀ POLITECNICA DELLE MARCHE
FACOLTÀ DI INGEGNERIA
Corso di Laurea magistrale in Ingegneria Informatica
Studio e sviluppo di uno
scanner 3D con Kinect
Tesi di laurea di:
Relatore:
Luca Pignati
Prof. Aldo Franco Dragoni
Correlatore:
Ing. Gianluca Dolcini
Anno Accademico 2011-2012
1
2
“Todos los dias
sale el sol”
Bongo Botrako
3
4
Indice generale
INTRODUZIONE.......................................................................................9
LA SCANSIONE 3D.................................................................................11
IL
PROCESSO DI SCANSIONE........................................................................................11
La scansione 2D............................................................................................... 11
LA
SCANSIONE
3D.................................................................................................... 12
Funzionamento................................................................................................ 13
L'ATTUALE
STATO DELL'ARTE.......................................................................................13
A tempo di volo................................................................................................ 16
A luce strutturata............................................................................................. 17
IL KINECT ............................................................................................. 19
INTRODUZIONE
HARDWARE
AL DISPOSITIVO....................................................................................19
KINECT............................................................................................. 20
DEL
Descrizione Generale.......................................................................................20
Descrizione dei Componenti.............................................................................23
COME
FUNZIONA
...................................................................................................... 25
Il monitoraggio dei movimenti.........................................................................25
Il riconoscimento vocale...................................................................................27
Il motore direzionale........................................................................................28
IL
SENSORE DI PROFONDITÀ........................................................................................28
Depth from focus............................................................................................. 30
Depth from stereo............................................................................................ 31
SOFTWARE
DEL
KINECT..............................................................................................33
Le librerie ufficiali............................................................................................. 33
Le librerie non ufficiali......................................................................................34
LA
NOSTRA SCELTA................................................................................................... 36
GLI STRUMENTI UTILIZZATI....................................................................39
L'AMBIENTE............................................................................................................. 39
Ubuntu............................................................................................................. 39
Le Librerie OpenNI e NITE................................................................................41
Le librerie Java3D............................................................................................. 42
5
Eclipse.............................................................................................................. 42
PROCEDURE
DI INSTALLAZIONE....................................................................................43
Ubuntu............................................................................................................. 44
OpenNI............................................................................................................. 45
Driver Kinect.................................................................................................... 48
NITE................................................................................................................. 51
Java 3D............................................................................................................. 54
Eclipse.............................................................................................................. 54
IL PROGETTO........................................................................................55
OBIETTIVI
DEL PROGETTO...........................................................................................55
Introduzione..................................................................................................... 55
Sintesi del progetto.......................................................................................... 57
L'attuale stato dell'arte....................................................................................58
La nostra proposta........................................................................................... 59
PRESTAZIONI DEL KINECT......................................................................61
DESCRIZIONE
DELL'ESPERIMENTO.................................................................................61
I valori della mappa di profondità.....................................................................61
L'esperimento ................................................................................................. 63
PROVE
DI DISTANZA..................................................................................................64
Glossario delle tabelle......................................................................................65
La prima prova................................................................................................. 66
La seconda misurazione...................................................................................69
1m:................................................................................................................... 70
1,5 m:............................................................................................................... 73
2m:................................................................................................................... 74
Considerazioni sui primi test............................................................................77
PROVE
DI POSIZIONE................................................................................................. 78
Kinect inclinato................................................................................................. 78
Inquadratura ristretta.......................................................................................80
IMMAGINI
DI ERRORE.................................................................................................82
ULTIME PROVE,
BUSTO UMANO....................................................................................86
I primi risultati.................................................................................................. 86
Sperimentazione alternativa............................................................................88
Foto di differenza............................................................................................. 92
L'ultimo test..................................................................................................... 96
6
LO SCANNER 3D....................................................................................99
PREPARAZIONE
DI
ECLIPSE..........................................................................................99
INTRODUZIONE....................................................................................................... 103
Le azioni da eseguire.....................................................................................103
DESCRIZIONE
DEL SOFTWARE....................................................................................105
Il primo prototipo........................................................................................... 105
Il secondo prototipo.......................................................................................113
LO
SCANNER A
360
GRADI.......................................................................................116
Il principio di funzionamento..........................................................................117
Il programma................................................................................................. 117
Le prove di scansione.....................................................................................119
CONCLUSIONI.....................................................................................121
Considerazioni finali.......................................................................................121
Possibilità di sviluppo.....................................................................................122
BIBLIOGRAFIA.....................................................................................123
RINGRAZIAMENTI................................................................................125
7
8
Introduzione
Questa tesi di laurea è stata sviluppata sopra la progettazione di
uno scanner a tre dimensioni realizzato con il sensore chiamato
Kinect della Microsoft.
L'obiettivo di questo lavoro sarà l'analisi dettagliata di questo
sensore
per
capire
e
conoscere
le
sue
potenzialità
ed
eventualmente considerare la possibilità di integrarlo nello
sviluppo
di
applicazioni
software
da
utilizzare
in
ambito
biomedico. L'idea è quella di poter far passare questo strumento
da un ambiente puramente videoludico ad un ambiente medico
creando un software di scansione a tre dimensioni del corpo
umano in cui sia possibile misurare valori biometrici, e integrare
questi valori così ottenuti con le restanti informazione per
ottenere infine una mappatura del corpo del paziente. I settori di
interesse di uno strumento di questo tipo riguarderebbero, oltre
alla medicina generale, la medicina sportiva, la fisioterapia o
anche la medicina nutrizionale.
I primi capitoli serviranno a descrivere il Kinect a livello
hardware e software e a mostrarne le varie possibilità di
applicazione, in seguito verranno descritti gli strumenti utilizzati
per sviluppare le varie applicazioni utilizzate nel corso delle
sperimentazioni.
9
Di seguito verrà affrontata una fase di testing dello strumento.
Tramite un software, sviluppato per questa tesi, in Java è stato
possibile
effettuare
una
serie
di
misurazioni
che
hanno
permesso di comprendere le reali prestazioni del Kinect e quale
sia l'errore dello strumento con oggetti immobili e con persone.
In fine verrà descritto il software di scansione 3D degli oggetti,
l'idea alla base del software e descrizione del funzionamento dei
vari prototipi sviluppati durante la fase di progettazione
permetteranno la comprensione dei principi informatici e
matematici che sono alla base di questo dispositivo.
In fase conclusiva verranno fatte delle considerazioni, a seguito
dei test svolti, riguardanti l'effettivo possibile uso del Kinect in
ambito Biomedico e il possibile sviluppo futuro del prototipo
sviluppato in fase di progettazione.
10
La scansione 3D
Il processo di scansione
Il processo di scansione fondamentalmente è un processo di
digitalizzazione di un oggetto o di un documento. L'obiettivo è
quello di trasformare un oggetto fisico in un formato digitale
leggibile da qualsiasi computer.
La scansione 2D
Quando
si
parla
di
scansione
a
due
dimensioni
fondamentalmente si discute a proposito della scansione di
documenti cartacei. Questa pratica negli ultimi anni è risultata
molto utile sopratutto a livello aziendale, potendo sostituire al
posto di voluminosi archivi di documenti, file immagazzinati in
server aziendali dislocati in luoghi differenti e facilmente
accessibili da parte dei dipendenti.
Il processo risulta essere molto facile da effettuare data la
presenza sul mercato di diversi dispositivi chiamati Scanner che
rendono questo lavoro molto semplice.
11
Sostanzialmente basta inserire il documento con la parte da
scansionare a faccia in giù sul vetro dello Scanner e avviare il
processo tramite il software in dotazione (questa pratica
potrebbe
variare
a
seconda
del
modello).
Il
documento
all'interno dello scanner verrà illuminato con un un forte fascio
di luce e verrà analizzato con un sensore ottico, il sensore
permetterà il riconoscimento dei diversi colori presenti sul foglio
e quindi la digitalizzazione dell'informazione. Normalmente per
fare ciò si utilizza un braccio scorrevole su cui sono montati la
sorgente di luce e il sensore che scorre ad una velocità nota.
La scansione 3D
Dalla scansione a due dimensioni vista precedentemente
possiamo discutere adesso della scansione a tre dimensioni. La
scansione a tre dimensioni è un tipo di scansione nato
principalmente nell'ambito della computer grafica, negli ultimi
anni molte aziende hanno utilizzato questi dispositivi al fine di
12
riprodurre digitalmente un oggetto fisico. Un esempio facile da
comprendere
è
l'utilizzo
di
scanner
3D
per
riprodurre
digitalmente modelli creati a artisti (sculture) per poi animarle al
fine
di
creare
cortometraggi,
lungometraggi
o
anche
videogiochi.
Funzionamento
Il principio di funzionamento di tale oggetto consiste nell'utilizzo
di
dispositivi
che
tramite
differenti
tecniche
(variano
da
dispositivo a dispositivo) percepiscono la distanza di un oggetto
dalla sorgente del sensore per poi andare a creare una nuvola di
punti in un ambiente tridimensionale digitale. Questi punti
verranno appositamente lavorati con l'utilizzo di software
commerciali per la renderizzazione dei punti e la modifica di
alcuni parametri.
Gli scanner 3D più noti sono quelli che funzionano con il
principio del laser. Il principio è semplice ed efficace, si invia un
raggio laser orizzontale che viene passato su tutta la lunghezza
dell'oggetto, la distanza viene calcolato a seconda del tempo
che impiega il laser ad essere riflesso e tornare alla sorgente
dove un sensore capterà il segnale di ritorno.
L'attuale stato dell'arte
Attualmente i dispositivi di scansione 3D si sono molto evoluti
grazie al miglioramento delle tecnologie esistenti, all'inserzione
di nuove tecnologie ed alla crescita smisurata della grafica a tre
13
dimensioni che sta rivoluzionando diversi ambienti come ad
esempio quello cinematografico.
Un altro fattore rilevante è la nascita di nuovi strumenti come
per esempio la stampante 3D che potrebbe dislocare la
tecnologia dell'utilizzo di scanner e stampanti a 3 dimensioni
all'uso domestico e quindi ad una commercializzazione di massa
e alla nascita di nuovi ambiti lavorativi.
La tecnologia attuale di scansione 3D può essere suddivisa in
maniera abbastanza grossolana negli scanner a contatto e a non
contatto.
Riguardo allo scanner a contatto perderemo poco tempo perché
è una tecnologia abbastanza vecchia che viene utilizzata
perlopiù in un ambiente industriale dove si ha bisogno di
conoscere solo se alcuni punti di un prodotto sono stati
posizionati nella maniera giusta. L'idea che sta alla base di
questo oggetto consiste nel far muovere un braccio meccanico
sopra l'oggetto da analizzare, il braccio scendendo toccherà
14
l'oggetto
fermandosi,
automaticamente
registrerà
il
punto
toccato a seconda delle coordinate del braccio.
Il risultato è una scansione effettuata con una precisione che
dipende dalla quantità di punti che si vogliono far scansionare
dal braccio e ovviamente dalla capacità di movimento minima
dei motori che muovono il braccio. Per quanto questa soluzione
possa essere efficace non è per nulla efficiente, il dispositivo è
molto costoso, occupa molto spazio e il tempo necessario per
effettuare un scansione dipende dalla quantità di punti che si
necessitano e comunque risulta molto lungo.
Strumenti molto più performanti sono invece gli scanner a tre
dimensioni senza contatto. Questo genere di dispositivi basano il
proprio
funzionamento
su
differenti
15
principi
fisici.
La
suddivisione può essere fatta considerando due grandi famiglie:
gli scanner a “tempo di volo” e gli scanner a “luce strutturata”.
A tempo di volo
Come accennato precedentemente, gli scanner a tempo di volo
sono un tipo di scanner che sfruttano le proprietà della luce
laser. Sono prodotti molto performanti che, a seconda dei
componenti che vengono utilizzati, possono raggiungere la
precisione del micron.
Alla base di questo tipo di dispositivo vi è un sensore laser a
tempo di volo. Il sensore laser calcola la distanza tra lo
strumento e una superficie cronometrando con grandissima
precisione il tempo di andata e ritorno di un impulso di luce
(appunto il tempo di volo). Un diodo laser emette un impulso di
luce e lo strumento rileva il tempo intercorrente tra l'emissione
dell'impulso e il ritorno sul rilevatore all'interno dello strumento
(fotodiodo). Poiché la velocità della luce “c” è una costante nota,
il tempo di andata e ritorno determina la lunghezza della corsa
della luce, che è due volte la distanza fra il dispositivo di
scansione e la superficie di riflessione. Se “t” è il tempo di
andata e ritorno, quindi la distanza è uguale a (t*c)/2. La
precisione di un laser scanner 3D a tempo di volo dipende
chiaramente dalla precisione con la quale possiamo misurare il
tempo t.
Questo tipo di dispositivi hanno prestazioni incredibili (portate
anche di centinaia di metri) ma hanno anche prezzi elevati.
16
A luce strutturata
Un sistema a luce strutturata utilizza per il suo funzionamento la
proiezione
di
dell'oggetto.
un
pattern
Proiezione
di
direttamente
luce
sulla
strutturata:
superficie
basati
sulla
proiezione di una sequenza di pattern codificati. In questo caso
la deformazione indotta dalla superficie dell’oggetto viene
acquisita tramite una telecamera e sfruttata per il calcolo delle
coordinate tridimensionali. Questi sistemi sono detti anche a
“campo intero” perché per ogni punto sensibile del CCD del
sistema
di
acquisizione
si
ricava
una
tripletta(x,y,z).
Dipendentemente dalla risoluzione della telecamera un sistema
di questo tipo consente la digitalizzazione non di un solo punto
alla volta, bensì di parecchie centinaia di migliaia di punti.
Proiettando
una
stretta
banda
di
luce
su
un
oggetto
tridimensionale si produce una linea di illuminazione che appare
distorta da punti di osservazione diversi dal proiettore e può
essere usata per una ricostruzione geometrica esatta della
forma della superficie illuminata (sezione luminosa).
17
Il procedimento con cui
è possibile ricostruire la forma
dell'oggetto colpito è detto triangolazione.
Un metodo più veloce e versatile è la proiezione di schemi
luminosi che consistono di molte linee in una volta sola o di
frange luminose arbitrarie, questo permette l'acquisizione di
molti campioni simultaneamente. Gli schemi più usati consistono
in linee parallele.
18
Il Kinect Introduzione al dispositivo
Il dispositivo denominato Kinect è un controllore di gioco
sviluppato per la console della Microsoft Xbox 360.
L'ingresso
nell'attuale
mercato
video-ludico
di
questo
apparecchio ha portato ad una rivoluzione nel modo di giocare
dato che questo strumento permette di comandare azioni di
gioco senza l'utilizzo di joypad o pulsanti ma
semplicemente
con l'utilizzo del proprio corpo e, a differenza del controller Wii
della Nintendo o del Motion Controller Sony, questo sensore non
ha bisogno di alcun elemento da collegare al corpo per
decodificare i movimenti effettuati dal giocatore.
19
Il Kinect è stato sviluppato per la Microsoft dall'azienda
israeliana Primesense il cui obiettivo fu appunto la creazione di
un controllore del corpo umano privo di sensori da applicare al
soggetto. Fin dal giorno della sua uscita sul mercato (4
novembre 2010) il Kinect è entrato a far parte della realtà di
sviluppatori universitari o freelance i quali, con tecniche di
reverse engineering hanno iniziato a studiare questo dispositivo.
La Microsoft, la quale inizialmente aveva dichiarato di essere
contraria all'utilizzo del Kinect all'infuori dell'ambiente di gioco,
intuì che il prodotto aveva grandi potenzialità anche con
differenti dispositivi e in data 10 novembre 2010 fece uscire i
primi driver che permisero l'utilizzo della telecamera RGB e del
sensore di profondità. Recentemente la Microsoft ha dichiarato
che il Kinect sarà parte integrante del nuovo sistema operativo
Windows 8.
Attualmente sono nate numerose comunità on-line, finanziate da
grandi imprese, che programmano e sviluppano software da
utilizzare con il Kinect.
Hardware del Kinect
Descrizione Generale
Il Kinect è un dispositivo progettato per essere posizionato sotto
un monitor o un televisore, è costituito fondamentalmente da
una barra di metallo su cui sono montati una serie di sensori e di
20
componenti ed è collegato ad una base tramite un perno
motore.
I componenti che rivestono il Kinect sono di plastica, il
dispositivo non è molto resistente agli urti e anche alcuni
componenti interni sono in plastica (gli ingranaggi del perno
motore).
Una volta aperto il Kinect è possibile vedere la barra metallica
dove sono appoggiati i sensori e gli altri componenti.
21
Una volta aperto si possono notare due schede avvitate alla
barra metallica tramite un distanziatore, queste due schede
vengono utilizzate per l'elaborazione delle immagini difatti è lo
stesso Kinect a elaborare le immagini per il riconoscimento del
corpo e delle mani, ciò è stato fatto per non appesantire di
lavoro la CPU dell'Xbox.
Sempre sulla barra metallica si possono vedere montate una
telecamera RGB di risoluzione 640X480, un emettitore di
infrarossi,
e
una
telecamera
IR
con
una
risoluzione
di
&40X480(inizialmente aveva una risoluzione di 320X240 poco
dopo l'uscita sul mercato è stata aumentata).
L'immagine illustra ottimamente lo schema di funzionamento
generale del Kinect. Il dispositivo ha a disposizione anche un
array di 2 microfoni panoramici e 4 fonti audio posizionati nella
parte bassa dello stesso per rilevare comandi vocali, le fonti
audio
invece
vengono
utilizzate
per
sondare
l'ambiente
circostante e eliminare eventuali rumori di fondo.
Il Kinect ha bisogno di 12 Watt per alimentarsi quindi oltre al
collegamento usb con il computer è necessario attaccarlo alla
22
rete elettrica tramite un trasformatore dato che le porte usb
emettono solo 2,5 Watt.
Descrizione dei Componenti
Passeremo ora ad analizzare nel dettaglio la scheda madre del
Kinect ovvero il cervello stesso del dispositivo.
La scheda madre (scheda A) ha 6 chip montati.
Da sinistra a destra:
•
Stereo
ADC
con
microfono
preamplificato
(Wolfson
Microelectronics WM8737G)
•
N-Channel PowerTrench MOSFET (Fairchild Semiconductor
FDS8984)
23
•
Controller USB 2.0 hub (NEC uPD720114)
•
Pacchetto SAP 6 mm x 4,9 mm non identificato forse SPI
flash (H1026567 XBOX1001 X851716-005 Gepp)
•
SoC
per
il
controller
dell’interfaccia
della
macchina
fotografica (Marvell AP102)
•
SDRAM DDR2 512 megabit (Hynix H5PS5162FF)
Nella scheda B:
•
Due CMOS Rail-to-Rail amplificatore d’uscita a basso costo
(Analog Devices AD8694)
•
Un campionatore e convertitore A/D 8 bit ad 8 canali, con
interfaccia 12C (TI ADS7830I)
•
Allegro Microsystems A3906
•
Una memoria Flash 1Mb x 8 oppure 512Kb x 16 (ST
Microelectronics M29W800DB)
•
Un
processore
d’immagini
Soc
Sensor
(PrimeSense
PS1080-A2)
Infine le schede C e D mostrano una scheda che dispone di un
controller audio USB frontale e centrale (TI TAS1020B) ed infine
sul lato sinistro della scheda si può vedere un accelerometro
(Kionix MEMS KXSD9) che probabilmente è utilizzato come
stabilizzatore d’immagine. Un’ultima cosa importante è il cavo
USB proprietario che la periferica Microsoft usa per collegarsi
alle normali console.
24
Questo cavo potrebbe non essere riconosciuto dai sistemi
operativi su PC, ma ci sono due alternative. La soluzione più
semplice è utilizzare un adattatore che di norma viene venduto
con il Kinect che Microsoft inserisce nella confezione per
questioni di compatibilità con le prime versioni delle console
XBOX 360. La seconda soluzione è costruire un adattatore ad
hoc.
Come funziona Il kinect può essere suddiviso fondamentalmente in tre macrogruppi di funzioni ben distinti: il monitoraggio dei movimenti
(quindi la funzione di analisi video), il riconoscimento vocale e il
motore direzionale.
Questi tre gruppi verranno brevemente descritti ponendo però
maggior enfasi sulle funzionalità dell'analisi video dato che è
quella che verrà studiata e testata su questa tesi.
Il monitoraggio dei movimenti
La funzione di analisi video del Kinect è eseguita dalle due
telecamere (descritte precedentemente), la VGA e la IR. La
prima cosa che la periferica effettua in ambito di gioco è il
riconoscimento del giocatore, ovvero il riconoscimento del corpo
umano, ciò si svolge tramite l'utilizzo di una mappa di
profondità, questa mappa crea un'immagine in tonalità di grigio
che colora i pixel in maniera più chiara o più scura a seconda
della vicinanza dell'oggetto, l'immagine sottostante rende l'idea
di ciò che dovrebbe risultare.
25
Per ottenere quest'immagine il Kinect inonda l'ambiente con il
proiettore infrarossi, questi infrarossi verranno riflessi e una
telecamera IR raccoglie le informazioni, queste informazioni
verranno poi lavorate con dei filtri per riconoscere i corpi umani
e
selezionarli
evitando
di
coinvolgere
oggetti
inanimati,
fondamentalmente questi filtri si basano sulle linee guida del
fatto che un uomo avrà un'altezza media, due gambe, due
braccia e una testa. Inoltre il sistema, dopo aver tracciato uno
scheletro della figura ha in memoria più di 200 posizioni che
potrebbero impedire il riconoscimento della persona in modo da
non perdere il traking.
L'immagine
successiva
è
uno
scatto
effettuato
con
una
fotocamera in una delle prime fasi di sperimentazione e rende
bene l'idea del pattern di infrarossi.
26
Il riconoscimento vocale
La seconda funzionalità importante è il riconoscimento vocale.
Come già accennato in precedenza Il Kinect ha un array di
microfoni e di riproduttori di suoni per permettere al giocatore di
dare comandi vocali al dispositivo, il sistema è stato progettato
per essere in grado di riconoscere voci a distanza di dieci metri, i
riproduttori di suoni vengono utilizzati per effettuare una
scansione audio dell'ambiente circostante e quindi effettuare
calibrazioni per eliminare eventuali rumori di fondo. Una volta
effettuata
la
calibrazione
il
sistema
27
lavora
insieme
alla
telecamera per cercare di prendere solo i suoni creati dal
giocatore e non da altre fonti intorno a lui.
Il motore direzionale
Il Kinect è dotato anche di un motore direzionale che permette
al dispositivo di muoversi in verticale con una estensione
angolare di circa trenta gradi. Questo dispositivo è stato
installato per permettere al sensore di adattarsi ai diversi
ambienti (le case europee sono differenti dalle case americane
come da quelle orientali), in questa maniera il Kinect può
individuare la posizione migliore per l'analisi del corpo.
Il sensore di profondità
Verranno spese alcune parole in più a riguardo del sensore di
profondità dato che è proprio questa parte del dispositivo che
verrà presa in analisi in questo progetto.
Il principio di funzionamento del sensore di profondità del Kinect
si basa sull'utilizzo della luce strutturata a pattern. La differenza
fondamentale
tra
questo
dispositivo
ed
uno
scanner
professionale però risiede nel fatto che il Kinect non utilizza un
emettitore di luce ed un sensore ottico ma bensì un emettitore
di infrarossi ed una fotocamera sensibile agli infrarossi, ovvero
due dispositivi nettamente più economici rispetto ai precedenti.
Come è stato accennato nei precedenti capitoli questo tipo di
sensore sfrutta la distorsione provocata da superfici irregolari di
un pattern di luce. Nonostante normalmente si utilizzino linee
28
parallele il pattern generato dal Kinect è un insieme di punti
luminosi che lo fanno apparire come un celo stellato.
Per questioni di visualizzazione l'immagine precedente presenta
solo una porzione del pattern originale ma non è necessario
presentare il completo dato che l'immagine completa è una
ripetizione di un pattern più piccolo, l'immagine precedete ad
esempio è un 2X2 il che vuol dire che contiene 4 immagini
ripetute del pattern di base.
Il Kinect, oltre ad utilizzare la distorsione del pattern di luce
combina insieme anche altre de tecniche che vengono utilizzate
nella computer vision: “depth from focus” e “depth from
stereo”. L'insieme di queste tre tecniche porta alla stima della
29
distanza dal sensore che, secondo quanto affermato dalla casa
produttrice ha un errore che non supera il centimetro anche se
non sono mai state fatte delle misurazioni.
Depth from focus
Questa tecnica deriva da un concetto di ottica che misura al
tolleranza di posizionamento del piano dell'immagine (piano
della pellicola fotografica) rispetto alla lente. Fondamentalmente
si basa sul fatto che un'immagine è piu sfocata quanto più è
distante.
La profondità può essere calcolata secondo questa formula:
t=2Nc
v
F
dove t è la profondità, N è il rapporto focale delle lenti, c è il
cerchio di sfocatura (in pratica misura la distorsione di
un'immagine puntiforme proveniente da una lente non nel
fuoco), v è la distanza dell'oggetto e F è la lunghezza focale.
Il Kinect sfrutta e migliora questo principio mettendolo in pratica
in una maniera molto efficiente. Il Kinect utilizza una speciale
lente astigmatica che ha una differente lunghezza focale lungo
l'asse X e lungo l'asse Y. Il pattern proiettato dal Kinect è cosi
particolare anche per sfruttare questo principio, i puntini
(cerchietti) proiettati si deformano in piccole ellissi la quale
orientazione dipende per l'appunto dalla profondità.
L'immagine seguente potrebbe risultare semplicisticama rende
bene l'idea di come il Kinect sfrutta questo fenomeno.
30
Depth from stereo
Il principio utilizzato in questa tecnica deriva da un principio di
parallasse. L'idea principale si basa sul fatto che se si osserva
per esempio una stanza e si fa una foto dopodiché spostandosi
si effettua un'altra foto, si ha l'impressione che gli oggetti più
vicini si siano spostati molto di più rispetto agli oggetti più
lontani. Questo principio è utilizzato dal cervello umano per
percepire le distanze, ovvero sfruttando le due immagini degli
occhi che osservano da due posizioni differenti.
Da come è stato descritto è facile dedurre che questo fenomeno
può avvenire o in caso di un movimento di un osservatore,
oppure nel caso in cui l'osservatore ha a disposizione due o più
punti di osservazione in contemporanea.
31
Il Kinect utilizza questo principio in maniera rivisitata, e, come è
ovvio che sia, sfrutta il pattern di punti creato.
Prima di passare alla spiegazione, per comprendere meglio, è
importante notare la distanza tra l'emettitore di infrarossi e
l'osservatore, ideologicamente sarebbe stato molto più logico
posizionarli il più vicino possibile appunto per evitare errori
dovuti alla distanza, invece tra i due sono disposti diversi
componenti. Il Kinect sfrutta per l'appunto la distanza tra
l'emettitore di infrarossi e la telecamere IR, che è nota, per
calcolare la profondità tramite la parallasse.
Abbiamo prima però specificato che la parallasse può avvenire
solo nel caso in cui l'osservatore si sposta o si stia osservando
usando una coppia di sensori riceventi; in questo caso il Kinect
sfrutta il pattern di punti che è noto a priori combinato con la
distanza generatore-osservatore. In poche parole più l'oggetto è
lontano più il punto è osservato vicino a dove è proiettato, più
32
l'oggetto è vicino più il punto sarà distante da dove è stato
proiettato, ciò avviene confrontando l'immagine tratta dal
generatore di punti con l'immagine reale del pattern.
Software del Kinect
Le librerie ufficiali
Come abbiamo accennato in precedenza i driver per il Kinect
uscirono in via non ufficiale nel dicembre del 2010, da quella
data la Microsoft ha notato che molti gruppi di programmatori e
ricercatori si sono interessati allo sviluppo di applicazioni per il
dispositivo. Avendo fiutato una buona opportunità di crescita la
Microsoft ha deciso nel luglio del 2011 di rilasciare i driver e le
SDK (Software Development Kit) ufficiali. Il Software
Development
Kit ufficiale fornisce una libreria in
recuperare e gestire i flussi di dati provenienti dai
grado
di
sensori del
dispositivo e può essere utilizzata sia in C++ che in uno dei
linguaggi Managed del Framework .NET.
Le librerie ufficiali Microsoft sfruttano le librerie grafiche DirectX
quindi sono librerie limitate al solo utilizzo in Windows, nonché
sono limitate da una licenza d'uso che permette il libero sviluppo
di applicazioni ma che ne blocca la commercializzazione e la
distribuzione, ciò probabilmente è stato fatto per permettere alla
Microsoft di selezionare possibili candidati per lavorare a future
applicazioni Microsoft per Windows 8, difatti la Microsoft stessa
33
ha organizzato concorsi on-line che premiavano l'applicazione
migliore.
Ciò non deve assolutamente preoccupare dato che dalla
comparsa dei Driver non ufficiali interi gruppi di programmatori
hanno avviato progetti di sviluppo sul Kinect con relativo rilascio
di Librerie che pereemttessero al dispositivo di funzionare con
altri sistemi operativi e con altre licenze.
Le librerie non ufficiali
Attualmente ci sono tre progetti interessanti che si stanno
sviluppando parallelamente e che consentono di accedere a
tutte (o quasi) le funzionalità del dispositivo: LCNUI, OpenNI e
OpenKinect.
LCNUI è la prima libreira che è stata resa disponibile su windows
e permette il controllo del motore, dei microfoni e naturalmente
ricevere le immagini riprese dalle telecamere. Il vantaggio di
questa libreria è che è molto semplice da usare, si usa c#, ma
non contiene nessuna API per il riconoscimento di immagini e
quindi è necessario utilizzare un framework specifico come
OpenCV di intell o Aforgenet. Sono due ottime librerie e il popolo
della rete afferma che è relativamente facile riconoscere i
movimenti.
La seconda soluzione, OpenNI, l’ultima resa pubblica in ordine di
tempo, oltre a permettere di muovere il Kinect e catturare le
immagini, offre una libreria molto avanzata chiamata NITE per il
riconoscimento delle mani e del corpo della persona. Questa
libreria è stata resa disponibile in beta gratuita da Primesense,
34
cioè la società che ha sviluppato Kinect. Da notare che
nonostante sia l'ultima libreria uscita è una delle più sfruttate e
ha a disposizione una gran quantità di piccoli programmi da
usare come base di partenza per la creazione di software più
evoluti.
La terza soluzione, OpenKinect, è la prima in assoluto a essere
stata sviluppata inizialmente su Linux, su cui funziona molto
bene, e successivamente portata su windows tramite i driver
Zephod. Purtroppo il porting su Windows è ancora molto
incompleto
e
nonostante
gli
esempi
disponibili
sul
sito
funzionino, sono state riscontrate molte difficoltà a compilare le
librerie e i progetti.
Le tabelle che seguono fornisce una breve descrizione tecnica
delle librerie descritte.
LCNUI
Licenza
BSD
Sistema Operativo
Windows
Linguaggi di programmazione
C, C++, C#
OpenNI
Licenza
GNU Lesser General Public License
(LGPL)
Sistema Operativo
Windows, Linux (Ubuntu 10.10), OSX
Linguaggi di programmazione
Java, C, C++, C#
35
OpenKinect
Licenza
GNU General Public License (GPL2) o
Apache 20
Sistema Operativo
Windows, Linux (Ubuntu 10.10), OSX
Linguaggi di programmazione
Java, C, C++, C# , Python
La nostra scelta
Per sviluppare questa Tesi è stato deciso di lavorare con le
librerie OpenNI. Vi sono diverse motivazioni per aver fatto
questa scelta, innanzitutto questa libreria permette di lavorare e
sviluppare software per il Kinect con diversi linguaggi di
programmazione tra cui il Java (che verrà appunto utilizzato
nello sviluppo di questa tesi), possiede una licenza di libero
utilizzo del tipo GNU LGPL e sopratutto sono ben documentate
ed in continua fase di sviluppo e sono supportate persino
dall'azienda sviluppatrice del Kinect, La PrimeSense.
36
Un altro fattore importante che ha influenzato questa scelta è la
possibilità di utilizzare queste stesse librerie con uno strumento
simile al Kinect sviluppato però dall'Asus.
In questa pagina web si può vedere la gamma di prodotti offerta
dall'Asus
http://www.asus.it/Multimedia/Motion_Sensor
I due principali sono l'Xtion PRO e l'Xtion PRO Live, il primo è
dotato solo del sensore di profondità mentre il secondo ha a
disposizione anche la fotocamera RGB.
Questi prodotti sono nati sull'onda dei prodotti per Kinect e
vengono utilizzati per lo più da sviluppatori. Non si conosce
ancora ne il prezzo ne le potenzialità ma per chiunque volesse
utilizzare i suddetti strumenti con le librerie OpeNI, basterà
seguire le procedure di installazione descritte nel prossimo
capitolo sostituendo al posto dei driver Kinect i driver dell'Asus.
37
38
Gli strumenti utilizzati
Al fine di sviluppare questa Tesi sono stati utilizzati svariati
programmi e strumenti atti alla creazione dei software e delle
misure effettuate. Verranno descritti brevemente il sistema
operativo, le librerie e gli ambienti di sviluppo utilizzati. Sempre
all'interno di questo capitolo verrà descritta la modalità di
installazione di tutti questi componenti al fine di permettere al
lettore
di
eseguire
immediatamente
l'installazione
senza
perdersi in ricerche sul web.
Da notare il fatto che tutti gli strumenti utilizzati sono
totalmente gratuiti e reperibili nel web, la spesa sostenuta
corrisponde al solo prezzo del computer e del Kinect.
L'ambiente
Ubuntu
Iniziamo la lista degli strumenti con il
sistema operativo Utilizzato.
Ubuntu
è
un
sistema
operativo
GNU/Linux nato nel 2004, basato su
Debian, che si focalizza sull'utente e
39
sulla facilità di utilizzo. Ubuntu è orientato all'utilizzo desktop e
pone una grande attenzione al supporto hardware. È prevista
una nuova versione ogni sei mesi.
Finanziato dalla società Canonical Ltd (registrata nell'Isola di
Man), questo sistema è pubblicato come software libero sotto
licenza GNU GPL ed è quindi gratuito e liberamente modificabile.
L'ideatore
dell'iniziativa
è
Mark
Shuttleworth,
un
giovane
imprenditore sudafricano diventato sostenitore del software
libero al cui servizio ha posto le sue risorse. Ubuntu, infatti,
prende il nome da un'antica parola africana (zulu, ma anche
xhosa) che significa "umanità verso gli altri", oppure "io sono ciò
che sono per merito di ciò che siamo tutti".
Il 1º luglio 2005 è nata la Fondazione Ubuntu con un fondo
iniziale di 10 milioni di dollari USA, il cui scopo è lo sviluppo della
distribuzione nel caso in cui Canonical Ltd dovesse cessare le
attività. La fondazione è al momento dormiente.
Ubuntu è una distribuzione Linux basata sull'ambiente desktop
GNOME e l'interfaccia utente Unity. È progettata per fornire
un'interfaccia semplice, intuitiva e allo stesso tempo completa e
potente. I punti di forza di questa distribuzione sono l'estrema
semplicità
di
utilizzo,
l'ottimo
riconoscimento
e
supporto
dell'hardware, il vasto parco software costantemente aggiornato
e una serie di strumenti di gestione grafici che la rendono
improntata verso l'ambiente desktop. È corredata da un'ampia
gamma
di
applicazioni
amministrazione
del
libere.
sistema,
Esistono
ed
è
vari
possibile
strumenti
di
gestirli
sia
separatamente che in maniera centralizzata con l'Ubuntu
40
Control Center, paragonabile al pannello di controllo Windows o
al Mandriva Linux Control Center o a YaST di OpenSUSE.
La versione desktop è stata realizzata per rispondere alle più
frequenti necessità di un utente medio, quali navigazione in
Internet, gestione dei documenti e delle immagini, svago e
comunicazione.
La versione installata è la versione più recente ovvero la 12.04
Le Librerie OpenNI e NITE
L'organizzazione
OpenNI
(Open
Natural
Interaction)
è
un'organizzazione No profit che incentra il proprio lavoro sul la
certificazione e lo sviluppo di interfacce utente naturali, quindi
sullo
studio
e
sviluppo
di
dispositivi
atti
a
migliorare
l'interoperabilità uomo macchina.
L'organizzazione fu creata nel Novembre del 2010 con l'uscita
del sito web al publico l'8 dicembre. Uno dei principali membri
del progetto è la PrimeSense.
Il sito Internet relativo al progetto contiene le API della libreria
che permettono di muoversi con facilità tra le varie classi e
metodi. Per il riconoscimento delle mani e del corpo OpenNI
sfrutta una libreria chiamata NITE.Il sito internet relativo a
questo progetto è il seguente: http://openni.org/
All'interno è presente tutta la documentazione e i file sorgente
di queste librerie.
41
Le librerie Java3D
Queste librerie sono state sviluppate per la gestione di ambienti
tridimensionali in java, sono librerie gratuite e facilmente
scaricabili
e
installabili
dal
sito
della
SUN:
http://www.oracle.com/us/sun/index.htm
Queste librerie permettono la manipolazione di spazi 3D con
oggetti geometrici o semplici punti.
Eclipse
Eclipse
è
sviluppo
un
ambiente
integrato
di
multi-
linguaggio e multipiattaforma.
Ideato
da
un
consorzio
di
grandi società quali Ericsson,
HP,
IBM,
Intel,
MontaVista
Software, QNX, SAP e Serena
Software,
chiamato
Eclipse
Foundation sullo stile dell'open
source.
Eclipse può essere utilizzato per la produzione di software di
vario genere, si passa infatti da un completo IDE per il
linguaggio Java (JDT, "Java Development Tools") a un ambiente
di sviluppo per il linguaggio C++ (CDT, "C/C++ Development
Tools") e a plug-in che permettono di gestire XML, Javascript,
PHP
e
persino
di
progettare
graficamente
una
GUI
per
un'applicazione JAVA (Eclipse VE, "Visual Editor"), rendendo di
fatto Eclipse un ambiente RAD.
42
Il programma è scritto in linguaggio Java, ma anziché basare la
sua GUI su Swing, il toolkit grafico di Sun Microsystems, si
appoggia a SWT, librerie di nuova concezione che conferiscono
ad Eclipse un'elevata reattività.
La piattaforma di sviluppo è incentrata sull'uso di plug-in, delle
componenti software ideate per uno specifico scopo, per
esempio la generazione di diagrammi UML, ed in effetti tutta la
piattaforma è un insieme di plug-in, versione base compresa, e
chiunque può sviluppare e modificare i vari plug-in. Nella
versione base è possibile programmare in Java, usufruendo di
comode funzioni di aiuto quali: completamento automatico
("Code completion"), suggerimento dei tipi di parametri dei
metodi, possibilità di accesso diretto a CVS e riscrittura
automatica del codice (funzionalità questa detta di Refactoring)
in caso di cambiamenti nelle classi.
Essendo scritto in Java, Eclipse è disponibile per le piattaforme
Linux, HP-UX, AIX, Mac OS X e Windows.
Procedure di Installazione
In questa sezione verrà descritta la procedura di installazione
dei
vari
strumenti
utilizzati,
tutto
ciò
verrà
spiegato
accuratamente perché l'installazione della periferica Kinect e le
relative librerie può risultare abbastanza macchinosa data
l'assenza di guide ufficiali o di driver pre installati. Ovviamente
la descrizione si incentrerà sopratutto nella parte relativa alla
43
periferica, riguardo agli altri elementi si spenderanno molte
meno parole data la facilità e l'intuitività di installazione.
Ubuntu
L'installazione del sistema operativo è molto semplice e rapida
dato che, con la nuova versione, la procedura è quasi
totalmente automatizzata.
Innanzitutto bisogna procurarsi il cd di installazione, per fare ciò
basta recarsi nella pagina web www.ubuntu.it da dove si può o
ordinare il CD (solitamente questo lo fanno gli estimatori di
questo sistema operativo che amano avere la collezione di cd
originali di tutte le distribuzioni) pagando le spese di spedizione
ed una simbolica piccola cifra di contributo, oppure scaricandolo
direttamente e gratuitamente dal sito internet specificando
anticipatamente l'architettura del proprio computer e la versione
di Ubuntu che si desidera. Dopo aver scaricato la versione
desiderata basterà trascrivere l'immagine del disco su un CD,
impostare il boot loader dando priorità al lettore dischi, inserire il
disco, spegnere e riaccendere il computer. Automaticamente
partirà la procedura di installazione che in pochi semplici passi
permetterà l'installazione del sistema o l'utilizzo dello stesso dal
supporto ottico. La procedura di installazione è molto semplice e
basta impostare la lingua ed il fuso orario per procedere.
Particolarità di Ubuntu è il fatto che permetta all'utente di
decidere se partizionare il proprio disco in modo da avere
il
sistema operativo originale e quello nuovo conviventi nello
44
stesso computer oppure se si vuole formattare tutto e avere a
disposizione il solo Ubuntu.
OpenNI
Nei
prossimi
tre
paragrafi
verrà
illustrata
nel
dettaglio
l'istallazione delle librerie OpenNi e NITE e i driver del dispositivo
Kinect. Questa procedura sarà esplicata passo dopo passo dato
che può risultare abbastanza macchinosa e laboriosa.
Per prima cosa bisogna entrare nel Terminale del sistema
operativo
dove
poi
inseriremo
tutti
i
comandi
relativi
all'installazione.
Una volta entrati nel Terminale si procederà scaricando tutto il
necessario e installando le dipendenze.
Il primo comando da inserire è il seguente:
sudo apt-get install git-core cmake libglut3-dev pkg-config gcc g++
build-essential libxmu-dev libxi-dev libusb-1.0-0-dev doxygen graphviz
git
Dopo questo comando il sistema potrebbe rispondere con il
problema “libglut3-dev cannot be installed”ovvero che il sistema
operativo ci dice che non possiamo installare libglut3, in tal caso
si installa al suo posto “freeglut” con:
sudo apt-get install git-core cmake freeglut3-dev pkg-config gcc g++
build-essential libxmu-dev libxi-dev libusb-1.0-0-dev doxygen graphviz
git
procediamo creando la directory di lavoro:
mkdir ~/kinect
45
cd ~/kinect
Scaricare dentro la cartella l'ultima versione di OpenNI:
git clone https://github.com/OpenNI/OpenNI.git
quella appena scaricata è la versione Stable, nel caso di questa
Tesi è stata utilizzata la versione Unstable che si ottiene
inserendo
cd OpenNI
git checkout unstable
Se tutto va per il verso giusto dovrebbero apparire le seguenti
righe di conferma
Branch unstable set up to track remote branch unstable from origin.
Switched to a new branch ‘unstable’
Nel caso non avesse funzionato si puo provare con
cd OpenNI
git branch unstable
git checkout unstable
git pull origin unstable
Passiamo ora all'installazione vera e propria.
Inserire:
cd Platform/Linux/Build
make && sudo make install
46
Potrebbe comparire un problema con il seguente comando, il
sistema potrebbe rispondere dicendo che javac non è stato
trovato
javac
-d
x64-Release
../../../../../Wrappers/OpenNI.java/src/org/OpenNI/*.java
/bin/sh: javac: not found
make[1]: *** [../../../Bin/x64-Release/org.OpenNI.jar] Errore 127
make[1]:
uscita
dalla
directory
“/home/sparazza/kinect/OpenNI/Platform/Linux/Build/Wrappers/OpenNI.jav
a”
make: *** [Wrappers/OpenNI.java] Errore 2
In questo caso si risolve installando al seguente dipendenza
sudo apt-get install openjdk-7-jdk
Dopodiché ripetere il comando
make && sudo make install
Nel caso in cui il sistema continui a dare errori, questa volta
negando
il
permesso
di
accedere
al
file
RedistMaker.
/bin/sh: ./RedistMaker: Permission denied
/home/sparazza/kinect/OpenNI/Platform/Linux/Build
cd ../Redist; ./install.sh; cd cd: 1: can’t cd to ../Redist
/bin/sh: ./install.sh: not found
47
install.sh
e
a
/home/sparazza/kinect/OpenNI/Platform/Linux/Build
Si risolve con
cd ../CreateRedist
sudo chmod +x install.sh RedistMaker
cd ../Build
Dopodiché occorre nuovamente rilanciare
make && sudo make install
Nel caso in cui dovesse continuare ad avere problemi occorrerà
spostare i file necessari
sudo cp
-r
../Redist/OpenNI-Bin-Dev-Linux-x64-v1.5.2.7/*
../Redist/
Sostituendo OpenNI-Bin-Dev-Linux-x64-v1.5.2.7 con la versione
presente dentro la cartella Redist (prestare attenzione al nome
del file dato che in questo esempio la versione è la 1.5.2.7 ma
ovviamente la versione nuova sarà già cambiata).
Rilanciare
make && sudo make install
Quando finalmente comparirà la scritta
*** DONE ***
l'installazione di OpenNI sarà completa
Driver Kinect
Per installare i Driver, sempre da Terminale, tornare nella
cartella di lavoro e scaricare l'ultima versione
48
cd ~/kinect/
git clone https://github.com/avin2/SensorKinect
cd SensorKinect
git checkout kinect
Procedere con l'installazione dei Driver
cd Platform/Linux/Build/
make && sudo make install
Il sistema potrebbe di nuovo ottenere problemi come per
l'installazione precedente
cd ../CreateRedist; ./RedistMaker; cd /bin/sh: ./RedistMaker: Permission denied
/home/sparazza/kinect/SensorKinect/Platform/Linux/Build
cd ../Redist; ./install.sh; cd cd: 1: can’t cd to ../Redist
/bin/sh: ./install.sh: not found
La soluzione ovviamente sarà simile alla precedente
cd ../CreateRedist
sudo chmod +x install.sh RedistMaker
cd ../Build
E rieseguire
make && sudo make install
49
Nel caso in cui si incappasse nuovamente nel seguente
problema
cd ../Redist; ./install.sh; cd /bin/sh: ./install.sh: not found
Si procederà con lo spostamento dei file necessari
sudo cp
-r
Sostituendo
../Redist/Sensor-Bin-Linux-x64-v5.1.0.25/*
Sensor-Bin-Linux-x64-v5.1.0.25
con
../Redist/
la
versione
installata (come nel caso precedente prestare attenzioni alle
versioni dei file).
Ripetere
make && sudo make install
Alla fine della procedura si otterrà
*** DONE ***
Dopo di ciò l'installazione dei Driver e delle librerie OpenNI sarà
completa, a questo punto si potrà collegare il Kinect al
computer, il led verde lampeggiante sarà il segnale della riuscita
dell'operazione.
Nel caso si volesse testare il Kinect la libreria OpenNI contiene
dei piccoli programmini di prova che possono essere lanciati
come ad esempio
cd ~/kinect/OpenNI/Platform/Linux/Bin/x64-Release/
./NiViewer
Il risultato di questo comando è dato dalla seguente immagine
50
per eseguire gli altri programmi contenuti nella cartella x64release basterà inserire il comando ./ seguito dal nome del
programma.
NITE
Come detto in precedenza per sfruttare il Kinect al massimo si
avrà bisogno anche delle librerie NITE che contengono il
riconoscimento della figura umana e delle mani.
L'installazione si esegue procurandosi i file necessari dal sito
http://www.openni.org/Downloads/OpenNIModules.aspx
selezionare:
1. OpenNi Complian Middleware Binaries
2. Stable
3. Primesense NITE Stable Build for Ubuntu 10.10
51
Ovviamente controllare prima l'architettura del computer (32 o
64 bit) e scaricare la versione apposita.
La figura seguente dovrebbe rendere l'idea di come fare
Dopo aver scaricato tutto il necessario bisognerà creare una
cartella con nome “Nite” all'interno della cartella “Kinect”
Il path completo è il seguente
~/kinect/Nite
Prima di procedere all'installazione vera e propria occorrerà
inserire la giusta chiave di licenza in alcuni suoi file XML. Per
fare ciò bisognerà eseguire i comandi di apertura dei suddetti
file
cd ~/kinect/Nite/Data
52
chmod 777 Sample-Scene.xml Sample-Tracking.xml Sample-User.xml
gedit Sample-Scene.xml Sample-Tracking.xml Sample-User.xml
Individuare nei file il punto in cui è scritto
<License vendor=”PrimeSense” key=”insert key here”/>
e sostituire dove è scritto “insert key here ” la seguente chiave:
“0KOIk2JeIBYClPWVnMoRKn5cdY4=”
Alla fine la stringa dovrebbe comparire cosi:
<License
vendor=”PrimeSense”
key=”0KOIk2JeIBYClPWVnMoRKn5cdY4=”/>
Questa operazione dovrà essere eseguita per tutti e tre i file
aperti.
Adesso si potrà procedere con l'istallazione eseguendo i
seguenti comandi
cd ~/kinect/Nite/
sudo ./install.sh
Nel caso in cui venisse chiesta la chiave basterà copiare e
incollare 0KOIk2JeIBYClPWVnMoRKn5cdY4=
Come nel caso delle librerie OpenNI anche Nite ha una serie di
esempi da poter lanciare, basterà entrare nella cartella Release
con il seguente comando
cd ~/kinect/Nite/Samples/Bin/Release
e eseguire il file ponendo ./ seguito dal nome del file.
53
Java 3D
Queste librerie sono nate per implementare funzioni di grafica
3D nel linguaggio JAVA. L'installazione è molto meno laboriosa
delle precedenti librerie.
Per prima cosa scaricare la versione più recente delle librerie dal
seguente URL:
http://www.oracle.com/technetwork/java/javase/tech/index-jsp138252.html
Dopodiché bisognerà inserire il file scaricato dentro il seguente
path
usr/java/jdk1.6.0_01/jre
Il path potrebbe essere differente a seconda della versione JDK
posseduta.
In conclusione basterà andare dal terminale e digitare
cd /usr/java/jdk1.6.0_01/jre
sudo sh /path-to-download-files/java3d-1_5_1-linux-i586.bin
Le librerie verranno installate.
Eclipse
Per
completezza
verrà
spesa
qualche
parola
riguardante
l'installazione di Eclipse che è terribilmente semplice e rapida.
Basterà accedere all'Ubuntu Software Center, digitare il nome
eclipse
nell'apposito
riquadro
di
ricerca
e
confermare
l'installazione, il sistema richiederà l'inserimento della password
e subito dopo installerà il software.
54
Il progetto
In
questo
Capitolo
si
entrerà
approfonditamente
nella
descrizione del progetto sviluppato per questa Tesi di laurea, si
analizzeranno nella prima parte gli obiettivi che si vogliono
raggiungere e le possibilità che si hanno, in seguito si
illustreranno nel dettaglio i software che sono stati sviluppati per
verificare la sensibilità ed il margine di errore del Kinect, e i
software creati per verificare un possibile sviluppo di prodotto
da utilizzare in ambito medico e non solo.
Obiettivi del progetto
Introduzione
Dopo l'uscita del dispositivo Kinect sul mercato sono partiti
diversi progetti basati sulle grandi potenzialità di questo
prodotto, sono state fatte anche molte ipotesi sui possibili
sviluppi futuri nei più differenti campi di utilizzo (dal campo
medico a quello militare). La possibilità che offre il kinect di
riconoscere figure umane e gesti può tornare utile nella
creazione di sistemi di allarme intelligenti o nei programmi di
assistenza.
L'obiettivo di questo progetto si basa sulla verifica delle capacità
di calcolo e di misurazione di questo strumento per verificare se
55
è possibile utilizzarlo in futuro per effettuare misurazioni
mediche. L'idea alla base del progetto nasce dalla possibilità di
utilizzare il Kinect in ausilio alle normali strumentazioni mediche
per migliorare il lavoro e la permanenza di medici e pazienti, un
esempio molto interessante è la possibilità di utilizzare la
cattura
di alcuni movimenti base, come per esempio il
movimento della mano, per far eseguire ad alcuni dispositivi
semplici operazioni. Tutto ciò può essere sfruttato come
assistenza ad anziani o a pazienti di corsia ma anche come
strumento per chi lavora in ambienti sterili che non può
adoperare
assolutamente
strumenti
non
precedentemente
sterilizzati e non sterilizzabili (come per esempio mouse e
tastiera).
Vi sono anche progetti in via di sviluppo, nati in differenti
università del mondo, che comprendono l'utilizzo del Kinect nelle
sale operatorie per permettere al medico di poter visualizzare
immagini relative ai pazienti con il solo utilizzo delle mani.
56
Sintesi del progetto
Il progetto si basa sulla possibilità di effettuare misurazioni di
pazienti tramite il kinect per poter prendere le misure fisiche del
soggetto con una determinata precisione. Fondamentalmente si
vuole creare una scansione del busto di un paziente a tre
dimensioni su cui poi si potrà ad andare ad effettuare le possibili
misurazioni. Questo tipo di progetto chiede di essere un
preambolo per un possibile sviluppo futuro in cui un medico, un
fisioterapista o anche un nutrizionista possano conservare le
diverse scansioni fatte ai pazienti nel corso del tempo per poi
poter visualizzare, oltre alle misure del busto del paziente,
anche le differenze e i cambiamenti fisici che hanno avuto i
pazienti nel corso degli anni che possono essere crescite o
decrescite muscolari o adipose.
Una volta effettuata la scansione un futuro software potrà
andare a calcolare le dimensioni del torace e delle varie zone di
interesse, nonché anche un calcolo dei volumi che unito alla
misurazione del peso potrà restituire la disposizione delle varie
masse all'interno del corpo.
Un software di questo tipo potrebbe tornare utile oltre che in
campo medico anche in ambito sportivo andando a visualizzare i
miglioramenti muscolari ottenuti da un'atleta, oppure nella
produzione di vestiario andando a prendere le misure esatte di
un modello o di un possibile cliente.
Nel nostro caso questo progetto si sviluppa in due grosse
sezioni, la prima in cui verrà sviluppato un algoritmo per
57
effettuare una scansione tridimensionale del corpo o di altri
oggetti, la seconda in cui si effettueranno delle sperimentazioni
per verificare l'effettiva capacità di misurazione del Kinect.
L'attuale stato dell'arte
Attualmente le misure effettuate da un medico o da un
fisioterapista sono eseguite manualmente tramite un metro a
nastro flessibile.
Questo strumento è molto utile e versatile
data la sua flessibilità, se andassimo a
considerare
le
caratteristiche
di
ogni
strumento di misura possiamo considerare
che uno strumento di questo genere ha le
seguenti caratteristiche:
•
Sensibilità: 1mm
•
Portata: 1500 o 2000 mm (a seconda del modello)
•
Incertezza: ±1mm
L'incertezza,
se
non
viene
specificata
dal
produttore,
normalmente è pari alla sensibilità dello strumento e non viene
mai calcolata con misure al di sotto della sensibilità dello stesso
(effettivamente non avrebbe senso).
Preso dalle sue caratteristiche questo oggetto sembra avere
delle ottime caratteristiche di misurazione ed effettivamente è
cosi. Il problema nasce nel momento in cui si va ad effettuare
misure
sul
corpo
umano
tramite
lo
stesso.
Un
medico
solitamente effettua la misurazione avvolgendo il metro intorno
58
al torace o all'addome del paziente riportando una misura non al
di sotto del centimetro, considerando solo questo possiamo dare
un'incertezza a questa misura pari per l'appunto alla sensibilità
della misura stessa, ovvero di un centimetro. Per avere dei dati
certi sull'incertezza della misura bisognerebbe utilizzare un
busto rigido artificiale e far effettuare la stessa misurazione da
un campione di N medici differenti per poi poter effettuare i
dovuti calcoli.
Anche cosi le misurazioni non potrebbero essere considerate
veritiere dato che, nel secondo caso, non si considera affatto la
respirazione del paziente.
L'unica cosa che possiamo dire con certezza è che una
misurazione di questo tipo è affetta da un minimo di 1cm
d'errore.
La nostra proposta
L'idea è quella di sostituire questo metodo di lavorazione del
medico con un dispositivo economico e poco ingombrante che
funzioni semplicemente ponendo il paziente all'interno dell'area
di lavoro del Kinect e in pochi secondi restituisca la scansione
del corpo.
Automaticamente il sistema dovrebbe calcolare tutti i valori
necessari al lavoro del medico (per esempio la larghezza del
torace), e potrebbe oltretutto restituire altri valori come il
volume del corpo misurato. Oltre ciò il medico potrà usufruire di
un database di scansioni dei vari pazienti per effettuare
scansioni future.
59
Ovviamente tutto ciò dovrà avere una precisione maggiore
rispetto agli attuali metodi di misurazione, quindi si parlerà di
misurazioni all'ordine del millimetro.
Per verificare se questo prodotto potrà o meno sostituire gli
attuali metodi verranno effettuate sperimentazioni e misure per
verificare l'errore.
60
Prestazioni del Kinect
In questo capitolo verranno illustrati gli esperimenti e le
misurazioni effettuati per calcolare e comprendere quale sia il
grado di errore del sensore Kinect.
Si
descriverà
esperimenti
e
brevemente
di
seguito
come
sono
verranno
stati
descritti
effettuati
i
risultati
gli
e
commentati a dovere per cercare di individuare il punto di
misurazione ottimo e l'errore riscontrabile.
Descrizione dell'esperimento
I valori della mappa di profondità
Tramite l'utilizzo di alcuni programmi d'esempio forniti con le
librerie OpenNI si è potuto visualizzare il segnale restituito dal
sensore di profondità.
61
Come si può vedere l'immagine non risulta perfettamente
delineata ma appare con un contorno frastagliato, il programma
preso in esempio restituisce in video tutto ciò che viene
catturato dal sensore di profondità, quello che non si può vedere
da questa foto è che nel video l'immagine appare tremolante,
come se alcuni pixel cambiassero il loro valore con il prolungarsi
dell'esposizione.
La domanda che sorge visualizzando quest'immagine è di
quanto ogni pixel cambia il proprio valore di profondità e a
quanto ammonta questo errore?
La Microsoft rimedia a questa cosa filtrando l'immagine del
Kinect con delle figure umane impostate che comprendono varie
forme fisiche (per esempio alto o basso, magro o grasso,
muscoloso o mingherlino).
62
Per verificare la precisione del calcolo eseguita dal Kinect
bisogna innanzitutto capire di che forma sono e come sono
memorizzati i valori del campo di profondità. La libreria OpenNi
offre una classe chiamata “ DepthGenerator” che effettua la cattura
dei valori della mappa di profondità e che può essere manipolata
attraverso i suoi metodi. In particolare andiamo a considerare il
metodo “getMetaData()” che restituisce un oggetto del tipo
MetaData, i valori appartenenti a questo oggetto possono essere
manipolati o per creare immagini e video come l'esempio
precedente,
oppure
profondità,
nel
per
secondo
restituire
caso
i
valori
utilizziamo
effettivi
il
della
metodo
“getData().createShortBuffer()” che restituisce un array di short di
lunghezza
640*480.
Questi
valori
sono
numeri
che
rappresentano la distanza dal Kinect in millimetri (per esempio
per un oggetto posizionato ad un metro di distanza il valore
corrispondente sarà 1000).
L'esperimento L'esperimento che è stato effettuato per calcolare l'errore dato
dal Kinect sfrutta esattamente i valori restituiti dalla mappa di
profondità. Per avere risultati significativi il Kinect è stato posto
di fronte ad una parete senza oggetti ad una distanza nota, tutto
ciò è stato fatto per evitare l'interferenza di oggetti di fronte alla
telecamera che potrebbero infastidire la misura (il contorno
dell'immagine precedente potrebbe darmi seri errori di distanza
dato che il contorno non è stabile, potrebbero comparire e
scomparire pixel che poi andrebbero ad infastidire le distanze
effettive).
63
Tramite Eclipse si prendono due array di valori presi ad una
distanza di tempo significativa l'uno dall'altro, dopodiché si crea
l'array delle differenze di questi valori, in valore assoluto, e
sempre tramite Eclipse è possibile calcolare il numero di pixel
che variano tra uno scatto e l'altro, di quanto variano e altri
valori(in seguito ogni esperimento verrà descritto nel dettaglio).
Una volta compresa l'effettiva capacità del Kinect si passerà ad
effettuare altre sperimentazioni con variazioni della posizione
del Kinect, per poi terminare con l'ultimo esperimento che si
avvalerà di un soggetto fisico. Quest'ultimo esperimento sarà
molto rilevante per questo progetto dato che ci permetterà di
comprendere quanto possano modificare la precisione della
misurazione i movimenti involontari del corpo umano (come ad
esempio la respirazione) e quindi conoscere con precisione
l'errore presente nella misura e qual è la soglia di differenza
massima significativa tra una misura e l'altra.
Per ogni misurazione verranno presi 50 campioni di misura su
cui
effettuare
i
calcoli,
qui
di
seguito
verranno
approfonditamente descritti e commentati tutti i risultati.
Prove di distanza
Questa prima sperimentazione è servita sopratutto a capire
quanto errore c'è nella misurazione effettuata dal Kinect ma
sopratutto quanto la distanza dal sensore può influenzare la
misura.
64
Per visualizzare i dati ottenuti utilizzeremo delle tabelle la cui
lettura verrà esplicata ora.
Glossario delle tabelle
La
seguente
tabella
spiega
nel
dettaglio
come
vengono
classificati e calcolati i valori calcolati. Tutti i valori sono in mm.
Media
Con questo termine si indica il valore medio del
vettore delle differenze assolute.
Err. Max
Il valore massimo del vettore delle differenze
assolute
Err. Min
Il valore minimo del vettore delle differenze
assolute
Media 1
Il valore medio del primo vettore catturato
Media 2
Il valore medio del secondo vettore catturato
0 mm
Il numero di punti che non cambiano il proprio
valore di profondità tra uno scatto e l'altro
<2 mm
Il numero di punti che differiscono tra uno
scatto e l'altro di meno di 2 mm
<5 mm
Il numero di punti che differiscono tra uno
scatto e l'altro di meno di 5 mm
<10 mm
Il numero di punti che differiscono tra uno
scatto e l'altro di meno di 10 mm
%0
La percentuale dei punti che non cambiano il
proprio valore rispetto alla totalità dei punti.
%2
La percentuale dei punti che variano di meno di
2 millimetri rispetto alla totalità dei punti
65
%5
La percentuale dei punti che variano di meno di
5 millimetri rispetto alla totalità dei punti
% 10
La percentuale dei punti che variano di meno di
10 millimetri rispetto alla totalità dei punti
La prima prova
La prima prova che è stata effettuata è risultata terribilmente
fallimentare
con
dei
risultati
assolutamente
pessimi.
Inizialmente si è pensato che il Kinect avesse un margine di
errore altissimo ma la spiegazione è risultata molto più semplice
e ci ha permesso di capire qualcosa in più. La tabella seguente
non contiene tutti gli elementi spiegati nel glossario dato che è
stata una prima sperimentazione.
66
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Media
0
4
946
671
4
56
948
0
0
712
24
0
0
0
552
0
2
0
0
46
330
7
4
4
1
68
4
0
1372
4
213
669
4
1
684
4
758
0
957
336
3
952
2
1774
100
607
2
4
786
845
Err. Max Err. Min.
16
0
26
0
5380
0
4230
0
26
0
1690
0
1091
0
16
0
18
0
4208
0
1091
0
14
0
13
0
14
0
4202
0
14
0
997
0
20
0
17
0
4211
0
1030
0
1349
0
32
0
26
0
22
0
1014
0
27
0
20
0
5050
0
26
0
4205
0
4188
0
25
0
18
0
4194
0
22
0
4208
0
21
0
5349
0
1030
0
24
0
1085
0
28
0
7152
0
4208
0
4202
0
20
0
30
0
4208
0
1095
0
Media 1
999
998
84
468
999
964
72
1020
1021
406
1018
1021
1021
1021
522
1021
1021
1021
1021
978
692
1021
1020
1020
1022
956
1021
1022
2368
1020
835
520
1020
1021
418
1021
433
1022
65
688
1021
70
1021
2688
925
457
1021
1021
378
179
Media 2
999
999
999
999
1000
1000
1020
1021
1021
1021
1021
1021
1021
1021
1021
1021
1021
1021
1021
1022
1021
1021
1021
1021
1021
1022
1022
1022
1022
1022
1022
1022
1021
1022
1022
1022
1022
1022
1022
1022
1022
1022
1022
1022
1022
1022
1022
1022
1022
1022
0mm
243830
66608
16574
6202
65018
60802
11171
234635
229821
18590
78362
237965
235468
238817
59201
239615
219892
232696
233527
105698
152793
225260
68401
67892
211082
66344
68484
234145
19002
71223
46883
16664
75812
210846
19187
79004
11057
233405
7258
54599
92377
8412
122683
11565
70105
10972
137955
81749
10481
13004
<2mm
249574
75860
16574
6630
73537
69250
11199
237412
232327
18627
82512
240394
237968
241377
59233
242088
222196
235229
236155
110602
152805
227789
71476
71062
214148
69513
71738
236707
20960
74434
46900
16755
79467
214207
19214
82830
11124
236014
7258
54660
96022
8412
126324
11641
72747
11010
141856
85437
10526
13012
<5mm
306204
183624
20618
12557
181231
172502
18969
305001
300574
30227
210952
305328
305223
305397
80125
305560
292168
304712
305033
232255
200761
295228
176547
176673
301817
169883
179483
304952
51034
182808
117768
34104
189362
301533
30008
194710
19324
304785
12276
130817
212345
14808
240981
21813
169961
20529
254150
196428
17888
19800
Come è possibile vedere i valori risultano molto affetti da errore,
La misurazione presenta un valore medio della media degli
errori pari a 289 mm e una media degli errori massimi pari 1624
mm. Misure di questo tipo fanno pensare che il dispositivo non è
per nulla adatto al suo scopo il che è risultato strano dato che le
67
prove sperimentali effettuate con lo scanner hanno dato risultati
migliori.
L'effetto particolare che ha poi svelato il “mistero” è presente
nei valori successivi all'errore. Questa prova è stata effettuata
ad un metro di distanza dalla parete circa ma come è possibile
notare, mentre la media del secondo vettore appare avere un
andamento linearmente crescente (questo effetto verrà spiegato
nelle misurazioni successive) ma sempre con valori intorno ai
1000 mm, la media del primo vettore risulta avere di valori
completamente irrazionali.
Il seguente grafico permette di visualizzare bene la differenza
che è stata ottenuta tra i valori della media 1 e i valori della
Media 1
Media 2
media 2
3000
2500
2000
1500
1000
500
0
2
1
4
3
6
5
7
8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50
9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49
Come si evince dal grafico sembra che il secondo vettore riporti
ad ogni ripetizione della misurazione dei valori quasi sempre
68
costanti mentre il primo vettore sembra quasi impazzire ogni
volta che la misurazione viene ripetuta.
L'ipotesi più probabile, che verificheremo con le misurazioni
successive, è che il primo vettore potrebbe risultare errato forse
per una mancanza di totale sincronismo dei dispositivi ricevente
ed emittente all'accensione. Tutti i test successivi quindi
saranno effettuati scartando il primo scatto e utilizzando il
secondo e il terzo.
La seconda misurazione
Questa
misurazione
è
stata
effettuata
prendendo
in
considerazione tre distanze di riferimento, sempre di fronte ad
un muro. Le distanze sono all'incirca di 1m, 1,5m e di 2m.
L'obiettivo e capire quanto la distanza influenza gli errori di
misurazione dello strumento.
Illustreremo adesso tre tabelle differenti che seguono il glossario
presentato precedentemente.
69
1m:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Media
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Err. Max Err. Min.
13
0
13
0
14
0
15
0
17
0
16
0
20
0
13
3
13
0
13
0
13
0
13
0
16
0
19
0
13
0
16
0
13
0
16
0
13
0
13
0
13
0
13
0
19
0
19
0
16
0
23
0
16
0
19
0
16
0
16
0
16
0
16
0
16
0
19
0
13
0
16
0
13
0
13
0
13
0
16
0
16
0
19
0
16
0
16
0
16
0
16
0
16
0
13
0
15
0
16
0
Media 1
1001
1002
1002
1003
1003
1004
1004
1004
1004
1004
1005
1005
1005
1005
1004
1005
1005
1005
1005
1005
1005
1005
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
Media 2
1001
1002
1002
1003
1003
1004
1004
1004
1004
1004
1005
1005
1005
1005
1004
1005
1005
1005
1005
1005
1005
1005
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
1006
Err. 0
254604
254313
252479
255252
254020
255050
255955
256713
254579
256373
255956
258058
256238
256791
252504
257166
256731
254239
257449
254812
254266
255675
255876
253813
254411
255085
254868
254222
253908
253696
254372
253745
254071
253176
254325
253172
254928
252665
252307
253733
254357
253145
252776
252223
253605
252716
252481
252237
252613
252779
Err. 2
258795
258747
256971
259667
258334
259162
259885
260738
258923
260574
260059
262058
260186
260695
257259
260821
260839
258353
261454
259106
258821
259791
260022
258415
258854
259311
259315
258735
258449
258211
258769
258247
258587
258004
258924
257701
259679
257263
256952
258424
259082
257690
257567
257005
258595
257587
257282
257393
257457
257700
Err. 5
306631
306593
306532
306580
306446
306458
306312
306533
306360
306457
306620
306682
306558
306421
306504
306481
306544
306463
306538
306300
306148
306207
306268
306166
305978
305953
305915
305975
306032
306040
306019
305927
305840
305740
305883
305898
305987
305810
305738
305646
305665
305553
305768
305681
305750
305667
305850
305672
305834
305886
Err.10
307196
307186
307179
307179
307187
307193
307183
307195
307181
307177
307194
307197
307182
307181
307186
307173
307164
307192
307163
307181
307174
307185
307178
307160
307148
307137
307162
307141
307166
307141
307169
307177
307159
307163
307185
307166
307156
307180
307164
307171
307159
307118
307118
307103
307155
307170
307166
307181
307161
307161
%0
82,88
82,78
82,19
83,09
82,69
83,02
83,32
83,57
82,87
83,45
83,32
84
83,41
83,59
82,2
83,71
83,57
82,76
83,81
82,95
82,77
83,23
83,29
82,62
82,82
83,04
82,96
82,75
82,65
82,58
82,8
82,6
82,71
82,41
82,79
82,41
82,98
82,25
82,13
82,6
82,8
82,4
82,28
82,1
82,55
82,26
82,19
82,11
82,23
82,28
%2
84,24
84,23
83,65
84,53
84,09
84,36
84,6
84,88
84,28
84,82
84,65
85,31
84,7
84,86
83,74
84,9
84,91
84,1
85,11
84,34
84,25
84,57
84,64
84,12
84,26
84,41
84,41
84,22
84,13
84,05
84,23
84,06
84,18
83,99
84,29
83,89
84,53
83,74
83,64
84,12
84,34
83,88
83,84
83,66
84,18
83,85
83,75
83,79
83,81
83,89
%5
99,81
99,8
99,78
99,8
99,75
99,76
99,71
99,78
99,73
99,76
99,81
99,83
99,79
99,75
99,77
99,77
99,79
99,76
99,78
99,71
99,66
99,68
99,7
99,66
99,6
99,59
99,58
99,6
99,62
99,62
99,62
99,59
99,56
99,52
99,57
99,58
99,61
99,55
99,52
99,49
99,5
99,46
99,53
99,51
99,53
99,5
99,56
99,5
99,56
99,57
Questa tabella mostra degli ottimi risultati sperimentali, la
media dell'errore misurato è 0, questo vuol dire che la maggior
parte dei pixel non variano dalla loro posizione. Lo zero
ovviamente non è uno zero assoluto, non sono stati visualizzati
70
%10
100
100
99,99
99,99
100
100
99,99
100
99,99
99,99
100
100
99,99
99,99
100
99,99
99,99
100
99,99
99,99
99,99
100
99,99
99,99
99,98
99,98
99,99
99,98
99,99
99,98
99,99
99,99
99,99
99,99
100
99,99
99,99
99,99
99,99
99,99
99,99
99,97
99,97
99,97
99,99
99,99
99,99
99,99
99,99
99,99
valori al di sotto della virgola perché lo strumento ha una
sensibilità di 1 mm e non ha senso misurare l'errore oltre la sua
sensibilità.
Un altro risultato interessante da visualizzare è l'errore massimo
ottenuto che mediamente è di 15 centimetri questo sta a
indicare che dei pochi punti errati che abbiamo ottenuto
mediamente hanno un errore massimo di 1,5 cm.
Altri risultati molto interessanti sono le percentuali dei punti
errati sotto determinate misure, in particolare abbiamo che
mediamente:
•
l'82,82 % dei punti non variano posizione
•
l'84,26 % dei punti rimane sotto i 2mm di spostamento
•
il 99,65% sotto i 5mm
•
il 99,99% non supera i 10 mm
Questo fa comprendere che gli errori massimi ottenuti sono solo
una piccolissima parte (lo 0,01%) della totalità dei punti ottenuti.
In questa tabella comprare anche
uno strano fenomeno
verificatosi passando il tempo mentre si effettuavano le
misurazioni, i valori medi dei due vettori di riferimento
presentavano una crescita costante dal valore 1001 al valore
1006. Questa crescita cosi lineare e difficilmente spiegabile con
un errore di misurazione. La spiegazione razionale è data dal
fatto che il Kinect durante le misurazioni era appoggiato su un
supporto
di
poco
spessore
che
lasciava
cadere
il
cavo
all'indietro, il peso del cavo ha spostato il Kinect di pochi
71
millimetri all'indietro ma sufficienti a dare una piccola crescita
nelle misure. Per confutare questo fenomeno nelle successive
misurazioni il cavo è stato trattenuto lungo il bordo e difatti il
fenomeno non si è ripetuto, ciò ci permette di considerare il
fatto che questo dispositivo è capace di notare anche piccole
variazioni del suo stato fisico e darci un'idea delle grandi
potenzialità che possiede.
72
1,5 m:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Media
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
Err. Max Err. Min.
28
0
26
0
30
0
28
0
28
0
33
0
23
0
29
0
27
0
28
0
27
0
27
0
30
0
27
0
44
0
27
0
31
0
27
0
33
0
30
0
33
0
22
0
33
0
33
0
35
0
27
0
27
0
28
0
28
0
33
0
33
0
27
0
30
0
33
0
33
0
33
0
33
0
30
0
27
0
33
0
28
0
30
0
29
0
27
0
28
0
33
0
33
0
33
0
33
0
33
0
Media 1
1550
1550
1550
1550
1550
1550
1550
1551
1551
1551
1550
1551
1551
1551
1551
1551
1551
1550
1551
1551
1550
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1550
1550
1550
1550
1550
1550
1550
1550
1551
Media 2
1550
1550
1550
1550
1550
1551
1550
1551
1551
1551
1550
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1551
1550
1550
1550
1550
1550
1550
1550
1550
1551
Err. 0
253007
251819
252137
253044
251533
253142
252816
252539
252439
252169
252409
251879
253119
253635
252505
253004
253369
252562
252241
252601
252957
252237
253093
250446
251077
252213
253126
250712
252888
252480
252263
253105
252487
251968
251714
252709
252103
252728
252672
252478
250623
251987
251989
251442
252415
253053
252664
252172
252811
251733
Err. 2
253007
251819
252137
253044
251533
253142
252816
252539
252439
252169
252409
251879
253119
253635
252505
253004
253369
252562
252241
252601
252957
252237
253093
250446
251077
252213
253126
250712
252888
252480
252263
253105
252487
251968
251714
252709
252103
252728
252672
252478
250623
251987
251989
251442
252415
253053
252664
252172
252811
251733
Err. 5
253007
251819
252137
253044
251533
253142
252816
252539
252439
252169
252409
251879
253119
253635
252505
253004
253369
252562
252241
252601
252957
252237
253093
250446
251077
252213
253126
250712
252888
252480
252263
253105
252487
251968
251714
252709
252103
252728
252672
252478
250623
251987
251989
251442
252415
253053
252664
252172
252811
251733
Err.10
306333
306139
306040
306148
306060
306206
306262
306084
306216
306076
306133
306237
306202
306231
306165
306146
306118
306140
306073
306087
306017
306186
306002
306117
306047
306143
306288
306004
306117
305987
306153
306216
306082
306063
306131
305896
306044
306007
305902
306115
306040
306063
306090
305950
306107
306126
306172
305983
306074
306111
%0
82,36
81,97
82,08
82,37
81,88
82,4
82,3
82,21
82,17
82,09
82,16
81,99
82,4
82,56
82,2
82,36
82,48
82,21
82,11
82,23
82,34
82,11
82,39
81,53
81,73
82,1
82,4
81,61
82,32
82,19
82,12
82,39
82,19
82,02
81,94
82,26
82,06
82,27
82,25
82,19
81,58
82,03
82,03
81,85
82,17
82,37
82,25
82,09
82,3
81,94
%2
82,36
81,97
82,08
82,37
81,88
82,4
82,3
82,21
82,17
82,09
82,16
81,99
82,4
82,56
82,2
82,36
82,48
82,21
82,11
82,23
82,34
82,11
82,39
81,53
81,73
82,1
82,4
81,61
82,32
82,19
82,12
82,39
82,19
82,02
81,94
82,26
82,06
82,27
82,25
82,19
81,58
82,03
82,03
81,85
82,17
82,37
82,25
82,09
82,3
81,94
%5
82,36
81,97
82,08
82,37
81,88
82,4
82,3
82,21
82,17
82,09
82,16
81,99
82,4
82,56
82,2
82,36
82,48
82,21
82,11
82,23
82,34
82,11
82,39
81,53
81,73
82,1
82,4
81,61
82,32
82,19
82,12
82,39
82,19
82,02
81,94
82,26
82,06
82,27
82,25
82,19
81,58
82,03
82,03
81,85
82,17
82,37
82,25
82,09
82,3
81,94
Nella tabella delle misurazioni relative agli 1,5 metri abbiamo
altri risultati interessanti, innanzitutto il valore dell'errore medio
è pari ad 1mm, e ciò poteva essere da considerarsi normale
dato
l'aumento
della
distanza
dell'oggetto.
Un'altra
cosa
interessante è anche la crescita dell'errore massimo di ogni
73
%10
99,72
99,65
99,62
99,66
99,63
99,68
99,69
99,64
99,68
99,63
99,65
99,69
99,68
99,68
99,66
99,66
99,65
99,65
99,63
99,64
99,61
99,67
99,61
99,65
99,62
99,66
99,7
99,61
99,65
99,61
99,66
99,68
99,64
99,63
99,65
99,58
99,62
99,61
99,58
99,65
99,62
99,63
99,64
99,59
99,64
99,65
99,67
99,6
99,63
99,65
misurazione cresciuta sensibilmente che si aggira mediamente
al valore di 30 mm.
La cosa più interessata notata in questa misurazione però sono
le percentuali di pixel errati. Mediamente in dettaglio:
•
l'82,15 % dei punti non variano posizione
•
l'82,15 % dei punti rimane sotto i 2mm di spostamento
•
il 82,15% sotto i 5mm
•
il 99,64% non supera i 10 mm
Ciò ci dimostra che la percentuale di punti errati non aumenta
con la distanza (sembra rimanere stabile al ±18% ) ma che
aumenta l'errore dei punti che variano da uno scatto all'altro.
Altra cosa da notare è che una volta posizionato bene il cavo le
distanze medie dei due vettori di riferimento rimangono stabili
intorno al valore 1550.
2m:
Prima di mostrare i valori in tabella è preferibile effettuare delle
considerazioni su ciò che ci si potrebbe aspettare. Queste
considerazioni sono state fatte anche prima di effettuare la
misurazione e si sono rivelate veritiere. Una volta visualizzate le
prime due tabelle ciò che ci si aspetta è una crescita minima
dell'errore medio (intorno ai 2 o 3 mm), un aumento dell'errore
massimo raggiunto e, la cosa più importante, una costanza
nell'individuazione dei punti esatti che si spera rimanga intorno
all'80%. I risultanti hanno dato prova di ciò.
74
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Media
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
Err. Max Err. Min.
64
0
54
0
54
0
43
0
44
0
44
0
50
0
50
0
44
0
42
0
39
0
53
0
44
0
51
0
51
0
52
0
44
0
44
0
52
0
44
0
2127
0
44
0
2127
0
44
0
44
0
43
0
44
0
54
0
41
0
55
0
2127
0
53
0
52
0
54
0
55
0
45
0
44
0
55
0
50
0
50
0
44
0
55
0
44
0
44
0
50
0
44
0
52
0
44
0
44
0
44
0
Media 1
2014
2015
2014
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2014
2015
2015
2014
2015
2015
2015
Media 2
2014
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2015
2014
2015
2015
2015
2015
2015
2015
Err. 0
249859
248741
249272
249787
249241
250006
248653
250184
249352
250138
250187
248252
249422
248174
248599
249625
249520
248408
250238
249505
247930
249260
249387
249026
248605
248606
249113
248570
250151
250517
250162
248933
248825
249166
250111
248845
250801
250837
249371
249200
251394
251028
251177
251091
250176
250206
249601
250030
248616
250373
Err. 2
249859
248741
249272
249787
249241
250006
248653
250184
249352
250138
250187
248252
249422
248174
248599
249625
249520
248408
250238
249505
247930
249260
249387
249026
248605
248606
249113
248570
250151
250517
250162
248933
248825
249166
250111
248845
250801
250837
249371
249200
251394
251028
251177
251091
250176
250206
249601
250030
248616
250373
Err. 5
249859
248741
249272
249787
249241
250006
248653
250184
249352
250138
250187
248252
249422
248174
248599
249625
249520
248408
250238
249505
247930
249260
249387
249026
248605
248606
249113
248570
250151
250517
250162
248933
248825
249166
250111
248845
250801
250837
249371
249200
251394
251028
251177
251091
250176
250206
249601
250030
248616
250373
Err.10
250858
249638
250256
250935
250298
251049
249639
251175
250434
251192
251116
249431
250468
249278
249688
250775
250467
249442
251289
250391
248958
250261
250480
250119
249559
249609
250242
249672
251169
251453
251053
249977
249965
250276
251074
249840
251890
251799
250504
250165
252492
252052
252172
252137
251221
251220
250711
251116
249738
251421
%0
81,33
80,97
81,14
81,31
81,13
81,38
80,94
81,44
81,17
81,43
81,44
80,81
81,19
80,79
80,92
81,26
81,22
80,86
81,46
81,22
80,71
81,14
81,18
81,06
80,93
80,93
81,09
80,91
81,43
81,55
81,43
81,03
81
81,11
81,42
81
81,64
81,65
81,18
81,12
81,83
81,71
81,76
81,74
81,44
81,45
81,25
81,39
80,93
81,5
%2
81,33
80,97
81,14
81,31
81,13
81,38
80,94
81,44
81,17
81,43
81,44
80,81
81,19
80,79
80,92
81,26
81,22
80,86
81,46
81,22
80,71
81,14
81,18
81,06
80,93
80,93
81,09
80,91
81,43
81,55
81,43
81,03
81
81,11
81,42
81
81,64
81,65
81,18
81,12
81,83
81,71
81,76
81,74
81,44
81,45
81,25
81,39
80,93
81,5
%5
81,33
80,97
81,14
81,31
81,13
81,38
80,94
81,44
81,17
81,43
81,44
80,81
81,19
80,79
80,92
81,26
81,22
80,86
81,46
81,22
80,71
81,14
81,18
81,06
80,93
80,93
81,09
80,91
81,43
81,55
81,43
81,03
81
81,11
81,42
81
81,64
81,65
81,18
81,12
81,83
81,71
81,76
81,74
81,44
81,45
81,25
81,39
80,93
81,5
Come è possibile vedere la media rimane costantemente a 2
mm e l'errore massimo è aumentato. Riguardo all'errore
massimo
c'è
da
considerare
la
presenza
di
tre
valori
particolarmente grandi tutti e tre uguali a 2127 mm che sono
comparsi in via del tutto eccezionale e che hanno sbalzato la
media dell'errore massimo a 173 mm. Quest'ultimo valore può
75
%10
81,66
81,26
81,46
81,68
81,48
81,72
81,26
81,76
81,52
81,77
81,74
81,19
81,53
81,15
81,28
81,63
81,53
81,2
81,8
81,51
81,04
81,47
81,54
81,42
81,24
81,25
81,46
81,27
81,76
81,85
81,72
81,37
81,37
81,47
81,73
81,33
82
81,97
81,54
81,43
82,19
82,05
82,09
82,08
81,78
81,78
81,61
81,74
81,29
81,84
non essere preso in considerazione dato che nelle restanti
misurazioni l'errore si aggira intorno ai 50 mm e anche nelle file
dove questo errore enorme è presente gli altri risultati non
vengono influenzati (come ad esempio quello dei valori medi dei
vettori 1 e 2) quindi è facile pensare che sia un caso isolato a
una manciata di punti se non addirittura al singolo. L'ipotesi più
probabile è che un po' di sporco o addirittura qualche
scheggiatura della lente o l'usura dello strumento a causa dei
continui maneggiamenti possa aver modificato qualcosa
che
raramente riporta risultati assurdi dato il fatto che anche
durante le sperimentazioni successive questi valori esagerati
sono ricomparsi. Ciò ci può dare l'idea dell'estrema fragilità dello
strumento e della continua cura di cui necessita.
Un risultato atteso e rassicurante invece è quello relativo alle
percentuali d'errore che sono rimaste sempre intorno all'80%,
esattamente il valore medio dei punti esatti è di 81,24%, questo
valore non cambia fino ai 10mm che risulta di 81,58%. Ciò ci
indica con chiarezza che all'aumentare della distanza non
aumentano i punti errati ma bensì solo l'errore relativo ai punti
errati.
Il seguente grafico permette di vedere come cresce l'errore
massimo
a
visualizzazione
seconda
i
valori
normalizzati a 100).
della
distanza
anomali
a
2127
Err. Max 1m
Err. Max 1,5m
Err. Max 2m
76
(per
migliorare
mm
sono
la
stati
120
100
80
60
40
20
0
2
1
4
3
6
5
8
7
9
10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50
11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49
Considerazioni sui primi test
I primi test effettuati evidenziano una gran precisione di calcolo
del Kinect riguardo alla profondità. Ovviamente non sono
prestazioni elevate come quelle di un dispositivo al laser a
tempo di volo ma rappresenta un'ottima alternativa economica
a strumenti largamente più costosi. Ovviamente questi non sono
test definitivi ma ci permettono di affermare molte cose.
Innanzitutto possiamo dire che il dispositivo individua con
precisione millimetrica circa l'80% dei punti individuati, ciò è di
notevole considerazioni nel momento in cui si vuole sviluppare
uno scanner 3D di oggetti.
Un'altra considerazione molto importante che si può affermare è
che il raggio d'azione ottimale del dispositivo è compreso tra i
77
50 cm (sotto di questo valore il Kinect non riconosce più la
profondità e la setta automaticamente a zero) e 1,5 metri.
Questo valore risulta ottimale ai fini di questo progetto dato che
in questo raggio d'azione si può effettuare perfettamente e con
precisione la scansione di un busto umano.
Prove di posizione
Dopo le prove di distanza sono state effettuate delle prove
differenti per vedere come rispondeva il Kinect ad una posizione
differente da quella piana e ad una vista parziale dell'immagine
catturata. La prima prova che è stata effettuata durante questa
sperimentazione è avvenuta tenendo il Kinect in posizione
diagonale rispetto al piano di lavoro, la seconda invece è
avvenuta alla stessa maniera della prima (ovvero puntandolo
dritto contro un muro a 1m di distanza) però considerando solo
la porzione centrale dell'inquadratura evitando il contorno.
Kinect inclinato
Questa sperimentazione è avvenuta con l'obiettivo di controllare
se il Kinect modifica le sue prestazioni nel caso di una
inclinazione dello stesso (quindi non poggiando perfettamente a
terra), purtroppo per ottenere questa inclinazione il Kinect è
stato posto in maniera piuttosto strana tale da modificare
spesso il suo stato di equilibrio dato che posava solamente sullo
spigolo posteriore della base e il filo era incurvato creando una
specie di molla.
78
Nel caso di questo test c'è da considerare il fatto che, mentre la
distanza della parte bassa dell'inquadratura è all'incirca di un
metro, nella parte alta aumenta data l'inclinazione, da ciò
possiamo aspettarci risultati tra l'1 metro e il metro e mezzo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Media
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Err. Max Err. Min.
30
0
24
0
37
0
0
0
31
0
953
0
36
0
31
0
31
0
31
0
1603
0
29
0
1641
0
38
0
29
0
1611
0
37
0
30
0
23
0
30
0
69
0
36
0
43
0
1649
0
1665
0
31
0
29
0
31
0
31
0
36
0
30
0
46
0
1665
0
33
0
31
0
47
0
34
0
31
0
31
0
38
0
31
0
32
0
31
0
30
0
30
0
34
0
37
0
37
0
37
0
44
0
Media 1
1212
1215
1214
1217
1215
1216
1216
1217
1218
1218
1218
1219
1221
1220
1220
1221
1221
1222
1222
1223
1225
1223
1223
1224
1226
1227
1225
1225
1225
1226
1226
1226
1226
1227
1227
1227
1228
1228
1228
1228
1229
1231
1229
1230
1230
1230
1230
1231
1231
1231
Media 2
1212
1215
1214
1217
1215
1216
1217
1217
1218
1218
1219
1219
1222
1220
1220
1221
1221
1222
1222
1223
1225
1224
1224
1224
1226
1227
1225
1225
1225
1226
1226
1226
1227
1227
1227
1227
1228
1228
1228
1228
1229
1231
1229
1230
1230
1230
1230
1231
1231
1231
Err. 0
252024
251902
251512
307200
250426
250657
251482
249745
251439
251179
251853
253871
252302
253469
253793
251961
253235
253346
252841
247491
253198
254282
252850
252621
252761
252151
252780
252076
253387
251890
252743
252461
253990
252649
251269
251894
251560
250983
250526
252485
249745
250749
249882
250174
251112
249739
249722
250476
250158
249051
79
Err. 2
253856
253732
253520
307200
252306
252491
253437
251696
253449
253213
253884
255787
254064
255178
255471
253723
255068
255142
254637
249298
254835
255944
254536
254309
254404
253819
254416
253759
255098
253540
254337
254142
255645
254282
252937
253615
253230
252585
252124
253977
251401
252260
251557
251747
252847
251392
251484
252048
251774
250852
Err. 5
292208
291997
292233
307200
291312
291451
291716
290866
291366
291037
291256
291919
290959
291350
291698
291041
291031
291487
291176
289176
290666
290970
290806
290590
290214
290351
290350
290597
290118
290289
290486
290295
290571
290214
289653
290248
289755
289263
288751
290157
288370
288913
288806
288491
288800
288184
288712
288818
288361
288320
Err.10
307000
307013
307061
307200
307001
306969
306901
306945
306922
306914
306917
307028
306956
306998
306964
306899
306922
306912
306954
306835
306782
306811
306863
306839
306683
306764
306785
306663
306683
306701
306525
306737
306724
306642
306536
306558
306469
306397
306430
306677
306424
306433
306389
306266
306193
306200
306199
306502
306142
306194
%0
82,04
82
81,87
100
81,52
81,59
81,86
81,3
81,85
81,76
81,98
82,64
82,13
82,51
82,61
82,02
82,43
82,47
82,31
80,56
82,42
82,77
82,31
82,23
82,28
82,08
82,29
82,06
82,48
82
82,27
82,18
82,68
82,24
81,79
82
81,89
81,7
81,55
82,19
81,3
81,62
81,34
81,44
81,74
81,3
81,29
81,54
81,43
81,07
%2
82,64
82,6
82,53
100
82,13
82,19
82,5
81,93
82,5
82,43
82,64
83,26
82,7
83,07
83,16
82,59
83,03
83,05
82,89
81,15
82,95
83,32
82,86
82,78
82,81
82,62
82,82
82,6
83,04
82,53
82,79
82,73
83,22
82,77
82,34
82,56
82,43
82,22
82,07
82,67
81,84
82,12
81,89
81,95
82,31
81,83
81,86
82,05
81,96
81,66
%5
95,12
95,05
95,13
100
94,83
94,87
94,96
94,68
94,85
94,74
94,81
95,03
94,71
94,84
94,95
94,74
94,74
94,89
94,78
94,13
94,62
94,72
94,66
94,59
94,47
94,52
94,51
94,6
94,44
94,5
94,56
94,5
94,59
94,47
94,29
94,48
94,32
94,16
93,99
94,45
93,87
94,05
94,01
93,91
94,01
93,81
93,98
94,02
93,87
93,85
%10
99,93
99,94
99,95
100
99,94
99,92
99,9
99,92
99,91
99,91
99,91
99,94
99,92
99,93
99,92
99,9
99,91
99,91
99,92
99,88
99,86
99,87
99,89
99,88
99,83
99,86
99,86
99,83
99,83
99,84
99,78
99,85
99,85
99,82
99,78
99,79
99,76
99,74
99,75
99,83
99,75
99,75
99,74
99,7
99,67
99,67
99,67
99,77
99,66
99,67
Come è possibile notare, il comportamento pronosticato si è
verificato. La distanza media dei due vettori va da un minimo di
1212 ad un massimo di 1231 mm, ciò è dovuto alla posizione
“scomoda del sensore” che a causa del rilassamento della corda
a di poco modificato il suo stato fisico. Altri valori interessanti si
rivelano nella percentuale di pixel esatti che rimane sempre
intorno all'80% ( per la precisione è uguale mediamente all'82,3
% ).
Risultato non piacevole è dato dalla presenza ancora di valori
terribilmente grandi nella colonna dell'errore massimo, l'ipotesi
di possibili macchie o malfunzionamenti è sempre valida, ma il
risultato ottenuto non modifica in maniera sensibile i valori delle
medie o delle percentuali, escludendo i valori estremamente alti
il valor medio della differenza massima risulta all'incirca di 37
mm, un valore molto più simile alla sperimentazione su 1,5m
che non a quella di 1m.
Un ottimo risultato è stato ottenuto invece nella media
dell'errore che risulta essere sempre pari a 0( come nel caso
della sperimentazione ad 1 m ).
Dopo questa sperimentazione possiamo considerare che il
Kinect mantiene le sue prestazioni anche se non perfettamente
parallelo al suolo.
Inquadratura ristretta
Per effettuare questa sperimentazione si è utilizzato lo stesso
software utilizzato in precedenza per effettuare i calcoli, l'unica
differenza
sta
nell'aver
escluso
80
dall'analisi
i
valori
che
compongono il contorno dell'immagine, per l'esattezza sono
stati tolti 40 pixel per margine (destra, sinistra, sopra e sotto).
La speranza è di ottenere risultati migliori rispetto all'immagine
intera, ovvero si vuole verificare se la concentrazione dell'errore
è disposta uniformemente su tutta l'immagine o si dispone per
lo più sulle zone periferiche. La misurazione è stata effettuata ad
un metro di distanza.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Media
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Err. Max Err. Min.
15
0
15
0
15
0
15
0
15
0
15
0
15
0
15
0
18
0
15
0
15
0
15
0
15
0
22
0
18
0
18
0
25
0
15
0
21
0
29
0
18
0
21
0
18
0
18
0
18
0
25
0
18
0
18
0
18
0
25
0
25
0
33
0
29
0
18
0
18
0
21
0
18
0
15
0
18
0
15
0
33
0
18
0
18
0
33
0
32
0
21
0
21
0
18
0
18
0
21
0
Media 1
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
Media 2
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
1080
Err. 0
186043
186341
185999
185481
185343
185544
185555
187119
185092
185873
185848
186628
185354
184453
185257
185759
183442
184780
184121
184136
185787
185922
185081
184104
185902
184273
185322
186101
185975
184235
183297
184510
183926
185710
185148
186451
185285
186678
187640
185560
185901
185894
185549
187052
185732
185605
185749
186435
186637
185990
81
Err. 2
186043
186341
185999
185481
185343
185544
185555
187119
185092
185873
185848
186628
185354
184453
185257
185759
183442
184780
184121
184136
185787
185922
185081
184104
185902
184273
185322
186101
185975
184235
183297
184510
183926
185710
185148
186451
185285
186678
187640
185560
185901
185894
185549
187052
185732
185605
185749
186435
186637
185990
Err. 5
225019
225157
225121
225036
224929
225096
225189
225279
225124
225029
224919
224822
224962
225023
224893
224889
224701
224772
224871
224673
224862
224593
224563
224669
224769
224842
225125
224763
225046
224877
224860
224976
224728
224889
224929
224870
225032
224917
225146
224994
225088
225043
225008
224981
224949
224807
224952
224889
224713
224868
Err.10
225533
225694
225774
225743
225709
225774
225778
225822
225738
225716
225684
225567
225654
225666
225693
225662
225575
225563
225690
225533
225603
225521
225451
225607
225613
225637
225733
225578
225688
225675
225573
225694
225592
225694
225688
225626
225737
225621
225632
225711
225703
225665
225653
225740
225680
225616
225587
225638
225597
225676
%0
82,35
82,48
82,33
82,1
82,04
82,13
82,13
82,82
81,93
82,27
82,26
82,61
82,04
81,64
82
82,22
81,2
81,79
81,5
81,5
82,23
82,29
81,92
81,49
82,29
81,56
82,03
82,37
82,32
81,55
81,13
81,67
81,41
82,2
81,95
82,53
82,01
82,63
83,05
82,13
82,28
82,28
82,13
82,79
82,21
82,15
82,22
82,52
82,61
82,32
%2
82,35
82,48
82,33
82,1
82,04
82,13
82,13
82,82
81,93
82,27
82,26
82,61
82,04
81,64
82
82,22
99,46
81,79
81,5
81,5
82,23
82,29
81,92
81,49
82,29
81,56
82,03
82,37
82,32
81,55
81,13
81,67
81,41
82,2
81,95
82,53
82,01
82,63
83,05
82,13
82,28
82,28
82,13
82,79
82,21
82,15
82,22
82,52
82,61
82,32
%5
99,6
99,66
99,64
99,61
99,56
99,63
99,67
99,71
99,65
99,6
99,56
99,51
99,57
99,6
99,54
99,54
99,85
99,49
99,53
99,45
99,53
99,41
99,4
99,44
99,49
99,52
99,65
99,49
99,61
99,54
99,53
99,58
99,47
99,54
99,56
99,53
99,61
99,55
99,66
99,59
99,63
99,61
99,59
99,58
99,57
99,51
99,57
99,54
99,46
99,53
%10
99,83
99,9
99,93
99,92
99,9
99,93
99,94
99,95
99,92
99,91
99,89
99,84
99,88
99,89
99,9
99,88
99,85
99,84
99,9
99,83
99,86
99,82
99,79
99,86
99,86
99,87
99,92
99,85
99,9
99,89
99,84
99,9
99,85
99,9
99,9
99,87
99,92
99,87
99,87
99,91
99,9
99,89
99,88
99,92
99,89
99,86
99,85
99,87
99,86
99,89
I risultati ottenuti non hanno corrisposto le speranze ma almeno
permettono
di
affermare
che
l'errore
è
distribuito
uniformemente su quasi tutta l'immagine dato che i valori medi
continuano a restituire un 82 % circa di pixel errati. I valori
analizzati
(come
c'era
da
aspettarsi)
sono
perfettamente
comparabili con la misurazione effettuata ad un metro di
distanza dalla parete e a schermo pieno.
Immagini di errore
I dati a nostra disposizione si sono rivelati molto chiari ma, dato
che, in caso di errore molto alto la percentuale dei punti è molto
piccola e non si può notare la differenza di disposizione (se al
centro o ai bordi) a causa dell'alta percentuale di correttezza, si
è deciso di inserire all'interno di questo capitolo delle immagini
prese con lo scanner che mostrano bene la distribuzione
dell'errore nell'area selezionata.
Innanzitutto verrà mostrata un'immagine completa, in seguito
verranno mostrate le immagini con i vari errori messi in
evidenza.
Questa prima immagine mostra la scansione effettuata sulla
parete, come si può vedere la superficie non sembra essere
perfettamente piana ma appare leggermente frastagliata, ciò è
dovuto a quel 18% circa di pixel errati.
82
L'immagine seguente mostrerà lo stesso muro fotografato con lo
scanner a cui però sono stati tolti i pixel che differiscono di
qualche mm.
83
Come si può notare la distribuzione di pixel errati (i buchi neri
per intenderci) è da considerarsi uniforme su quasi tutta
l'immagine.
Le prossime immagini saranno ricavate in maniera diversa,
verranno visualizzati, invece dei pixel esatti, solo quelli sbagliati
dato che la visualizzazione risulterebbe molto difficoltosa al
contrario.
La prossima immagine mette in evidenza solo i pixel che variano
la loro posizione di 3mm.
Una cosa particolare che si può notare visivamente ma non
numericamente è che la concentrazione di errore elevato si
dispone
molto
più
sugli
spigoli
84
che
non
nel
centro.
Numericamente
era
quasi
impossibile
da
notare
data
la
piccolissima quantità di errori.
L'ultima immagine che mostreremo sarà quella relativa ai pixel
che differiscono di oltre 5 mm.
L'immagine è quasi totalmente nera e ciò era prevedibile dati i
risultati numerici ottenuti, anche in questo caso l'errore si
dispone sugli angoli ed anche in questo caso era impossibile da
notare con l'analisi della percentuale.
Queste
immagini
ci
permettono
di
considerare
che
effettivamente i punti che superano i 5 mm di errore sono poco
più di una manciata.
85
Ultime Prove, busto umano
I risultati delle prove precedenti hanno dato un buon esito e
hanno dimostrato che il Kinect può essere utilizzato per
prendere misure con un margine di errore molto basso.
Ciò che manca ora è la misurazione diretta su di un corpo
umano per controllare se e quanto i movimenti involontari del
corpo possono influenzare le misure. Queste sperimentazioni
saranno utilizzate anche per conoscere l'intervallo di differenza
minimo, tale intervallo può essere considerato un cambiamento
notevole tra una scansione e l'altra e ignorare tutte le altre
differenze.
I primi risultati
Si è provato ad utilizzare lo stesso software di calcolo impiegato
per le sperimentazioni precedenti ma, come era stato sospettato
in precedenza, tale software non risulta essere adatto a
prendere tali informazioni. I valori dell'errore medio venivano
modificati pesantemente dalla presenza di una persona tra il
Kinect e lo sfondo ed in particolare i valori dell'errore massimo
risultavano essere identici alla distanza in cui veniva posizionata
la persona.
Questi errori non sono dovuti a qualche malfunzionamento o alla
scarsità di prestazione del Kinect, bensì tali errori hanno una
soluzione semplice (ipotizzata anche in precedenza) che può
essere spiegata osservando prima una foto.
86
Come è possibile notare dalla foto, sul bordo sinistro del corpo
compare una specie di spessore nero, ciò è dovuto alla distanza
tra l'emettitore di infrarossi e il ricevitore. Questo bordo nero
può essere tranquillamente ignorato ai fini del nostro progetto
perché non va a modificare le fattezze del corpo e quindi
l'oggetto da scansionare ma va a influenzare di molto le misure,
la barra nera è una barra di valori pari a zero, nel momento in
cui si effettueranno i due scatti e verrà eseguita la differenza la
minima modifica della posizione del corpo comporterà uno
spostamento della barra nera ponendo nel vettore di differenza
errori pari alla distanza del corpo o peggio dello sfondo.
87
Provando ad eliminare lo sfondo dal calcolo rimane sempre il
valore di distanza del corpo.
Sperimentazione alternativa
Per poter effettuare i test sul corpo si è dovuti ricorrere ad un
software di calcolo leggermente differente. Il principio è sempre
lo stesso, prendere due foto e calcolare le differenza tra la prima
e la seconda, il cambiamento sta nel come vengono prese le due
foto. Per ovviare alla questione della barra nera si è deciso per
prima cosa di impostare tutti i valori dello sfondo al valore zero,
ciò lo si è potuto fare filtrando tutto ciò che si trova oltre una
certa distanza massima e sostituirgli il valore, dopo aver fatto
ciò il soggetto che si sottoporrà alla sperimentazione dovrà
posizionarsi in maniera tale che il suo corpo si trovi all'incirca a
quella distanza in modo tale che idealmente solo metà corpo
possa essere posizionato, infine i valori di
distanza
dovranno
essere
sottratti
alla
distanza massima in modo da avere il valore
effettivo di separazione del corpo.
Questa immagine permette di comprendere
meglio questo tipo di sperimentazione: la linea
rossa rappresenta il la zona oltre la quale tutti
i valori vengono imposti a zero, i valori che il
software andrà a catturare saranno intesi
come lo spazio in cui il corpo si “sporge” oltre
la linea e sono calcolati sottraendo alla
distanza del piano di distanza massimo dal
88
sensore, la distanza di ogni punto del corpo dal sensore.
Ovviamente
la
situazione
prevista
dall'immagine
è
una
situazione ottima per fare delle misurazioni dato che le zone del
corpo
che
si
trovano
sul
piano
della
distanza
massima
dovrebbero dare un valore pari a zero. Le aspettative però non
sono cosi ottimistiche dato che le misurazioni sono durate
all'incirca 30 minuti e il soggetto che ha subito tali misurazioni
non ha potuto mantenere sempre la stessa posizione ottima.
Per rendere rilevanti le misurazioni, le due foto sono state prese
a distanza di 5 secondi l'una dall'altra, ovvero il tempo che
intercorre tra un'inspirazione e un'espirazione completa.
89
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Media
1
5
0
0
0
0
1
0
0
4
0
0
2
1
2
0
0
0
3
1
0
3
1
3
1
3
4
2
0
0
5
11
0
0
0
0
0
1
2
0
0
0
4
1
0
1
1
4
0
4
Err. Max Err. Min.
113
0
135
0
82
0
0
0
0
0
0
0
120
0
0
0
135
0
172
0
118
0
0
0
115
0
130
0
174
0
0
0
0
0
0
0
189
0
95
0
0
0
132
0
128
0
492
0
154
0
170
0
115
0
135
0
156
0
0
0
170
0
187
0
0
0
0
0
0
0
0
0
0
0
110
0
125
0
0
0
0
0
0
0
128
0
180
0
0
0
210
0
163
0
195
0
0
0
185
0
Media 1
29
21
16
30
30
32
20
30
31
33
28
31
29
28
38
36
26
37
44
27
30
16
20
19
29
35
37
40
30
40
32
40
30
36
35
32
34
28
38
40
27
40
41
60
43
41
33
41
41
41
Media 2
28
26
16
30
30
32
22
30
32
37
28
31
31
30
39
36
26
37
47
27
30
14
21
22
30
38
41
42
31
40
37
50
30
36
35
32
34
29
36
40
27
40
45
59
43
42
33
45
41
45
Err. 0
238883
203015
247469
307200
307200
307200
227055
307200
228835
186387
240516
307200
204385
213307
204832
307200
307200
307200
184059
225439
307200
221142
225487
208211
225178
186635
183105
198675
241969
307200
186626
177715
307200
307200
307200
307200
307200
205424
192585
307200
307200
307200
180649
214295
307200
219793
227593
182988
307200
182231
Err. 2
254328
203080
255410
307200
307200
307200
232932
307200
249938
186531
255820
307200
211337
228440
226595
307200
307200
307200
194791
240108
307200
222046
237310
208557
240121
189613
183638
215169
254887
307200
186737
177732
307200
307200
307200
307200
307200
218619
203824
307200
307200
307200
181759
254335
307200
244901
245648
183899
307200
182872
Err. 5
292209
206266
298617
307200
307200
307200
267935
307200
298914
189130
295732
307200
258298
279741
276073
307200
307200
307200
231752
285573
307200
234443
282073
220372
285853
216679
192719
256274
295581
307200
189072
177953
307200
307200
307200
307200
307200
269327
253628
307200
307200
307200
195021
297484
307200
290287
290121
195498
307200
190553
Err.10
304654
223153
306452
307200
307200
307200
302499
307200
306117
219468
304686
307200
299922
304548
299809
307200
307200
307200
283437
304677
307200
259087
305158
273474
302428
279722
264796
292544
305966
307200
213988
179121
307200
307200
307200
307200
307200
304419
298761
307200
307200
307200
255531
303934
307200
304602
303036
270579
307200
255132
%0
77,76
66,09
80,56
100
100
100
73,91
100
74,49
60,67
78,29
100
66,53
69,44
66,68
100
100
100
59,92
73,39
100
71,99
73,4
67,78
73,3
60,75
59,6
64,67
78,77
100
60,75
57,85
100
100
100
100
100
66,87
62,69
100
100
100
58,81
69,76
100
71,55
74,09
59,57
100
59,32
%2
82,79
66,11
83,14
100
100
100
75,82
100
81,36
60,72
83,27
100
68,79
74,36
73,76
100
100
100
63,41
78,16
100
72,28
77,25
67,89
78,16
61,72
59,78
70,04
82,97
100
60,79
57,86
100
100
100
100
100
71,17
66,35
100
100
100
59,17
82,79
100
79,72
79,96
59,86
100
59,53
%5
95,12
67,14
97,21
100
100
100
87,22
100
97,3
61,57
96,27
100
84,08
91,06
89,87
100
100
100
75,44
92,96
100
76,32
91,82
71,74
93,05
70,53
62,73
83,42
96,22
100
61,55
57,93
100
100
100
100
100
87,67
82,56
100
100
100
63,48
96,84
100
94,49
94,44
63,64
100
62,03
%10
99,17
72,64
99,76
100
100
100
98,47
100
99,65
71,44
99,18
100
97,63
99,14
97,59
100
100
100
92,26
99,18
100
84,34
99,34
89,02
98,45
91,06
86,2
95,23
99,6
100
69,66
58,31
100
100
100
100
100
99,09
97,25
100
100
100
83,18
98,94
100
99,15
98,64
88,08
100
83,05
I valori ottenuti sembrano avere un carattere molto aleatorio, a
differenza delle precedenti misurazioni in cui i valori rimanevano
più o meno costanti in questo caso i valori variano da condizioni
di assoluta perfezione a condizioni di grave errore.
I valor medi in questo caso variano in continuazione ed hanno
una media di 1,42, in questo caso però andiamo a considerare
sopratutto la deviazione standard che, a differenza delle prime
90
misurazioni, ha un valore rilevante, nel caso della media dei
valori il valore di deviazione è pari a 2,08.
Altri valori interessanti presi in questo tipo di sperimentazione
sono i valori delle percentuali di errore che, come nel caso della
media, hanno valori di varianza elevati.
Riguardo ai valori medi si ha:
•
%=0: 80,78
•
%>2: 82,78
•
%>5: 88,91
•
%>10: 94,89
Questi valori sono prevedibilmente leggermente più bassi delle
prime sperimentazioni dato il corpo della persona inserito nella
misura, ma rimangono comunque valori comparabili a quelli
ottenuti, il vero problema che si rivela in questo caso è la
presenza di deviazioni standard non trascurabili.
Per la precisione tali valori di deviazioni sono:
•
%=0: 16,72
•
%>2: 15,75
•
%>5: 14,01
•
%>10: 9,46
quindi decisamente valori non trascurabili.
91
Foto di differenza
I valori ottenuti precedentemente non danno la certezza di
quanto possa essere accurata la misura sul corpo data la
presenza
di
misure
“strane”.
Alcune
misure
risultano
assolutamente perfette mentre altre paiono essere afflitte da un
errore enorme, tutto ciò può far pensare ad un bug del software
di misurazione che sballa i valori ottenuti.
Per ottenere un valore rilevante nei valori di differenza si è
optato
per
un
metodo
più
“euristico”
che
si
basa
sull'osservazione visiva della foto ottenuta dal vettore di
differenza filtrando i punti da disegnare a seconda del valore per
l'appunto della differenza.
Per scattare queste foto il soggetto è stato posto con la schiena
appoggiata al muro e il Kinect di fronte. Sono state scattate una
serie di foto la cui differenza veniva mostrata filtrando i punti
con valori maggiori o minori di una certa soglia.
La prima foto mostrerà tutti i punti aventi errore minore di 3
mm:
92
I punti neri sono tutti quei punti che hanno una differenza
maggiore o uguale a 3 mm, come è possibile notare si
concentrano sopratutto nella zona del torace (probabilmente
dovuto alla respirazione), comunque è un ottimo risultato poter
notare la maggior parte dei punti al di sotto dei 3 mm di errore.
La prossima foto mostra i valori al di sotto dei 5 mm quindi i
punti delle differenze compreso tra 0 e 4:
93
Questa foto ci mostra come già a 5 mm gli errori possono essere
considerati trascurabili e da questa immagine in poi si passerà
non più a visualizzare i punti oltre un certo valore di soglia e non
più quelli minori.
Oltre i 5 mm:
94
Oltre i 10mm:
95
Oltre i 20 mm:
Le tre immagini mostrate dimostrano come una piccolissima
parte dei punti analizzati è affetto da errore e come era stato
ipotizzato, e come è visibile, l'errore si riferisce sopratutto hai
punti relativi al contorno della figura.
L'ultimo test
Presa visione delle foto mostrate precedentemente è stato
deciso di effettuare un ultimo test utilizzando lo stesso software
usato per i test di fronte al muro. In questa serie di misurazioni
però utilizzeremo solo le informazioni relative alla percentuale di
punti errati dato che tutte gli altri dati risulteranno sbagliati a
causa delle condizioni al contorno viste in precedenza.
Le ipotesi che sono state fatte pre-test ipotizzano un aumento
abbastanza
alto
dell'errore
di
96
piccole
dimensioni
ma
si
auspicano comunque buone prestazioni entro i 10 mm. La
possibilità che si possano avere valori poco stabili è alta visto il
test effettuato precedentemente sempre sul corpo umano
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Err. 0
197815
233288
229517
233663
307200
237232
69890
235364
232962
81062
233274
73025
74950
232805
228248
232504
232907
233972
231666
229546
232697
232090
176667
237330
234357
232353
232033
234483
236451
230176
234718
235580
227930
232480
232271
233978
233631
210377
235496
232749
206807
232339
128504
171905
207549
207264
204070
210070
207420
209330
Err. 2
197815
233288
229517
233663
307200
237232
69975
235417
233013
81062
233274
73025
74950
232805
228362
233043
233478
234482
232101
230124
233112
232471
176956
237569
234568
232599
232290
234686
236649
230269
235163
235993
227930
232668
232398
234167
233774
210531
235621
232927
206807
232426
128677
172578
207902
207601
204505
210520
207733
209696
Err. 5
292915
302500
301283
301993
307200
303306
187548
302978
302715
205949
302651
189859
189489
301829
300266
302284
301967
302330
301857
301142
302417
301445
285757
303210
302590
302211
302061
302780
302727
301305
302220
302655
300458
301907
301703
301946
301628
299474
302377
302255
299036
301717
245891
277111
298998
299368
298660
299603
299279
299785
Err.10
301546
305343
305137
305205
307200
305737
261224
305483
305470
272217
305481
261542
261262
305104
304722
305472
304978
305187
304972
304889
305389
305089
303185
305602
305279
305400
305277
305490
305432
304793
305057
305431
305009
305119
304878
304996
304797
304665
305192
305185
304611
304931
282833
296678
304361
304745
304539
304434
304491
304651
97
%0
64,39
75,94
74,71
76,06
100
77,22
22,75
76,62
75,83
26,39
75,94
23,77
24,4
75,78
74,3
75,68
75,82
76,16
75,41
74,72
75,75
75,55
57,51
77,26
76,29
75,64
75,53
76,33
76,97
74,93
76,41
76,69
74,2
75,68
75,61
76,16
76,05
68,48
76,66
75,76
67,32
75,63
41,83
55,96
67,56
67,47
66,43
68,38
67,52
68,14
%2
64,39
75,94
74,71
76,06
100
77,22
22,78
76,63
75,85
26,39
75,94
23,77
24,4
75,78
74,34
75,86
76
76,33
75,55
74,91
75,88
75,67
57,6
77,33
76,36
75,72
75,62
76,4
77,03
74,96
76,55
76,82
74,2
75,74
75,65
76,23
76,1
68,53
76,7
75,82
67,32
75,66
41,89
56,18
67,68
67,58
66,57
68,53
67,62
68,26
%5
95,35
98,47
98,07
98,31
100
98,73
61,05
98,63
98,54
67,04
98,52
61,8
61,68
98,25
97,74
98,4
98,3
98,41
98,26
98,03
98,44
98,13
93,02
98,7
98,5
98,38
98,33
98,56
98,54
98,08
98,38
98,52
97,81
98,28
98,21
98,29
98,19
97,49
98,43
98,39
97,34
98,22
80,04
90,21
97,33
97,45
97,22
97,53
97,42
97,59
%10
98,16
99,4
99,33
99,35
100
99,52
85,03
99,44
99,44
88,61
99,44
85,14
85,05
99,32
99,19
99,44
99,28
99,34
99,27
99,25
99,41
99,31
98,69
99,48
99,37
99,41
99,37
99,44
99,42
99,22
99,3
99,42
99,29
99,32
99,24
99,28
99,22
99,17
99,35
99,34
99,16
99,26
92,07
96,57
99,08
99,2
99,13
99,1
99,12
99,17
Le ipotesi fatte sono risultate veritiere, come si può vedere c'è
stato un forte aumento dell'errore di piccole dimensioni mentre
la percentuale di errore sotto i 10mm appare quasi invariata,
cosa interessante è anche la percentuale sotto i 5mm ha
consegnato un risultato soddisfacente.
Questi sono i valor medi:
•
%=0: 69,23
•
%>2: 69,3
•
%>5: 94,69
•
%>10: 98,02
Questi valori tra l'altro risultano leggermente più bassi data la
presenza
di
qualche
risultato
particolarmente
basso
probabilmente dovuto al movimento del soggetto in posa.
Questi test effettuati sul corpo insieme ai precedenti e a tutte le
immagini raccolte ci permettono di dire che i risultati ottenuti
confermano e migliorano le affermazioni fatte da Microsoft che
affermò una tolleranza di 1 cm dato che una quantità
trascurabile di punti sfora il valore di 1 cm. Possiamo inoltre
affermare che poco più del 5% supera i 5 mm di errore.
Possiamo considerare 5mm il valore minimo di tolleranza.
98
Lo scanner 3D
In
questo
capitolo
verranno
descritti
tutti
i
processi
di
realizzazione dello scanner 3D che si è voluto realizzare per
questo progetto, Ovviamente il software è stato realizzato a solo
scopo dimostrativo e non a scopo commerciale quindi sarà privo
di interfacce grafiche o altre cose utili per interfacciarsi con un
utente medio.
Verranno descritte solo le righe di codice fondamentali mentre
verranno escluse le righe di scarso interesse (come ad esempio i
vari import che vengono gestiti automaticamente da Eclipse).
All'interno del disco relativo alla tesi sono disponibili tutti i
software utilizzati in questa tesi (quindi anche quelli relativi alle
sperimentazioni) e sono facilmente visualizzabili importando le
relative cartelle su Eclipse.
Preparazione di Eclipse
Prima di entrare nei dettagli principali del programma è utile
spendere due parole riguardanti la configurazione di Eclipse
affinché le librerie funzionino con il programma che si vuole
creare.
Nel momento in cui si vuole creare un nuovo progetto in Eclipse
è importante innanzitutto importare le librerie ma procediamo
99
per passi, per prima cosa bisogna andare su Eclipse e creare un
nuovo Java Project, il percorso da seguire è semplice: File → New
→ Java Project; comparirà una schermata di questo tipo.
Al posto di “Nome_Progetto” è possibile inserire il titolo che si
vuole dare al proprio progetto. Dopo aver inserito il titolo è
necessario cliccare su “Next” per poter andare avanti e
importare le librerie di cui si ha bisogno. Nella schermata
successiva selezionare la sotto-sezione “Libraries”.
100
Le librerie che sono state utilizzate sono esterne alle normali
librerie Java quindi in questo caso dovremo cliccare si “Add
External Jars”, ovviamente questa operazione andrà ripetuta due
volte per importare tutte le dovute librerie.
OpenNI dopo l'installazione crea le proprie librerie su Ubuntu in
una specifica cartella, il path da seguire è il seguente:
“/usr/share/java”. All'interno si troveranno parecchi file .jar, in
questo caso selezionare “org.OpenNI.jar”.
101
Nel caso delle librerie Java3D insieme al file di installazione sono
presenti anche i tre file .jar di cui si ha bisogno, quindi basterà
ripetere l'operazione e selezionare la cartella contenente questi
tre file da importare alla stessa maniera.
Le operazioni di configurazione non sono concluse dato che le
librerie OpeNI utilizzano un file .xml (posizionato all'interno della
cartella utilizzata nell'installazione descritta in precedenza),
questo file è necessario al funzionamento del Kinect dato che
contiene i parametri di configurazione dello stesso, indi per cui
per far funzionare il Kinect
per prima cosa bisognerà aggiungere all'interno della cartella
con il vostro progetto una ulteriore cartella “Data” contenente il
file .xml, in seguito nella classe che utilizza i metodi OpenNI, in
fase di dichiarazione delle variabili queste tre righe di codice:
private static final long serialVersionUID = 1L;
private OutArg<ScriptNode> scriptNode;
private Context context;
private final String SAMPLE_XML_FILE = "Data/SamplesConfig.xml";
Dopodiché bisognerà inizializzare lo “ScriptNode” e il “Context”
in questa maniera:
scriptNode = new OutArg<ScriptNode>();
context = Context.createFromXmlFile(SAMPLE_XML_FILE, scriptNode);
Alla fine di questo processo il programma sarà pronto ad
utilizzare il Kinect e le librerie 3D.
102
Introduzione
Le azioni da eseguire
Questo piccolo paragrafo non serve a mostrare codice ma a
spiegare in poche parole l'idea alla base del software, in modo
tale che di seguito sarà possibile comprendere meglio le classi e
i metodi utilizzati conoscendo per l'appunto già i passaggi ideali
da effettuare.
L'idea alla base del Software è molto semplice ed efficace,
principalmente si basa sull'utilizzo delle librerie OpenNI al fine di
estrarre le informazioni che ci servono quindi il vettore con i
valori numerici di profondità, tutte le altre funzioni relative al
Kinect come ad esempio il riconoscimento del corpo o dei
movimenti non verranno assolutamente utilizzate in questo
progetto. Una volta ottenute tali informazioni si ha la necessità
di utilizzarle a dovere per tracciare dei punti o delle superfici in
uno spazio tridimensionale, in questo caso andiamo ad utilizzare
le classi e i metodi messi a disposizione da Java3D che
permettono di tracciare punti, linee e figure geometriche (e
molto altro) all'interno di uno spazio 3D. Ovviamente utilizzare
questo tipo di librerie è stata una scelta e non un obbligo, per
effettuare ciò si potevano utilizzare molti altri metodi che
possono consistere nell'esportazione diretta del vettore di punti
in altri ambienti di programmazione o addirittura in altri
linguaggi di programmazione.
103
All'interno di uno spazio tridimensionale la definizione di punti
può essere effettuata attraverso l'utilizzo di differenti tipi di
coordinate come ad esempio le coordinate sferiche in cui si
indica un vettore e i due angoli di scostamento dalle assi oppure
le coordinate cartesiane che molto più intuitivamente indicano
sui tre assi le tre componenti che in seguito identificano il punto.
Le librerie Java3D permettono di tracciare punti attraverso
l'utilizzo di coordinate cartesiane quindi specificando le tre
componenti degli assi. Per tracciare i punti all'interno dello
spazio 3D sono stati sfruttati i valori della risoluzione della
camera a infrarossi insieme ai valori di profondità. Per la
precisione punto per punto viene specificato il valore di altezza e
di larghezza corrispondente della fotocamera, che verranno
memorizzati rispettivamente con il valore sull'asse y e sull'asse
x, mentre per la componente z è stato utilizzato il valore di
profondità al negativo, ciò si fa perché se si utilizzasse il valore
normale l'immagine apparirebbe invertita dato che ad un valore
più piccolo corrisponderebbe una maggior vicinanza al sensore e
una maggior vicinanza al centro dello spazio 3D, ma siccome
l'osservatore è posto al di fuori dello spazio 3D un punto più
vicino apparirebbe più lontano.
104
Per rendere meglio l'idea della proiezione 3D si può prendere ad
esempio l'ultimo punto dell'immagine che ipoteticamente si
trova ad un metro di distanza, le coordinare proiettate saranno
X=640, Y=480, Z=-1000, questo perché, come specificato in
precedenza, la risoluzione della fotocamera sono 640X480.
Quello che è stato illustrato adesso non è effettivamente il
funzionamento effettivo del nostro progetto ma solo una
spiegazione per rendere l'idea di ciò che si sta per realizzare, in
fase di sviluppo in realtà sono state utilizzate ulteriori tecniche
per tracciare l'immagine che verranno spiegate e giustificate nei
prossimi paragrafi.
Descrizione del software
Il primo prototipo
Per creare il primo prototipo dello Scanner 3D sono state seguite
esattamente le linee guida descritte precedentemente. Il primo
prototipo permette semplicemente di visualizzare un'immagine
a tre dimensioni di un oggetto posto di fronte al Kinect
tracciando solo i punti utili (quindi ignorando punti disposti ad
una certa distanza ovvero lo sfondo).
Per chi avesse a disposizione, oltre a questa tesi, anche il CD
allegato, troverete all'interno dei programmi utilizzati la cartella
relativa
al
primo
Scanner
che
per
l'appunto
si
chiama
“Scanner3D”, questo software è composto da due classi:
“DepthCreator” e “PointScan”.
105
DepthCreator è la classe che prende informazioni dal Kinect,
molte righe di codice sono state antecedentemente descritte (le
istruzioni relative alla configurazione), le principali righe di
nostro interesse sono le seguenti:
private DepthGenerator depthGen;
private ShortBuffer dpt;
private DepthMetaData depthMD;
private int[] arrayDepth;
Queste sono le variabili di principale interesse che verranno
utilizzate per generare l'array di punti, brevemente possiamo
dire che l'oggetto DepthGenerator si collega direttamente al
Kinect, per la precisione si collega alla fotocamera ad infrarossi,
DepthMetaData
raccoglie
le
informazioni
catturate
da
DepthGenerator, ShortBuffer contiene i valori di profondita in
formato short mentre l'oggetto arrayDepth viene utilizzato per
immagazzinare questi valori in un array di interi.
depthGen = DepthGenerator.create(context);
depthMD = depthGen.getMetaData();
width = depthMD.getFullXRes();
height = depthMD.getFullYRes();
dpt=depthMD.getData().createShortBuffer();
arrayDepth=new int[dpt.capacity()];
for(int i=0;i<dpt.capacity();i++){
arrayDepth[i]=dpt.get(i);
}
106
Il seguente ciclo di istruzioni crea il generatore di profondità
utilizzando l'oggetto “context”, quest'oggetto è stato descritto in
precedenza e riguarda l'utilizzo del file .xml di configurazione.
Una volta creato il DepthGenerator si ottiene da esso l'oggetto
depthMD che contiene i dati ottenuti dal generatore, questi dati
di
seguito
verranno
utilizzati
per
fornirci
i
valori
che
necessitiamo per creare l'immagine quindi larghezza, altezza e
profondità; rispettivamente width, height e dpt. Per concludere il
ciclo di for memorizza gli short in un array di interi. Di seguito
verranno descritti tre metodi.
public int getWidth(){
return this .width;
}
public int getHeight(){
return this .height;
}
public int[] getDepth(){
return this .arrayDepth;
}
107
Questi tre metodi sono dei semplici metodi che restituiscono i
tre valori e che verranno utilizzati dalla seconda classe per il
tracciamento dei punti.
La classe PointScan è la classe addetta al tracciamento e
contiene il main del programma. Molto del codice di questa
classe è stato preso per comodità dal libro elettronico “Java 3d –
Guida di base” di Francesco Milanese.
La classe ha come compito quello di creare lo spazio 3D,
riempirlo e permettere di navigarlo con i tasti di movimento.
this .setTitle("Immagine 3D");
this .setSize(1000,1000);
this .setLocation(30,30);
this .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas3D = new Canvas3D(config);
this .getContentPane().add(canvas3D,BorderLayout.CENTER);
BranchGroup scene = creaLoSceneGraph();
SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
simpleU.getViewer().getView().setBackClipDistance(10000);
simpleU.getViewer().getView().setFrontClipDistance(0);
TransformGroup vpTG =
simpleU.getViewingPlatform().getViewPlatformTransform();
Transform3D t3d = new Transform3D();
t3d.setTranslation(new Vector3f(0.0f,0.3f,2.0f));
vpTG.setTransform(t3d);
KeyNavigatorBehavior keyNavBeh = new KeyNavigatorBehavior(vpTG);
108
keyNavBeh.setSchedulingBounds(new BoundingSphere(new
Point3d(),1000.0));
scene.addChild(keyNavBeh);
scene.compile();
simpleU.addBranchGraph(scene);
Tutto questo codice rimane relativo alla formazione dello spazio
3D, le librerie Java 3D usano gli oggetti Simple Universe per
creare lo spazio da riempire in seguito, molti dei comandi sono
semplici comandi per migliorare la visualizzazione e decidere la
posizione
dell'osservatore.
Le
righe
relative
alla
classe
KeyNavigatorBehaviour impostano automaticamente i comandi
per la navigazione all'interno dello spazio. Le ultime righe
mostrano come tutto ciò che viene creato viene agganciato al
Simple Universe.
Di tutta questa parte di codice la riga più interessante è
quella che richiama la creazione dello Scene Graph che
creerà un oggetto chiamato scene che si andrà ad
aggiungere all'universo.
BranchGroup scene = creaLoSceneGraph();
Tale comando richiama il seguente metodo:
private BranchGroup creaLoSceneGraph()
{
BranchGroup objRoot = new BranchGroup();
objRoot.addChild(this .disegnaPunti());
return objRoot;
}
109
che a sua volta richiama il metodo di maggiore interesse, ovvero
il creatore di punti “disegnaPunti”.
private Shape3D disegnaPunti()
{
// Creo un nuovo oggetto PointArray, composto da tre elementi
// Imposto le coordinate dei tre punti
DepthCreator dp=new DepthCreator();
int w=dp.getWidth();
int h=dp.getHeight();
int[] depth=dp.getDepth();
int[] ver={w*h};
PointArray pa = new PointArray(w*h, GeometryArray.COORDINATES |
GeometryArray.COLOR_3);
int z=0;
int x=0;
int y=0;
for (y=0 ;y<h ;y++){
if(x==w)x=0;
for(x=0;x<w;x++){
if(depth[z]>500 && depth[z]<1000){
pa.setCoordinate(z, new Point3d(-x/1, -y/1,depth[z]));
Color3f xc = new Color3f(0.1f, 0.9f, 0.1f);
pa.setColor(z,xc);
System.out.println(depth[z]);
}
110
else ;
z++;
}
}
return new Shape3D(pa);
}
Questo metodo è il cuore pulsante del sistema ed è quello che
s'incarica di filtrare e disegnare i punti di maggior interesse.
All'inizio del metodo vengono dichiarate le variabili che sono
state chiamate intuitivamente X,Y e Z dato che settano le
coordinate. In seguito partono due cicli for annidiati, questa
parte è molto importante dato che per creare l'immagine
bisogna far sovrapporre pezzi dell'array di profondità lunghi
quanto
la
larghezza
dell'immagine
per
tutta
l'altezza
dell'immagine. In questo caso si fa scorrere il vettore X fino al
valore di larghezza dell'immagine dopodiché lo si azzera una
volta raggiunto il massimo e si fa aumentare il valore di Y per
poi far ripartire X. Da notare alla fine di tutto l'istruzione “Z++;”
che è stata posizionata in maniera tale da incrementare ad ogni
ciclo di X il valore di Z, in poche parole Z è un contatore che
scorre lungo il vettore di profondità.
L'istruzione:
if(depth[z]>500
&&
depth[z]<1000)
ha
l'utilità
di
considerare punti entro una certa distanza i quali verranno
disegnati, altrimenti verranno ignorati.
111
L'oggetto che si incarica di disegnare i punti è l'oggetto pa della
classe PointArray, in poche parole crea un array di punti che
verrà riempito con oggetti point dove verranno settate le
coordinate.
All'interno dell'if è possibile notare i vari punti che vengono
creati con il comando:
depth[z]));
pa.setCoordinate(z,
new
Point3d(-x,
-y,-
come è ovvio che sia viene inserita prima la
coordinata X, poi Y e infine Z. Da notare il simbolo – presente
per ogni coordinata, per quanto riguarda la profondità è stato
spiegato precedentemente come fare, per le coordinate X e Z
invece è stato messo il segno meno dato che, per come sono
regolati i cicli for, l'immagine altrimenti risulterebbe capovolta e
specchiata. Nello specifico i due cicli for farebbero scorrere i
pixel dal punto più basso a sinistra scorrendo verso destra e
risalendo verso l'alto (ovvero crescendo in positivo sia sull'asse
X che sull'asse Y), per questo motivo, per ovviare a questo
problema, è stato aggiunto il simbolo meno. Le versioni
successive del software andranno proprio a modificare questa
parte in modo tale che l'immagine sia centrata.
Il restante codice setta il colore ai punti e restituisce l'oggetto
Shape3D che verrà poi agganciato all'universo.
La prima immagine d'esempio realizzata con questo programma
è la seguente.
112
Il secondo prototipo
Il secondo software che è stato creato per questo progetto è una
specie di aggiornamento del primo, nel CD allegato a questa tesi
ha il nome di “Scanner 3D 1.1”. Sostanzialmente le funzioni di
questo secondo software sono esattamente identiche a quelle
del
primo
precedentemente
descritto,
la
differenza
fondamentale sta nello spazio in cui vengono disegnati i punti.
Il codice relativo allo “Scanner 3D 1.1” è identico al precedente
tranne che per la parte seguente che è stata modificata.
int z=0;
int x=0;
int y=0;
113
int distanza=1400;
for (y=h/2 ;y>-h/2 ;--y){
if(x==-w/2)x=w/2;
for(x=w/2;x>-w/2;--x){
if(depth[z]>500 && depth[z]<distanza){
pa.setCoordinate(z, new Point3d(x, y,distanzadepth[z]));
Color3f xc = new Color3f(0.1f, 0.9f, 0.1f);
pa.setColor(z,xc);
System.out.println(depth[z]+"
"+w);
}
else ;
z++;
}
}
return new Shape3D(pa);
}
Sostanzialmente le differenze principali si riferiscono ai due cicli
di for annidiati. Come si può notare non si parte piu da un
contatore posto a zero fino a crescere al valore dell'altezza o
della larghezza (espresse tramite i valori di h e w) ma si parte
da metà altezza/larghezza fino a decrescere a meno metà
altezza/larghezza:
for (y=h/2 ;y>-h/2 ;--y)
for(x=w/2;x>-w/2;--x).
Questo procedimento si fa principalmente per mantenere il
centro della proiezione dei punti come se fosse il centro
dell'inquadratura. In termini pratici questa operazione non
comporta nessun cambiamento in particolare dato che nello
114
spazio 3D non si può visualizzare il centro del piano cartesiano
quindi per un visualizzatore la differenza non sarà percepita.
Il secondo cambiamento importante invece è stato fatto nella
modifica della coordinata di profondità, i componenti importanti
di questo cambiamento sono il filtro di profondità:
&& depth[z]<distanza),
coordinate:
if(depth[z]>500
e l'istruzione che crea i punti con le dovute
pa.setCoordinate(z, new Point3d(x,y,distanza-depth[z]));.
Questi passaggi sono funzione della variabile distanza, che in
questo esempio è inizializzata a 1400 mm. Questa dipendenza è
fondamentale per il passaggio successivo di questo programma.
Il valore di “distanza” è il valore, per l'appunto, della distanza
che intercorre tra il Kinect e il centro dell'oggetto che si vuole
scansionare.
distanza
Il programma utilizzerà come informazioni rilevanti solo quelle
comprese tra 50 cm e il valore di distanza, questo per quanto
riguarda il filtro. Per quanto riguarda il tracciamento dei punti,
l'istruzione
distanza-depth[z]
fa in modo che i punti vengano
tracciati uscenti dal piano dell'origine con profondità zero,
115
cosicché il valore proiettato è il valore della distanza del punto
dell'oggetto dal piano che lo taglia parallelamente al Kinect
passante per il centro.
Per fare un esempio ipotizziamo un oggetto avente il centro a 1
m e mezzo di distanza dal Kinect (1500 mm) e, sempre per
ipotesi, un punto della superficie di questo oggetto si trova a
1300 mm d distanza dal Kinect. Dopo aver effettuato la
scansione il Kinect restituirà i valori di profondità e, nel caso di
quel punto specifico, il valore sarà di 1300; nel momento in cui il
programma andrà a calcolare il punto da disegnare assegnerà il
valore di 1500-1300 ovvero 200mm che è esattamente la
distanza di quel punto dal piano passante per il centro.
Visivamente il risultato sarà l'oggetto scansionato a metà come
se fosse stato tagliato in due.
Come già detto prima queste modifiche non comportano alcuna
differenza di visualizzazione ma risulteranno importanti per il
passaggio successivo, lo scanner rotante.
Lo scanner a 360 gradi
L'ultimo programma che verrà descritto è l'evoluzione del
precedente ed anche in questo caso le modifiche apportate al
codice saranno minime ma significative. Ovviamente tutto ciò è
un prototipo funzionante di quello che vorrà essere in futuro un
oggetto di tale portata. Questo prototipo è stato testato con
oggetti piccoli e non direttamente sul corpo umano a causa della
116
mancanza di dispositivi e spazi adatti a fare le dovute
misurazioni.
Il principio di funzionamento
Il passaggio dallo scanner precedente allo scanner a 360 gradi
verte principalmente sul fatto di poter far girare o il sensore o
l'oggetto preso in considerazione. La sperimentazione da noi
svolta è avvenuta mantenendo fermo il sensore e facendo girare
l'oggetto selezionato. Il programma effettuerà una serie di scatti
che cambieranno a seconda dell'angolo di rotazione dell'oggetto
(per esempio nel caso di una rotazione di 90° si effettueranno 4
scatti), ogni scatto verrà posto nello spazio tridimensionale
traslato a seconda dell'angolo di spostamento, per l'esattezza le
immagini ruoteranno intorno all'asse Y.
Per questo motivo il precedente scanner è stato impostato in
maniera tale da visualizzare l'oggetto uscente dal piano
perpendicolare all'asse delle profondità Z e passante per il
centro, in questa maniera la traslazione delle immagini catturate
riguarderà solo la rotazione e non l'avvicinamento al centro.
Il programma
Come specificato in precedenza, il programma non varierà di
molto la parte relativa al codice. Il nome che gli è stato dato è
“Scanner 3D 2.0” e alle normali due classi descritte in
precedenza è stata aggiunta una classe in cui è racchiuso il
main e in cui è possibile specificare il numero di scatti da fare,
automaticamente il programma memorizzerà il valore del
numero di scatti in una variabile e calcolerà l'angolo di
117
spostamento:
teta=360/n;.
step=n;
Il
resto
del
programma
fondamentalmente è uguale al precedente, il procedimento di
scatto e di disegno dei punti utilizza lo stesso codice del
precedente con qualche differenziazione. Innanzitutto un ciclo di
for dipendente dal valore “step” ripeterà gli scatti a seconda del
valore memorizzato:
i=1;i<=step;i++).
for(int
In seguito si
utilizzerà il valore di “teta” per variare l'angolo a seconda del
numero di giro di for:
int
teta2=teta*(i-1);
. Nella variabile
“teta2” è memorizzato l'angolo di spostamento ad ogni step che
verrà utilizzato per traslare l'immagine e proiettarla nella giusta
posizione. Per effettuare questo spostamento verrà utilizzata la
formula di traslazione seguente:
x '=xcos (∂)− ysin(∂)
y '=xsin(∂)+ ycos(∂)
In questa formula possiamo vedere come il valore della
coordinata
principale
cambia
dipendentemente
dall'angolo
generando coordinate traslate contrassegnate dall'apice. La
formula appena descritta è valida per una traslazione di funzioni
sull'asse cartesiano in due dimensioni, ma può tranquillamente
essere applicata per la rotazione di punti lungo un asse. Nel
caso qui descritto la rotazione avviene intorno all'asse Y quindi
per effettuarla con successo basterà semplicemente utilizzare la
formula precedente scambiando il valore di Y con la profondità
Z.
In righe di codice la formula si traduce nella seguente maniera:
pa.setCoordinate(z+((i-1)*(w*h)),
depth[z])*sent),
y,(x*sent)+
new
Point3d((x*cost)-((distanza-
((distanza-depth[z])*cost)));.
118
Difatti il
valore di Y rimarrà invariato mentre i restanti valori saranno
influenzati dalla formula. Nel dettaglio avremo
X'=(x*cost)-((distanza-depth[z])*sent)
Z'=(x*sent)+
((distanza-depth[z])*cost)
Il calcolo del coseno e del seno è stato eseguito utilizzando le
librerie matematiche fornite da Java:
double cost=Math.cos(Math.toRadians(teta2));
double sent=Math.sin(Math.toRadians(teta2));
Le prove di scansione
Il software cosi creato ideologicamente funziona ma per testarlo
sono state effettuate alcune prove. Le prime prove effettuate
sono state svolte con un piatto girevole in cui sono stati indicati
gli angoli e veniva fatto girare manualmente ad ogni scatto. Qui
di seguito viene mostrata una foto dello spazio in cui è stato
effettuato l'esperimento.
119
Le primi immagini ottenute hanno messo in evidenze problemi
relativi alla calibrazione dello strumento prima di iniziare la
scansione, calibrazione difficile da effettuare senza l'utilizzo di
strumenti adatti.
Come si evince da questa immagine la scansione effettivamente
ricopre un angolo di 360° ma i 4 scatti non combaciano
perfettamente e si può notare un certo sfasamento tra le 4
immagini. Ciò è dovuto al non perfetto posizionamento al centro
dell'inquadratura che crea uno sfasamento degli scatti o a
destra o a sinistra, e ad un non preciso calcolo della distanza dal
centro del piatto che può causare un allontanamento degli scatti
o la mancata scansione di alcune parti.
120
Conclusioni
Considerazioni finali
Preso atto dei risultati ottenuti con le sperimentazioni e
considerando il corretto funzionamento dei prototipi di scanner
sviluppati si è potuti giungere a conclusione di questo progetto
con le seguenti conclusioni e considerazioni finali.
Il Kinect si è rivelato uno strumento utile per la sua versatilità,
compattezza e rapidità di utilizzo. Il rapporto qualità prezzo lo
rende al momento molto competitivo sul mercato sopratutto per
lo sviluppo di nuove futuristiche applicazioni.
I prototipi realizzati hanno dimostrato che lo scanner è
funzionante e, con la dovuta calibrazione, può risultare un
ottimo strumento per le misurazioni biometriche. La possibilità
inoltre di individuare le zone del corpo in cui si ha avuto una
crescita maggiore rispetto ad altre è possibile visti i risultati
ottenuti.
Abbiamo dimostrato che il Kinect, ignorando una piccola
quantità non rilevante, può creare una mappa di profondità con
un errore di un centimetro, ma possiamo anche affermare che il
sensore, per circa il 95% dei punti rilevati ha un margine di
errore di 5 mm, che per le misure biometriche è un valore di
tolleranza accettabile in confronto agli strumenti presenti oggi.
121
Possibilità di sviluppo
Rispetto alle prestazioni, la qualità degli altri scanner illustrati in
questa tesi risulta molto maggiore rispetto a quella del Kinect,
ma con i dovuti accorgimenti software le prestazioni dell'oggetto
andranno sicuramente ad aumentare, l'utilizzo dei giusti filtri e
l'interpolazione corretta dei punti permetterà l'eliminazione
quasi totale delle quantità di errore individuate nei test fino a
portare il margine di errore dall'un centimetro al millimetro. Con
un
margine
di
errore
cosi
basso
si
potranno
senz'altro
aumentare il numero di applicazioni a cui il Kinect potrà essere
destinato, fino alle misurazioni di precisione.
Ulteriori sviluppi si potrebbero ottenere inoltre accoppiando alla
mappatura del corpo eseguita con il Kinect, l'uso delle funzioni
di riconoscimento del movimento, uno strumento tale potrebbe
essere utile in campo biomedico per la ginnastica di cura della
postura o per la riabilitazione di pazienti in fisioterapia. Le
possibilità si allargherebbero anche oltre la medicina, le ipotesi
più probabili potrebbero essere l'uso del Kinect per migliorare le
tecniche e le posizioni di uno sportivo (a seconda dello sport
praticato) oppure come un economico strumento di motion
capture per registi alle prime armi.
122
Bibliografia
1. Understanding Motion Capture for computer animation and
videogames, Alberto Menache (2000);
2. Analisi del movimento, Jacquelin Perry, M. G. Benedetti, Elsevier
(2005);
3. Integrazione di un sistema di Motion Capture in un sistema virtuale
interattivo, Francesco Vottari;
4. How does the Kinect work; John MacCormick
5. La telemedicina, Giampiero Papi, Fabrizio L. Ricci;
6. Java3D guida di base, Freancesco Milanese;
7. Ready to run Java 3D, K.Brown, D.Petersen, John Wiley & Sons Inc.;
8. 3D Users Interfaces with Java, J. Barrileaux, Manning publications
company;
9. PrimeSense:
http://www.primesense.com/
10.
[Guida] Kinect su Ubuntu 11.10:
http://discoverylinux.wordpress.com/2011/12/30/guida-kinect-suubuntu-oneirc-11-10-openni-e-sensorkinect/
11.
Kinect Pattern Uncovered:
http://azttm.wordpress.com/2011/04/03/kinect-pattern-uncovered/
12.
OpenNI:
http://openni.org/
123
124
Ringraziamenti
Finalmente ci siamo, anche io ho finito questa benedetta
università. C'ho messo un po' più del dovuto ma è andata bene,
ci siamo divertiti.
Sarebbe bello dire di aver fatto tutto da solo ma non è cosi.
Innanzitutto per la stesura di questa tesi bisogna ringraziare
professore, assistenti e le mie due cavie che ho utilizzato per
fare i test.
Adesso passiamo al discorso riguardante gli anni in università,
inizierei dall'appoggio dei familiari + Bruno (ormai è de famiglia)
che, per quanto c'abbiano creduto poco, alla fine hanno sperato
fino all'ultimo. A mia madre Elda e a mio padre Cesare (Augusto)
un grazie sincero per l'appoggio e l'aiuto dato in questi anni
(visto che alla fine ce l'ho fatta!!!), mio padre non sa il nome di
un esame di quelli che ho fatto ma alla fine sa che li passavo
quindi va bene ma devo dire che ha foraggiato.
Mia sorella Francesca era quella che forse un pochino ci credeva
ma non capiva come facevo, intanto la ringrazio anche come
cavia.
Poi c'è un certo Paco che dice di conoscermi ma io non lo
conosco e mi parla sempre di Porto Rico, vuole aprire un bar.
125
Un grazie va a Piero e Donatella (miei zii per chi non lo sapesse)
che oltre a supporto psicologico hanno offerto sopratutto quello
culinario, e non saltiamo le mie cuginette che qui abbrevierò con
SS (Silvia e Sara), che poi loro proprio non c'hanno mai creduto.
Ultimi in famiglia, ma non ultimi, sono quelli che lo hanno
creduto possibile fino alla fine pur non capendo bene quello che
stavo facendo, mi riferisco a Nazzareno e Matilde.
Ora passiamo al settore relativo agli amici, quel branco di
maledetti (è una tesi non posso usare parolacce) che vuoi non
vuoi in qualche maniera sono tornati utili.
I Coniugi Cagnetti – Ripanucci, i Coniugi Ceccarelli – Alesiani e
Mario ZeroUno (50 € per lo sponsor prego) che mi hanno
stressato la vita per anni e quando sono fuggito mi sono pure
venuti a cercare in Spagna.
A tutto lo Staff Bar King per il supporto di Malto, Luppolo e
Montenegri vari forniti in questi anni, con lo Staff intendo anche
quel branco di alcolisti decerebrati che lo hanno frequentato per
tutto questo tempo, per la lista dei nomi rimando alla mia
rubrica del cellulare.
Passiamo ora a quegli animali che hanno condiviso con me anni
di università. Il primo pensiero va a tutti coloro con cui ho
convissuto (tranne Middio), quindi in primis direi sempre Mario
ZeroUno(altri 50) Mario Ce, el ruge, e mettiamoci pure
Giuseppe, dopodichè consideriamo anche Giancarlo Daniele e
Michele (insomma tutti tranne Middio), per concludere anche le
126
mie ultime coinquiline Angela e, seppur per pochi giorni, Yugi
ma questa è un'altra storia.
Dopodiché passerei a salutare le donnine della Casa Maiolati,
sempre pronte ad una bevuta in caso di noia anconetana.
Infine il gruppo di studi più figo del mondo composto da Trollo,
Terni, Telespalla Bob, ZeroUno, u Sergio e, seppur arrivato più
tardi un certo Dj Ellenico.
L'ultimo pensiero vola a Barcellona per salutare e ringraziare
tutti i terroristi e i frequentatori di Carrer Balmes 52, ovvero tutti
i terroristi di Ancona, i compagni portoghesi, tutto l'ammasso di
crucchi, il resto del mondo, e tutti i restanti italiani che non
venivano da Ancona. Parte del mio fegato e del mio cervello è
rimasto in quella casa con voi.
127