Simplifying Kinect for Windows 1.x Skeleton Drawing
Saturday, January 11, 2014 at 03:55PM
Carl Franklin
KinectTools is an abstraction over the code that handles the Kinect v1 sensors,
Skeleton data, and drawing the skeleton. It exposes Brush and Pen properties for
drawing so you have control over the look of your skeleton. It also can place
a PNG file over the head as you move around, providing hours of jocularity.
If you've done any work with the Kinect for Windows 1.x SDK you've probably already
created an abstraction such as this. But if you haven't here's a nice one for you.
What's cool about this is that it uses the term Body which is what SDK 2.0 calls
a Skeleton. I've also written this abstraction for SDK 2.0 (only in pre-release)
so using this will get you ready for the future. The next version of the GesturePak
Recorder and sample code uses this abstraction as well.
Here's a very simple WPF app that uses the KinectTools SimpleBodyEngine class to
draw the skeleton in real time, put an image of my head on top of it, and turn
the background of the window red if you move your right hand out in front of your
body 1/3 of a meter.
using System;
using System.Windows;
using System.Windows.Media;
using Microsoft.Kinect;
using KinectTools;
namespace SimpleBodyEngineTest
{
/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>publicpartialclass MainWindow : Window
{
// This object makes handling Kinect Skeleton objects easy!
SimpleBodyEngine BodyEngine = new SimpleBodyEngine();
public MainWindow()
{
InitializeComponent();
// event handlersthis.Closing += MainWindow_Closing;
BodyEngine.BodyTracked += BodyEngine_BodyTracked;
// put Carl's head on top of the Skeleton
BodyEngine.HeadImageUri = new Uri("carl.png", UriKind.Relative);
// bind the XAML to the SimpleBodyEnginethis.DataContext = BodyEngine;
}
/// <summary>/// This event fires when a *tracked* skeleton frame is available/// </summary>/// <param name="sender"></param>/// <param name="e"></param>void BodyEngine_BodyTracked(object sender, BodyTrackedEventArgs e)
{
// Get the Z position of the hand and spinevar hand = e.Body.Joints[JointType.HandRight].Position.Z;
var spine = e.Body.Joints[JointType.Spine].Position.Z;
// if the hand is in front of the spine...if (Math.Abs(hand - spine) > .3)
// turn the background red
Background = Brushes.Red;
else
Background = Brushes.White;
}
void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
BodyEngine.Dispose();
}
}
}
Forget about the hundreds of lines of code to draw the Skeleton. If you just want to handle the data, read this blog post I wrote on the basics of Skeleton tracking. This code is so simple. Put up an image and bind it to a property. Create a new SimpleBodyEngine object and make it the DataContext. Done.