Passa ai contenuti principali

Post

Visualizzazione dei post da Agosto, 2011

Alla scoperta del Kinect : gli scheletri e l’uomo vitruviano

Cosa c’entra Leonardo e il suo Uomo Vitruviano, gli scheletri ed il Kinect? Apparentemente nulla, ma leggendo questo post scoprirete che, invece, un legame c’è.Abbiamo visto in precedenti post che l’infernale aggeggio (il Kinect) ci permette di ottenere, in maniera molto facile, le immagini video e le immagini di profondità. Già con questi due insiemi di informazioni potremmo realizzare una sorta di interazione tra i player ed il nostro applicativo.L’SDK del Kinect, però, fa molto di più perché è in grado di fornirci gli “scheletri” dei player disposti davanti ad esso.Vediamo come procedere per ricavare ciò.La classe Runtime (di cui abbiamo parlato in questo post) prevede un evento chiamato SkeletonFrameReady che viene sollevato quando SDK ha a disposizione un oggetto di tipo SkeletonFrame pronto per essere elaborato.L’istanza di questo oggetto è passata come proprietà dell’argomento dell’evento SkeletonFrameReady:La classe SkeletonFrame, come possiamo vedere, espone una serie di prop…

Alla scoperta del Kinect: video e depth insieme per eliminare lo sfondo

Nel precedenti post (qui e qui) abbiamo visto singolarmente come utilizzare lo stream video e i dati di “distanza” che provengono dal nostro Kinect.In questo post cercheremo di utilizzare contemporaneamente i due stream in modo da utilizzare le informazioni di distanza per modificare l’immagine video.In particolare vedremo come (in maniera molto rozza e, sicuramente, ottimizzabile) riuscire a modificare l’immagine proveniente dallo stream video per lasciare visibili i player uniformando lo sfondo con un colore a nostra scelta.Quello che faremo è prendere le singole immagini video e depth fornite dagli eventi del Runtime del Kinect, scandire l’immagine di depth e, ogni volta che si ha un player index pari a 0, colorare il corrispondente pixel dell’immagine video con il colore da noi scelto.Uno dei problemi che si pongono immediatamente è che la risoluzione dell’immagine video sia diversa dalla risoluzione dell’immagine depth.Ad esempio nel seguente pezzo di codice l’immagine video è 64…

Alla scoperta del Kinect : questione di profondità

Nei due precedenti post (link e link) abbiamo fatto conoscenza con “l’aggeggio” kinect e visto come sia possibile, in maniera molto semplice, gestire lo stream video proveniente dalla camera.In questo post diamo un’occhiata alla capacità che ha il Kinect di fornire frame in cui l’immagine non è la rappresentazione fedele della realtà che ci circonda ma la rappresentazione bidimensionale della distanza degli oggetti dai sensori di profondità.L’aggeggio, infatti, dispone di un sensore di profondità che è in grado di fornirci la distanza dei punti inquadrati da se stesso e, in più, è in grado di dirci a quale “player” fa riferimento ogni singolo pixel.Ma andiamo con ordine.Per abilitare la ricezione del depth stream è necessario:Istanziare la classe Runtime; Agganciare il gestore dell’evento DepthFrameReady; Inizializzare l’istanza della Runtime scegliendo una delle opzioni che abilitano il sensore di profondità; Aprire lo stream dei dati relativi alla profondità. A livello di codice (ab…

Alla scoperta del Kinect: calcoliamo l’FPS degli stream video.

Abbiamo visto nel precedente post della serie come poter utilizzare il nostro Kinect per catturare gli stream Video e Depth e visualizzarli.Il questo post vogliamo vedere due possibili modi per calcolare l’effettivo FPS di tali stream, ovvero quanti frame nell’unità di tempo ci arrivano.Questa funzione non esiste out-of-the-box tra le funzionalità esposte dall’SDK, ma è molto semplice calcolare tale numero basandoci sulle istanze della classe ImageFrame che ci arrivano nei gestori degli eventi DepthFrameReady e VideoFrameReady.Per chi avesse perso il precedente post, la classe Runtime (fulcro dell’SDK di Kinect) solleva uno dei precedenti eventi ogni volta che è disponibile una immagine video o depth.Possiamo gestire il flusso delle immagini tramite dei gestori di evento:PrivateSub DepthFrameHandler(sender AsObject, e AsImageFrameReadyEventArgs)    .    .    .EndSubPrivateSub VideoFrameHandler(sender AsObject, e AsImageFrameReadyEventArgs)    .    .    .EndSub L’argomento degli eventi …

Alla scoperta del Kinect: la classe Runtime

La classe Runtime (del namespace Microsoft.Research.KInect.Nui e contenuta nell’assemlby Microsoft.Research.Kinect) è per la nostra avventura come lo specchio per Alice: la porta peser entrare in un altro mondo……quello del Kinect!!!A parte gli scherzi, la classe Runtime è fondamentale perché espone tutte le funzionalità che possiamo utilizzare del Kinect per quel che riguarda la parte delle gesture.Di fatto un’istanza della classe Runtime gestisce un device connesso e la sua struttura è mostrata nella seguente immagine:Per poter accedere alle funzionalità del sensore video, di profondità e allo skeleton engine (il “robo” che fa si che il Kinect individui la struttura di  un corpo umano che si agita come un forsennato davanti a lui) è sufficiente creare un’istanza della classe Runtime.Ma procediamo con ordine, innanzitutto per avere visibilità sulla classe Runtime è necessario referenziare la libreria Microsoft.Research.Kinect e lo facciamo, come accade usualmente, utilizzando l’opzion…