Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!
Massimo Bonanni
[email protected]://codetailor.blogspot.com@massimobonanni
Agenda• Natural User Interface• Introduzione al Kinect
– Cosa c’è dentro– Architettura
• Kinect SDK– Camera Data– Depth data– Skeletal tracking– Audio
• Q&A
2
Natural User InterfaceSi 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)
3
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.
NUI : Evoluzione delle interfacce
4
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
Kinect: Cosa c’è dentro
• Video Camera RGB (CMOS)
• Sensori di profondità: proiettore IR + Camera IR (CMOS)
• Inclinazione motorizzata (±27 gradi)
• 4 Microfoni
6
Inclinazione MotorizzataInclinazione Motorizzata
Batteria di 4 microfoni
Batteria di 4 microfoni
Sensori di profonditàSensori di profondità
Video Camera RGB
Video Camera RGB
Kinect: Architettura hardware
8
Kinect: Come funziona
9
Il proiettore ad infrarossi illumina il soggetto con dei pattern
La camera infrarossi misura la distanza con un approccio «a luce strutturata»
L’SDK è in grado di convertire lo stream della depth cam in dati utilizzabili
La nostra applicazione utilizza le info dell’SDK
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
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
Kinect: ArchitetturaI componenti dell’SDK sono i seguenti:
13
Video Components Audio Components
Windows components
1
2
35
4
Kernel-mode drivers for Kinect for Windows
DMO codec for mic array
Applications
Kinect for Windows SDK
User-created components
USB Hub
Windows Core Audio and Speech APIs
Device setup
Audio stream controlVideo stream control
WinUSB device stack USBAudio audio stackWinUSB camera stack
Motor Audio mic arrayCameras
NUI APIA/V capture and transcodingMedia Foundation | DirectShow
User Mode
Kernel Mode
Kinect sensor
Hardware
Device access
Kinect: ArchitetturaIl device restituisce 3 stream:
– Video– Depth– Audio
16
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
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
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
Kinect: La classe KinectSensorLa classe KinectSensor permette l’accesso alle funzionalità del Kinect:
20
Kinect: La classe KinectSensor
Recuperiamo l’istanza del KinectSensor a partire dalla collezione KinectSensors:
21
Recupero il primo dei sensori disponibili
Recupero il primo dei sensori disponibili
Abilito lo stream video 640x480 30 fps
Abilito lo stream video 640x480 30 fpsAvvio la ricezione
dei frame videoAvvio la ricezione dei frame video
Kinect: Camera Data
La classe KinectSensor mette a disposizione l’evento ColorFrameReady per la gestione dei frame video.
22
Kinect: ColorImageFrameReadyEventArgs
23
Kinect: Camera DataPer 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.
24
E’ anche possibile eseguire un polling direttamente sullo stream video.
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
26
Kinect: Depth Data
27
La classe KinectSensor mette a disposizione l’evento DepthFrameReady per la gestione dei frame di profondità:
Kinect: DepthImageFrameReadyEventArgs
28
Kinect: Depth Data
29
E’ anche possibile eseguire polling direttamente sullo stream di profondità
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.
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
Kinect: Depth Data
31
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
Kinect: Depth DataEsempio:
32
Kinect: Depth DataPossiamo sapere se un punto si trova troppo vicino, troppo lontano o nella zona sconosciuta utilizzando tre proprietà dello stream di profondità:
33
KinectSensor.DepthStream.TooNearDepth
KinectSensor.DepthStream.TooNearDepth
KinectSensor.DepthStream.UnknownDepth
KinectSensor.DepthStream.UnknownDepth
KinectSensor.DepthStream.TooFarDepth
KinectSensor.DepthStream.TooFarDepth
34
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:
35
E’ anche possibile eseguire polling sullo Skeleton Stream esposto dalla KinectSensor.
Kinect: Skeletal tracking
36
Kinect: Skeletal Tracking
37
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.
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
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
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
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
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»
42
Si tratta della proprietà Skeleton.Position valorizzata quando
lo scheletro è completamente tracciato
Si tratta della proprietà Skeleton.Position valorizzata quando
lo scheletro è completamente tracciato
43
Kinect: AllFrameEventLa classe KinectSensor mette a disposizione un evento per ottenere contemporaneamente tutti e tre i frame visti in precedenza:
44
L’FPS, in questo caso, è pari al più basso tra i differenti stream.
Kinect: Audio
Il device dispone di una batteria di 4 microfoni con delle funzionalità di “audio processing” hardware:
45
• Multichannel echo cancellation (MEC)• Sound position tracking• Directional Microfone• Noise suppression e Noise reduction
Kinect: KinectAudioSource
La classe KinectSensor espone la proprietà AudioSource di tipo KinectAudioSource attraverso la quale è possibile gestire tutte le funzionalità audio.
46
Kinect : Sound PositionIl 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 è:
47
-50 0 +50
Kinect : Sound Source AnglePer gestire la variazione di angolo della sorgente sonora, è sufficiente gestire l’evento SoundSourceAngleChanged della classe KinectAudioSource:
48
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
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
51
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
Q&A (non sparate sul Kinect )
53
Best Kinect hack
Premio : un Kinect XBox (Microsoft)Premio : un Kinect XBox (Microsoft)
54
Riferimenti• Kinect SDK Web Site
http://www.microsoft.com/en-us/kinectforwindows/
• Coding4Fun Kinect Toolkit http://c4fkinect.codeplex.com/
• Kinect Toolbox http://kinecttoolbox.codeplex.com/
• Channel 9 Kinect for Windows SDK Quickstartshttp://channel9.msdn.com/Series/KinectQuickstart
• Coding4Fun @ Channel 9http://dev9.channel9.msdn.com/coding4fun/kinect
55