lunedì 19 settembre 2011

Comunicando: History Tech Day

Vi segnalo l’evento Comunicando - da strumenti di calcolo a strumenti di comunicazione- che si terrà il prossimo 24 Settembre 2011.
L’evento è dedicato all'evoluzione delle piattaforme di sviluppo, e si terrà ad Avellino, presso il Carcere Borbonico di Avellino sito in Corso Vittorio Emanuele II, dalle 9.00 alle 17.30.

Immagine mappa

Purtroppo i posti sono limitati quindi affrettatevi a registrarvi.
Tag di Technorati: ,

mercoledì 14 settembre 2011

Webinar LightSwitch DevExpress

Vi segnalo un interessante webinar (un americanismo per chiamare una sessione on-line) interamente dedicato a LightSwitch e tenuto da Alessandro Del Sole.

Il webinar è a cura di DevExpress e si terrà il giorno 4 Ottobre 2011 alle ore 19:00 (il link del webinar è http://www.devexpress.com/Support/Webinars/details.xml?id=IntroLightSwitchDelSole.

Maggiori informazioni sul post di Alessandro.

Se volete cominciare a capire cosa è LightSwitch e se fa al caso vostro, non perdete l’occasione!!!

 

Tag di Technorati: ,,

Windows 8 @ BUILD : arrivato!!!!

Ieri, durante la keynote di BUILD tenutasi ad Anaheim in California, Steven Sinofsky mostrato alcune delle potenzialità del nuovo Windows 8.

Per vedere la Keynote potete collegarvi all'indirizzo: http://www.microsoft.com/presspass/events/build/

Da questa mattina presto è stata rilasciata la preview di Windows 8 e degli strumenti di sviluppo. Per scaricare le ISO usate l'indirizzo http://msdn.microsoft.com/en-us/windows/home/

Le sessioni dell'evento BUILD sono disponibili all'indirizzo: http://channel9.msdn.com/Events/BUILD/BUILD2011?sort=sequential&direction=desc&term=

A questo punto non ci resta che “giocare”!!!!

 

venerdì 9 settembre 2011

DomusDotNet : Pomeriggio Entity Framework

image

DomusDotNet, in collaborazione con Microsoft, EF Profiler by Hibernating Rhinos, Edizioni FAG, O’Reilly, organizza l’evento Pomeriggio Entity Framework. Un pomeriggio dedicato all’ORM di casa Microsoft.

Se avete dubbi, perplessità, domande o semplicemente volete conoscere EF, potrebbe essere il caso di investire un pomeriggio e venire a seguirci!!!

 

mercoledì 7 settembre 2011

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).


lunedì 5 settembre 2011

Alla scoperta del Kinect: gli smooth parameters

Abbiamo accennato in questo post come sia possibile eseguire un filtro sui dati grezzi provenienti dal Kinect per “smussare” e correggere le fluttuazioni.

In questo post vorrei cercare di capire (per primo io) quale è il significato dei vari parametri utilizzabili.

Riprendiamo il discorso dall’inizializzazione della classi Runtime e l’impostazione dei parametri di smoothing:

  1. Try
  2.     _Nui = New Runtime
  3.     _Nui.Initialize(RuntimeOptions.UseSkeletalTracking)
  4.     AddHandler _Nui.SkeletonFrameReady, AddressOf SkeletonFrameReadyHandler
  5.  
  6.     _Nui.SkeletonEngine.TransformSmooth = True
  7.     Dim parameters = New TransformSmoothParameters() With {.Smoothing = 1.0F,
  8.                                                         .Correction = 0.1F,
  9.                                                         .Prediction = 0.1F,
  10.                                                         .JitterRadius = 0.05F,
  11.                                                         .MaxDeviationRadius = 0.05F}
  12.     _Nui.SkeletonEngine.SmoothParameters = parameters
  13. Catch ex As Exception
  14.  
  15. End Try

La classe TransformSmoothParameters, come possiamo vedere, ha 5 proprietà che dovrebbero consentire il filtraggio delle imprecisioni e dei rumori che i sensori del Kinect introducono nei dati grezzi.

Smooting : lo smoothing (il termine italiano più vicino è “pulizia”), in elaborazione delle immagini, consiste nell’applicare una funzione di filtro il cui scopo è quello di mettere in evidenza la parte del segnale “buona” cercando di sopprimere l’eventuale rumore dovuto da cause di diversa natura che, comunque, sporcano il segnale stesso. Nel nostro caso, piccoli movimenti del corpo umano, possono determinare del rumore che rende la tracciatura dello stesso poco affidabile. La proprietà Smoothing (che accetta il range [0,1]) permette di impostare la quantità di smoothing da applicare. Il valore 0 indica che non viene applicato alcun smoothing mentre l’effetto smoothing aumenta all’avvicinarsi al valore 1. Aumentare il valore di questa proprietà aumenta la latenza del segnale.

Correction : la proprietà permette di impostare la correzione

Prediction : permette di impostare il numero di frame predetti dal motore.

Jitter Radius : il jitter è la variazione di una o più grandezze caratteristiche di un segnale che possono minare l’integrità del segnale stesso. La proprietà JitterRadius consente di impostare il raggio di riduzione del jitter (espresso in metri). Qualsiasi jitter che superi il raggio impostato viene normalizzato al raggio stesso.

Maximum Deviation Radius : permette di specificare il massimo scostamento (in metri) dei dati filtrati rispetto ai dati grezzi. I valori filtrati che superano la distanza impostata rispetto ai dati grezzi, vengono normalizzati a questa distanza (rispetto al valore filtrato).

Non esistono dei valori “buoni” per qualsiasi applicazione ma è necessario procedere sperimentando i migliori valori di smoothing. L’apporto di tali correzioni dipende dall’ambiente circostante e, quindi, anche a parità di applicazione possono variare in base a dove il Kinect è posizionato.

Per chi fosse interessato ad approfondire, è necessario sapere che il filtro attualmente utilizzato nell’SDK del Kinect si basa sul metodo a doppio esponenziale di Holt (link).