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

Post on 14-Jan-2015

1,209 views 0 download

Tags:

description

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

transcript

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

Massimo Bonanni

massimo.bonanni@domusdotnet.orghttp://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