Friday, July 27, 2012

A non-traumatic migration from Kinect SDK 1.0 to 1.5

Hi All!

Today I'll speak about the migration from Kinect SDK 1.0 to SDK 1.5 . It was mostly easy, but there are some non very clear things that made me spent more time that I wanted:

  1. When you're working with a WPF application, sometimes you must modify the XAML archive. The KinectSensorChooser tool has changed the way of access if you want to upgrade; so if you have something like that:

    <Window x:Class="MyProject.MainWindow"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           Title="MainWindow" Height="522" Width="897" Loaded="Window_Loaded" xmlns:myNameSpace="clr-namespace:Microsoft.Samples.Kinect.WpfViewers;assembly=Microsoft.Samples.Kinect.WpfViewers" Closing="Window_Closing" Name="RecognizerMainWindow">
        <Grid>
            <myNameSpace:KinectSensorChooser HorizontalAlignment="Left" Margin="326,59,0,0" Name="kinectSensorChooser1" VerticalAlignment="Top" Width="340" Height="240" />
    ...


    you must change the XML namespace and the reference for the chooser in that way for the SDK 1.5:
    <Window x:Class="MyProject.MainWindow"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           Title="MainWindow" Height="522" Width="897" Loaded="Window_Loaded" xmlns:my="clr-namespace:Microsoft.Kinect.Toolkit;assembly=Microsoft.Kinect.Toolkit" Closing="Window_Closing" Name="RecognizerMainWindow">
        <Grid>
            <my:KinectSensorChooserUI HorizontalAlignment="Left" Margin="538,243,0,0" Name="kinectSensorChooserUI" VerticalAlignment="Top" Width="99" Height="40" KinectSensorChooser="{Binding ElementName=kinectSensorChooser1, Path=KinectSensorChooser.KinectSensorChooser}" />

    so, just change the property and the reference: from Microsoft.Samples.Kinect.WpfViewers to Microsoft.Kinect.Toolkit, and therefore the inner field.

  2. Now, in the application code, it has changed also the way of declare the Kinect Sensor, before it was a DependencyPropertyChanged event as:

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
     kinectSensorChooser1.KinectSensorChanged += new DependencyPropertyChangedEventHandler(kinectSensorChooser1_KinectSensorChanged);
    }

    void kinectSensorChooser1_KinectSensorChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
     KinectSensor oldSensor = (KinectSensor)e.OldValue;
     StopKinect(oldSensor);
     KinectSensor newSensor = (KinectSensor)e.NewValue;
    }


    but now, you must declare it as follows:
    KinectSensorChooser sensorChooser = new KinectSensorChooser();

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
     this.kinectSensorChooserUI.KinectSensorChooser = sensorChooser;
     sensorChooser.KinectChanged += new EventHandler<KinectChangedEventArgs>(sensorChooser_KinectChanged);
     sensorChooser.Start();
    }
    void sensorChooser_KinectChanged(object sender, KinectChangedEventArgs e)
    {
     KinectSensor oldSensor = (KinectSensor)e.OldSensor;
     StopKinect(oldSensor);
     newSensor = (KinectSensor)e.NewSensor;
    }

And that's all folks!! hope that you migration would be less traumatic with these hints (=
Lotta love at the garden,
JuananRey.

Thursday, July 26, 2012

Increasing Kinect Accuracy in Face Tracking with Kinect SDK 1.5

Hi All! From now I'll write in English as many Kinect professionals don't speak spanish :P

So, the problem for today is to detect enough accurate changes in face via Kinect FaceTracking.

Before starting the explanation, I want to recommend you a pretty good introduction to FaceTracking.

And now, the Holy Grail, simple, that will enlight you:

KinectSensor ks;
// (here goes the initialization and your stuff)
ks.ColorStream.Enable(ColorImageFormat.RgbResolution1280x960Fps12);

Tah-dah! Just putting this resolution the accuracy grows very much!

And remember: it doesn't matter neither the SkeletonStream (enable the Seated mode and near mode if you use Kinect for Windows) nor the DepthStream ( put it in the LOWEST resolution possible if you're just using it for FaceTracking).

Greets and lotta love at the disco!


Monday, July 23, 2012

BadImageFormatException, multiprocesadores y cintas de vídeo

Bueno, como buen noob en esto de visual studio, he pecado en el ensamblado de múltiples soluciones.
Os suena de algo este error?

System.BadImageFormatException


A mí sí. FaceTracking de Kinect. Dolor, mucho dolor. No he encontrado NINGUNA referencia muy clara de cómo resolverlo en mi caso, el error que indicaba es el siguiente:

El ensamblado al que se hace referencia 'nombredeensamblado' tiene como destino un procesador distinto"

Sería esto? tendría algo que ver? Pues mágicamente como vino, se solucionó de estas dos maneras.

Aquí van dos soluciones, una adecuada y otra chapucera:

1) Adecuada: cuando se os presente un error de este tipo, lo más fácil es descargar un proyecto que trabaje EXCLUSIVAMENTE para vuestra versión para evitaros problemas (en mi caso, tenía dos versiones de ejecución, una de x64 y otra de x86, y parece ser que se iba directamente a por la de 64 bits por más que yo intentase apañarlo mediante visual studio). Consejo noob: quitad la referencia y volved a instalaros desde el Developer Toolkit de Kinect el FaceTracking.Funciona y todo es de color.

2) Chapucera: Cambiar la "configuración de soluciones" de Debug a Release: Cuando estás en Debug, es cuando te salta el error del procesador distinto; Release obvia ese error y lo ejecuta a toda costa (esto es, corregidme si me equivoco, una diferencia notable que no he leído en ningún otro sitio). De nuevo, vuelve a funcionar, con el pequeño engorro de tener que poner:
 #if (!DEBUG)    
  // Porción de código que se ejecuta cuando estemos en Release  
 #endif  

Y esto ha sido todo por hoy. Estoy abierto a correcciones y espero que os ayude =).

Saturday, July 21, 2012

Hello Kinect!

Buenas a todos los que quieran iniciarse o estén en proceso, como yo, de jugar con la Kinect y conseguir hacer alguna cosilla con ello.
Trabajo con Visual Studio 2010, C# y el Kinect antiguo , por lo que puede que haya algunas diferencias entre vuestros intentos y los míos de crear algo que llegue a buen puerto.
Usaré este blog principalmente para ahorraros tiempo y alguna que otra lagrimilla en relación con:
- Cosas algo ambiguas de Kinect (migrar al SDK 1.5 por ejemplo).
- Cosas que os causarán porrazos y algún que otro pataleo en C# (ensamblaje, versiones debug / release...).
- Ambigüedades del centro de documentación de Microsoft (haberlas haylas).
- Ejemplos de mi proyecto (un intento de "detector de emociones", lo forkearé en Github en algún momento de paz espiritual y gratitud).

Además estoy abierto a todo tipo de sugerencias en otras plataformas o entornos: C++, openCV... y sugerencias de mejora; si os interesa colaborar, no dudéis en contactar conmigo. Un saludo =)