It's official! Microsoft released its Kinect SDK we have all been waiting for! Kinect SDK offers natural user interaction and audio APIs. It can also be used with the existing Microsoft Speech API. Today we'll see how to create a WPF application performimg skeleton tracking.
Not a surprize, this official SDK provides an API similar to OpenNI's one. That's pretty cool for me (and anyone following my blog), because not much stuff needs to be learned from the beginning.
Uninstall any previous Kinect drivers such as PrimeSensor, CL NUI, OpenKinect, etc).
Download the official Kinect SDK and install. System requirements:
Important: Remember to restart your PC after the installation!
Launch Visual Studio and create a new WPF application.
Add a reference to Microsoft.Research.Kinect assembly, found under the .NET tab. Do not forget to include its namespace in your xaml.cs file. I just included Nui namespace as we do not currently need the audio capabilities.
It's time to create the user interface: An image displaying the raw camera output and a canvas displaying the users' joints:
<Image Name="img" Width="640" Height="480" />
<Canvas Name="canvas" Width="640" Height="480" />
We are up to the most interesting part right now! Let's see how we obtain the raw camera image and how we perform user skeleton tracking! Open your xaml.cs file and start typing.
Kinect API offers a
Runtime object which will accomplish the mission:
Runtime _nui = new Runtime();
After that, we have to initialize the Runtime object and then open the video stream:
RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseColor);
Finally, we need to define the proper event handlers for the camera image display and the skeleton recognition. Pretty simple:
_nui.VideoFrameReady += new EventHandler<imageframereadyeventargs>(
_nui.SkeletonFrameReady += new EventHandler<skeletonframereadyeventargs>(
Here follows the implementation of each method. They are self explantory and quite similar to what my Nui.Vision library does.
void Nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)
var image = e.ImageFrame.Image;
img.Source = BitmapSource.Create(image.Width, image.Height, 96, 96,
PixelFormats.Bgr32, null, image.Bits, image.Width * image.BytesPerPixel);
void Nui_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
foreach (SkeletonData user in e.SkeletonFrame.Skeletons)
if (user.TrackingState == SkeletonTrackingState.Tracked)
foreach (Joint joint in user.Joints)
Done! Build and run your project. Download demo with source code.
Attention: I have omitted some lines of code from this blog post in order to make it clearer. I suggest you downolad the sample project and have a look at it. You'll find that the X, Y and Z-axis values conversion from centimetres to pixels is quite interesting. In my example, I actually used the basic idea from Coding for Fun Kinect Toolkit.