Project Gesture & Real Sense: il potere nelle mani!!
Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!
1. Kinect + .NET = NUI : Interfacce
naturali facili con Kinect!!!
Massimo Bonanni
massimo.bonanni@domusdotnet.org
http://codetailor.blogspot.com
@massimobonanni
2. Agenda
• Natural User Interface
• Introduzione al Kinect
– Cosa c’è dentro
– Architettura
• Kinect SDK
– Camera Data
– Depth data
– Skeletal tracking
– Audio
• Q&A
2
3. Natural User Interface
Si definisce NUI l’interfaccia di un sistema in cui gli utenti riescono ad
interagire utilizando un approccio «naturale» cioè riescono ad utilizzare
le funzionalità del sistema senza l’uso di dispositivi artificiali (come
mouse, trackball o tastiera)
Una NUI è rivolta ad utenti in grado di
effettuare movimenti relativamente
naturali, azioni e gesti che devono
controllare l’applicazione del
computer o manipolare contenuti sullo
schermo.
3
5. NUI: Vantaggi
• Rapido apprendimento delle funzionalità;
• L’utente è in grado di diventare «esperto»
sull’interfaccia in minor tempo;
• Può aiutare portatori di handicap nell’utilizzo
del sistema.
5
6. Kinect: Cosa c’è dentro
Video Camera
RGB
Sensori di
profondità
Batteria di 4
microfoni
• Video Camera RGB (CMOS) Inclinazione
Motorizzata
• Sensori di profondità: proiettore IR + Camera IR (CMOS)
• Inclinazione motorizzata (±27 gradi)
• 4 Microfoni
6
9. Kinect: Come funziona
La nostra
Il proiettore ad applicazione
infrarossi illumina il utilizza le info
soggetto con dei dell’SDK
pattern
L’SDK è in grado di
convertire lo stream della
depth cam in dati
utilizzabili
La camera infrarossi
misura la distanza
con un approccio «a
luce strutturata»
9
10. Kinect: Cosa serve
• Kinect;
• Cavo usb per
collegamento a pc;
• Kinect SDK;
• DirectX9;
• .........tanta fantasia!!!
10
11. Kinect: Requisiti minimi
• Sistema Operativo
– Windows 7 (x86 and x64)
• Hardware
– Processore dual-core 2.66GHz o superiore
– 2Gb ram
– Scheda grafica DiretcX9 o superiore
– USB 2.0 dedicata
– Kinect con cavo usb per collegamento al pc
• Software
– Visual Studio 2010 Express o superiori
– .NET Framework 4.0
– Runtime DirectX 9
– Microsoft Speech Platform SDK v11 (solo per lo speech recognition)
11
12. Kinect: Architettura
L’SDK mette a disposizione una serie di strumenti e una
libreria di classi in grado di interagire con i sensori del
dispositivo fornendo allo sviluppatore oggetti ed eventi.
12
13. Kinect: Architettura
I componenti dell’SDK sono i seguenti:
Applications
Video Components Audio Components
Windows Core Audio 5
A/V capture and transcoding
3 NUI API and Speech APIs
Media Foundation | DirectShow 4
DMO codec for mic array
2 Device Device
Video stream control Audio stream control User Mode
setup access
WinUSB device stack WinUSB camera stack USBAudio audio stack Kernel Mode
Kernel-mode drivers for Kinect for Windows
USB Hub Hardware
1
Motor Cameras Audio mic array
Kinect sensor
Kinect for Windows User-created
Windows SDK components components
13
14. Kinect: Architettura
• Hardware
L’hardware comprende i sensori visti in precedenza è l’hub USB che permette
il loro collegamento al pc.
• Microsoft Kinect drivers :
a) Permettono l’accesso all’array di microfoni con le API Audio standard di Windows.
b) Forniscono gli stream della video camera e dei sensori di profondità.
c) Forniscono la possibilità di utilizzare più device contemporaneamente.
14
15. Kinect: Architettura
• NUI API
Un insieme di API che permettono di recuperare i dati dai sensori di immagine
e di controllare il device stesso (ad esempio brandeggiare il dispositivo).
• KinectAudio DMO
Estende le funzionalità dell’array di microfoni supportato in Windows 7 per
fornire le funzionalità di Beamforming (mappatura sonora dell’area) e
localizzazione della sorgente sonora.
• Windows 7 standard APIs
Le API audio, speech e media presenti in Windows 7 e Microsoft Speech.
15
17. Kinect: XBox o Windows
• Attualmente esistono due versioni di Kinect:
– Kinect for XBox
– Kinect for Windows
• E’ possibile utilizzare il Kinect for XBox per fare esperimenti
con l’SDK per Windows
• Si ottiene un errore se si utilizza il Kinect per XBox in
produzione
17
18. Kinect : SDK
• L’SDK è scaricabile dall’indirizzo http://kinectforwindows.org
• Vengono installati contestualmente l’SDK (con il Kinect Sample Browser), i
drivers, il Runtime (quello da distribuire con le applicazioni ) e lo Speech
Recognition Language Pack.
18
19. Kinect: Default Mode vs Near Mode
Il Kinect può gestire oggetti a differenti distanze in base
alla modalità selezionata:
– Default Mode: oggetti tra 80 cm e 4 metri;
– Near Mode: oggetti tra 40 cm e 3 metri
19
20. Kinect: La classe KinectSensor
La classe
KinectSensor
permette l’accesso
alle funzionalità del
Kinect:
20
21. Kinect: La classe KinectSensor
Recuperiamo l’istanza del KinectSensor a partire dalla
collezione KinectSensors:
Recupero il primo dei
sensori disponibili
Abilito lo stream video
Avvio la ricezione 640x480 30 fps
dei frame video
21
22. Kinect: Camera Data
La classe KinectSensor mette a disposizione l’evento
ColorFrameReady per la gestione dei frame video.
22
24. Kinect: Camera Data
Per utilizzare l’evento VideoFrameReady è necessario:
1. Recuperare il device dalla collezione KinectSensors della classe KinectSensor;
2. Abilitare lo stream video con la risoluzione/fps desiderato;
3. Sottoscriversi all’evento ColorFrameReady;
4. Avviare gli stream dell’istanza di KinectSensor.
E’ anche possibile eseguire un polling direttamente sullo stream video.
24
25. Kinect: Camera Data
• Risoluzioni ammesse
– 640x480
– 1280x960
• Numero di bytes per pixel 2 o 4
• FPS
– 12
– 15
– 30
• Formato immagine:
– RGB (pixel da 4 bytes: blu, verde, rosso e alfa)
– YUV (pixel da 4 bytes: ciano, magenta, giallo e nero)
– YUV-RAW (pixel da 2 bytes: ciano, magenta, giallo e nero, solo 640x480 15 fps)
25
29. Kinect: Depth Data
Per utilizzare l’evento DepthFrameReady è necessario:
1. Recuperare il device dalla collezione KinectSensors della classe KinectSensor;
2. Abilitare lo stream depth con la risoluzione/fps desiderato;
3. Sottoscriversi all’evento DepthFrameReady;
4. Avviare gli stream dell’istanza di KinectSensor.
E’ anche possibile eseguire polling direttamente sullo stream di profondità
29
30. Kinect: Depth Data
• Risoluzioni ammesse
– 640x480 (30 fps)
– 320x240 (30 fps)
– 80x60 (30 fps)
• Numero di bytes per pixel 2
• Contenuto immagine:
– Distanza (in millimetri, tra 400mm e 4000mm in base alla modalità)
– Player index (player index 1, 2 o 0 se non c’è un player)
30
31. Kinect: Depth Data
Per ogni punto (x,y), il valore di tipo Short (2 bytes) ottenuto dal Kinect ha la
seguente struttura:
ed i valori di profondità e player index sono dati dalle formule
31
33. Kinect: Depth Data
Possiamo sapere se un punto si trova troppo vicino, troppo lontano o nella
zona sconosciuta utilizzando tre proprietà dello stream di profondità:
KinectSensor.DepthStream.TooNearDepth
KinectSensor.DepthStream.UnknownDepth KinectSensor.DepthStream.TooFarDepth
33
35. Kinect: Skeletal tracking
• L’SDK permette di avere informazioni riguardo la posizione di alcuni
punti del corpo dei player rilevati.
• L’algoritmo di skeletal tracking è basato sul «Machine Learning»
• La classe KinectSensor mette a disposizione l’evento
SkeletonFrameReady per la gestione dei frame di di skeletal
tracking:
E’ anche possibile eseguire polling sullo Skeleton Stream esposto dalla
KinectSensor.
35
37. Kinect: Skeletal Tracking
Per utilizzare l’evento KeletonFrameReady è necessario:
1. Recuperare il device dalla collezione KinectSensors della classe KinectSensor;
2. Abilitare lo stream Skeletal Tracking;
3. Sottoscriversi all’evento SkeletonFrameReady;
4. Avviare gli stream dell’istanza di KinectSensor.
37
38. Kinect: La classe Skeleton
La classe Skeleton contiene le informazioni
sugli «scheletri» dei player rilevati:
– Al massimo due player contemporanei (più altri
4 con informazioni ridotte);
– Ogni «scheletro» può essere Tracked o
NotTracked;
– Ogni scheletro prevede un array di 20 Joint
ognuno con la propria posizione (x,y,z);
– Ogni Joint può essere Tracked, NotTracked o
Inferred (NotTracked è raro).
38
39. Kinect: Joints
• Ogni scheletro ha 20 oggetti Joint che tracciano la posizione del corpo del player;
• La posizione del joint nello spazio è contenuta nella proprietà Position (di tipo
SkeletonPoint):
– X: posizione x (compreso tra -1 e 1);
– Y: posizione y (compreso tra -1 e 1);
– Z: distanza dal device (in metri).
39
40. Kinect: Skeletal Tracking
• Il rilevamento dei sensori è affetto da errore (problemi costruttivi, luminosità
eccessiva dell’ambiente, rumore visivo e via discorrendo) e i dati restituiti
hanno delle fluttuazioni che non sempre sono gradite nelle applicazioni.
• Lo Skeleton Stream esposto dalla KinectSensor fornisce la possibilità di
impostare dei filtri per eliminare il rumore:
40
41. Kinect: TransformSmoothParameters
• Smoothing : specifica lo smoothing da applicare. I valori sono compresi tra 0 e 1.
Più il valore si avvicia a 1 e più viene applicato il fattore di smoothing;
• Correction : specifica la correzione da apportare ai dati. I valori sono compresi tra 0
e 1. Più piccolo il valore inserito e meno è la correzione sui dati grezzi;
• Prediction : specifica il numero di frame previsti;
• Jitter Radius : specifica il raggio di riduzione del jitter (in metri). Ogni jitter esterno
al raggio è riportato nel raggio impostato;
• MaximumDeviation Radius : specifica il raggio massimo (in metri) che i punti filtrati
possono deviare rispetto ai dati grezzi
Non esistono dei valori «buoni» da utilizzare, è necessario eseguire delle prove per
capire quali sono i più adatti per la specifica applicazione
41
42. Kinect: «Default Mode» vs «Near Mode»
Il comportamento dello Skeletal Tracking varia in base
al fatto che ci si trovi in «Default Mode» o «Near Mode»
Si tratta della proprietà
Skeleton.Position valorizzata quando
lo scheletro è completamente
tracciato
42
44. Kinect: AllFrameEvent
La classe KinectSensor mette a disposizione un evento per
ottenere contemporaneamente tutti e tre i frame visti in
precedenza:
L’FPS, in questo caso, è pari al più basso tra i differenti stream.
44
45. Kinect: Audio
Il device dispone di una
batteria di 4 microfoni con
delle funzionalità di “audio
processing” hardware:
• Multichannel echo cancellation (MEC)
• Sound position tracking
• Directional Microfone
• Noise suppression e Noise reduction
45
46. Kinect: KinectAudioSource
La classe KinectSensor espone
la proprietà AudioSource di tipo
KinectAudioSource attraverso la
quale è possibile gestire tutte le
funzionalità audio.
46
47. Kinect : Sound Position
Il Kinect, permette di :
•Conoscere l’angolo e la «confidence» della sorgente sonora (Sound
Source Angle);
•Impostare la direzionalità dei microfoni del sensore in modo da rilevare
l’audio solo da una certa direzione (Beam Angle)
In entrambi i casi l’intervallo di copertura è:
-50 0 +50
47
48. Kinect : Sound Source Angle
Per gestire la variazione di angolo della sorgente sonora, è
sufficiente gestire l’evento SoundSourceAngleChanged della
classe KinectAudioSource:
48
49. Kinect : Audio Streaming
• La classe KinectAudioSource, grazie al metodo
Start(), consente di recuperare lo stream
dell’audio proveniente dal sensore.
• Lo stream può essere, ad esempio, registrato
in tempo reale.
49
50. Kinect: Speech Recognition
L’SDK del Kinect si integra perfettamente con lo
Speech Platform SDK per implementare voice
recognition.
Il sensore altro non fa che supportare uno
SpeechRecognizer utilizzabile dallo
SpeechRecognitionEngine dello Speech Platform.
50
52. Conclusioni
L’SDK è in continua evoluzione con continui rilasci.
Ad ogni rilascio viene migliorata la stabilità dei driver,
Skeletal Tracking e precisione dei dati recuperati dal
sensore di profondità.
Attualmente abbiamo un SDK maturo per cominciare a
sviluppare nuove tipologie di applicazioni
52