Nei precedenti post abbiamo dato un’occhiata alle varie sorgenti messe a disposizione dalla nuova versione del Kinect.
Abbiamo visto come sia possibile recuperare il reader opportuno e sfruttare tale reader per ottenere i singoli frame desiderati.
Nella stragrande maggioranza delle applicazioni, però, abbiamo la necessità di elaborare più sorgenti contemporaneamente (basti pensare, ad esempio ad una applicazione che rileva il body del giorcatore e contemporaneamente mostra l’immagine proveniente dalla cam).
In questo caso, l’SDK ci viene in aiuto mettendoci a disposizione una sorgente particolare della MultiFrameSource.
L’utilizzo di questo tipo particolare di sorgente si differenzia rispetto all’utilizzo delle altre sorgenti “singole”. Le sorgenti singole sono esposte direttamente, tramite delle proprietà, dalla classe KinectSensor. Una volta ottenuta la reference alla sorgente, possimao utilizzare il metodo OpenReader per avere a disposizione il reader che, effettivamente, ci permette di consumare i dati.
Nel caso della MultiFrameSource, questa non è direttamente accessibile tramite la classe KinectSensor, ma quest’ultima ci fornisce un metodo (il metodo OpenMultiSourceFrameReader() ) per aprire il reader opportuno.
If Sensor IsNot Nothing Then
Sensor.Open()
MultiReader = Sensor.OpenMultiSourceFrameReader(FrameSourceTypes.Color Or
FrameSourceTypes.BodyIndex Or
FrameSourceTypes.Body)
End If
Nel precedente pezzo di codice osserviamo che il metodo OPenMultiSourceFrameReader accetta come argomento l’elenco delle sorgenti a cui siamo effettivamente interessati (enumerazione FrameSourceTypes):
Una volta ottenuto il reader, il procedimento con cui elaboriamo i frame provenienti dal device è analogo a quello delle altre sorgenti.
Il reader espone il metodo MultiSourceFrameArrived che possiamo gestire e che viene richiamato ogni volta che il frame è disponibile per l’eleborazione:
AddHandler MultiReader.MultiSourceFrameArrived, AddressOf MultiSourceFrameArrivedHandler
End If
L’argomento fornito dal metodo (di tipo MultiSourceFrameArrivedEventArgs) espone, in maniera analoga a quanto fanno i corrispettivi argomenti forniti dagli altri metodi di gestione dei frame, una proprietà, di tipo MultiSourceFrameReference.
Ancora una volta, come per gli altri source reference, abbiamo a disposizione il metodo AcquireFrame() per recuperare, effettivamente il frame.
L’istanza di MultiSourceFrame espone le reference ai singoli frame il cui utilizzo è già stato trattato nei precedenti post.
Nel seguente pezzo di codice, ad esempio, andiamo a gestire l’immagine proveniente dal device, i body e il body index:
Dim frameReference = e.FrameReference
Dim frame As MultiSourceFrame = Nothing
Try
frame = frameReference.AcquireFrame()
If frame IsNot Nothing Then
Using dc = DrawingGroup.Open()
DrawColorImage(frame, dc)
DrawBody(frame, dc)
DrawPlayerIndex(frame, dc)
End Using
End If
Catch ex As Exception
Finally
If frame IsNot Nothing Then frame.Dispose()
End Try
End Sub
Il codice per la gestione dell’immagine è, come possiamo vedere, del tutto simile a quello visto nel precedente post.
If frame Is Nothing Then Return
Using colorFrame = frame.ColorFrameReference.AcquireFrame()
If colorFrame IsNot Nothing Then
If colorFrame.RawColorImageFormat = ColorImageFormat.Bgra Then
colorFrame.CopyRawFrameDataToArray(Me.ColorData)
Else
colorFrame.CopyConvertedFrameDataToArray(Me.ColorData, ColorImageFormat.Bgra)
End If
Dim bitmap = New WriteableBitmap(colorFrame.FrameDescription.Width, colorFrame.FrameDescription.Height,
96.0, 96.0, PixelFormats.Bgr32, Nothing)
bitmap.WritePixels(New Int32Rect(0, 0, colorFrame.FrameDescription.Width, colorFrame.FrameDescription.Height),
Me.ColorData,
colorFrame.FrameDescription.Width * BytesPerPixel,
0)
dc.DrawImage(bitmap, New System.Windows.Rect(0, 0, colorFrame.FrameDescription.Width, colorFrame.FrameDescription.Height))
End If
End Using
End Sub
Le reference ai frame che non abbiamo selezionato in fase di apertura del reader non sono valorizzati.
Commenti