Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

51
Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!! Massimo Bonanni [email protected] http://codetailor.blogspot.com @massimobonanni

description

Slide della sessione "Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!" tenuta al Codemotion 2012

Transcript of Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Page 1: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Massimo Bonanni

[email protected]://codetailor.blogspot.com@massimobonanni

Page 2: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Agenda• Natural User Interface• Introduzione al Kinect

– Cosa c’è dentro– Architettura

• Kinect SDK– Camera Data– Depth data– Skeletal tracking– Audio

• Q&A

2

Page 3: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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.

Page 4: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

NUI : Evoluzione delle interfacce

4

Page 5: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 6: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 7: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Kinect: Architettura hardware

8

Page 8: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 9: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 10: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 11: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 12: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Kinect: ArchitetturaIl device restituisce 3 stream:

– Video– Depth– Audio

16

Page 13: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 14: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 15: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 16: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Kinect: La classe KinectSensorLa classe KinectSensor permette l’accesso alle funzionalità del Kinect:

20

Page 17: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 18: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Kinect: Camera Data

La classe KinectSensor mette a disposizione l’evento ColorFrameReady per la gestione dei frame video.

22

Page 19: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Kinect: ColorImageFrameReadyEventArgs

23

Page 20: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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.

Page 21: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 22: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

26

Page 23: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Kinect: Depth Data

27

La classe KinectSensor mette a disposizione l’evento DepthFrameReady per la gestione dei frame di profondità:

Page 24: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Kinect: DepthImageFrameReadyEventArgs

28

Page 25: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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.

Page 26: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 27: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 28: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Kinect: Depth DataEsempio:

32

Page 29: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 30: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

34

Page 31: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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.

Page 32: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Kinect: Skeletal tracking

36

Page 33: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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.

Page 34: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 35: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 36: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 37: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 38: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 39: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

43

Page 40: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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.

Page 41: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 42: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Kinect: KinectAudioSource

La classe KinectSensor espone la proprietà AudioSource di tipo KinectAudioSource attraverso la quale è possibile gestire tutte le funzionalità audio.

46

Page 43: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 44: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Kinect : Sound Source AnglePer gestire la variazione di angolo della sorgente sonora, è sufficiente gestire l’evento SoundSourceAngleChanged della classe KinectAudioSource:

48

Page 45: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 46: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 47: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

51

Page 48: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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

Page 49: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Q&A (non sparate sul Kinect )

53

Page 50: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

Best Kinect hack

Premio : un Kinect XBox (Microsoft)Premio : un Kinect XBox (Microsoft)

54

Page 51: Kinect + .NET = NUI : Interfacce naturali facili con Kinect!!!

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