Passa ai contenuti principali

Alla scoperta del Kinect : utilizzo del Kinect in modalità polling

Nei precedenti post abbiamo visto che il Kinect ci mette a disposizione una serie di eventi che ci permettono di recuperare i frame video, di profondità o gli skeleton data.

Possiamo utilizzare le potenzialità del Kinect anche senza fare ricorso alla gestione di tali eventi ma utilizzando una tecnica di polling sugli streams.

Partiamo dall’inizio: la classe Runtime (già vista in precedenza) ci mette a disposizione 3 proprietà utilissime in questo contesto e che contengono proprio gli stream di cui sopra.

image

  • VideoStream : è un’istanza di ImageStream che incapsula lo stream video;
  • DepthStream : è un’istanza di ImageStream che incapsula lo stream dei dati di profondità;
  • SkeletonEngine : è il motore di skeletal Tracking che permette l’accesso ai frem di skeleton data.

In particolare osserviamo la presenza, in tutte le classi in gioco, del metodo GetNextFrame il cui risultato è un oggetto di tipo ImageFrame per il VideoStream e per il DepthStream e SkeletonFrame per lo SkeletonEngine.

ImageFrame e SkeletonFrame sono esattamente le istanze che ci vengono restituite all’interno degli eventi della classe Runtime utilizzati in precedenza.

Per questo motivo possiamo utilizzare questo metodo per accedere allo stream e recuperare il frame che ci interessa.

L’applicazione allegata a questo post altro non fa che visualizzare lo stream video e depth utilizzando un polling.

In particolare vengono utilizzati due Task che si occupano di eseguire il “polling” accedendo ai differenti stream.

  1. Private Nui As Runtime
  2.  
  3. Private VideoWorkTask As Task
  4. Private DepthWorkTask As Task
  5. Private WorkTaskTokenSource As CancellationTokenSource
  6.  
  7. Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
  8.     Try
  9.         Nui = New Runtime
  10.         Nui.Initialize(RuntimeOptions.UseColor Or RuntimeOptions.UseDepthAndPlayerIndex)
  11.         Nui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color)
  12.         Nui.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex)
  13.  
  14.         WorkTaskTokenSource = New CancellationTokenSource()
  15.  
  16.         Dim cancellationToken = WorkTaskTokenSource.Token
  17.         VideoWorkTask = New Task(New Action(Of Object)(AddressOf VideoWorkTaskCode), Nui, cancellationToken)
  18.         VideoWorkTask.Start()
  19.  
  20.         cancellationToken = WorkTaskTokenSource.Token
  21.         DepthWorkTask = New Task(New Action(Of Object)(AddressOf DepthWorkTaskCode), Nui, cancellationToken)
  22.         DepthWorkTask.Start()
  23.     Catch ex As Exception
  24.  
  25.     End Try
  26. End Sub

Viene inizializzata l’istanza di Runtime e gli stream Video e Depth, non vengono agganciati i gestori di evento ma vengono avviati due task che si occupano di recuperare i frame:

  1. Private Sub VideoWorkTaskCode(obj As Object)
  2.     Dim nui = CType(obj, Runtime)
  3.     While Not WorkTaskTokenSource.IsCancellationRequested
  4.         If nui IsNot Nothing AndAlso nui.VideoStream IsNot Nothing Then
  5.             Dim frame = nui.VideoStream.GetNextFrame(0)
  6.             If frame IsNot Nothing Then
  7.                 Dispatcher.BeginInvoke(Sub()
  8.                                            Me.VideoImage.Source = frame.ToBitmapSource()
  9.                                        End Sub)
  10.             End If
  11.         End If
  12.         System.Threading.Thread.Sleep(100)
  13.     End While
  14. End Sub
  1. Private Sub DepthWorkTaskCode(obj As Object)
  2.     Dim nui = CType(obj, Runtime)
  3.     While Not WorkTaskTokenSource.IsCancellationRequested
  4.         If nui IsNot Nothing AndAlso nui.DepthStream IsNot Nothing Then
  5.             Dim frame = nui.DepthStream.GetNextFrame(0)
  6.             If frame IsNot Nothing Then
  7.                 Dispatcher.BeginInvoke(Sub()
  8.                                            Me.DepthImage.Source = frame.ToBitmapSource()
  9.                                        End Sub)
  10.             End If
  11.         End If
  12.         System.Threading.Thread.Sleep(100)
  13.     End While
  14. End Sub

A differenza della gestione degli eventi vista nei precedenti post, in questo caso i task vengono eseguiti in threads differenti dal principale ed è, quindi, necessario l’utilizzo del Dispatcher per aggiornare l’interfaccia.

Il metodo GetNextFrame prevede un parametro che indica quanti millisecondi attendere prima di restituire il frame.

Il valore di ritorno di GetFrame può anche essere nothing (nel caso che il frame non sia ancora pronto).

Questa tecnica è un “pelino” più complicata di quella Event-Driven e deve essere utilizzata quando l’applicazione lo richiede (ad esempio abbiamo la necessità di recuperare un frame ogni x secondi).


Commenti

Post popolari in questo blog

VB.NET: Convertire un file DOC in RTF e PDF con office interop

In questo post vorrei proporvi del codice per poter convertire un file .doc in un file .rtf oppure .pdf utilizzando le API di interoperabilità di Office.Creeremo una classe, DocConverter, che esporrà le due funzionalità sopra citate.Cominciamo con il prevedere un attributo privato della classe che rappresenterà l’applicazione Word che utilizzeremo per la conversione. Creeremo l’istanza dell’attributo privato all’interno del costruttore della classe:PublicSubNew()
IfNot CreateWordApp() Then
ThrowNew ApplicationException("Assembly di interoperabilità con Office non trovato!")
EndIf
EndSub
Private _wordApp As Word.ApplicationClass
ProtectedFunction CreateWordApp() AsBoolean
Dim retval = True
Try
_wordApp = New Word.ApplicationClass()
_wordApp.Visible = False
Catch ex As System.Exception
_wordApp = Nothing
retval = False
EndTry
Return retval
EndFunction

La conversione del file doc sarà effettuata aprendo il file stesso ed eseguendo un’operazione di SaveAs:

Pr…

Cambiare la lingua di Visual Studio 2008

Oggi ho avuto qualche problema installando Windows Mobile 6 Professional SDK Refresh e Windows Mobile 6 Standard SDK Refresh.Scaricati i file di installazione e installati, ho provato a creare un progetto di tipo Windows Mobile 6.0 e mi sono beccato questo errore:Dopo qualche smanettamento abbiamo scoperto (e ringrazio il mitico Matteo per l’aiuto) che il mio Visual Studio 2008, pur essendo in Inglese (prova ne era il fatto che gli hotfix e la SP installata erano nella lingua di Albione) aveva come lingua impostata quella del sistema operativo (italiano).Ovviamente, non avrebbe mai potuto trovare la cartella 1040 (italiano) visto che l’installazione dell’SDK aveva supposto che la lingua del Visual Studio fosse Inglese (1033).La soluzione del problema è duplice:1) Duplicate la cartella 1033 presente nel percorso evidenziato dall’errore e la rinominate 10402) cambiate la lingua di Visual Studio.Per questa ultima eventualità basta andare nel menù Strumenti/Opzioni:e cambiare il linguaggi…

Tascam DR-05 registratore digitale per tutti

Diverso tempo fa ho acquistato il registratore digitale Tascam DR-05 e, ora, dopo diversi mesi di utilizzo, posso dire la mia a proposito.

Si tratta di un ottimo registratore digitale con microfono stereo che permette di ottenere registrazioni di ottima qualitaà anche in ambienti non perfetti dal punto di vista acustico.

Interessante la possibilità di utilizzare un cavalletto di piccole dimensioni come HAMA Mini treppiede o Mini Cavalletto Universale per tenere il microfono sollevato dal tavolo in fase di registrazione grazie allàattacco universale per macchina fotografica che il microfono ha nella parte inferiore.

Da segnalare anche il menu’ ben fatto e la possibilita’ di utilizzare una scheda SD esterna per memorizzare i file audio. Anche a livello di consumo batterie non e’ niente male. Consiglio l’uso delle alcaline non ricaricabili.

Il mio utilizzo e’ stato prettamente di registrazione di podcast vocali (no musica) ma le recensioni confermano che se la cava egregiamente con la mu…