It's time for a really interesting and useful Kinect tutorial. We'll see how to achieve full body tracking using Kinect sensor, OpenNI library and Windows Presentation Foundation.
I found OpenNI C# samples a little messy, so I decided to develop a .NET 4 wrapper library which could be used into WPF applications whithout requiring .NET 2 staff like GDI+, System.Drawing, etc. I named it Nui.Vision and it's part of a larger framework I currently develop. Nui.Vision is a .NET 4 assembly which offers an easy-to-use body tracking API!
Update 20/04/2011
Nui.Vision is now compatible with the latest release of OpenNI framework (1.1.0.41). I have made some changes and bug-fixes to it, including the skeleton-display fix provided by roni26_wu (see comments below). An open-source version of Nui.Vision is coming soon!
Prerequisites
Using the Library
Using Nui.Vision is a piece of cake. All body tracking is done in the background, so you only need to update your user interface when the proper events fire. Firstly, add a reference to OpenNi.net.dll and Nui.Vision.dll. Also import a valid configuration file to your project, as described here. Do not forget to type the corresponding using statement:
using Nui.Vision;
Then declare a new NuiUserTracker
object and initialize it in the constructor. Provide the path of the configuration file you previously imported (do not forget to paste the same file in the Debug/Release folders of your application):
_skeleton = new NuiUserTracker("SamplesConfig.xml");
Just below that, you need to define the UserUpdated
event.
_skeleton.UsersUpdated += new NuiUserTracker.UsersUpdatedHandler(Skeleton_UserUpdated);
A proper event handler is created. The NuiUserEventArgs
parameter provides you with a collection of all the recognized users! You can now get the coordinates (X, Y and Z) of every body part of every user (OpenNI currently supports 15 body parts)!
foreach (var user in e.Users) {
float headX = user.Head.X;
float headY = user.Head.Y;
float headZ = user.Head.Z;
float neckX = user.Neck.X;
float neckY = user.Neck.Y;
}
Quite easy, huh?
Here is a list of all the available body parts:
- Head
- Neck
- LeftShoulder
- LeftElbow
- LeftHand
- RightShoulder
- RightElbow
- RightHand
- Torso
- LeftKnee
- LeftHip
- LeftFoot
- RightKnee
- RightHip
- RightFoot
You may now start developing cool WPF Kinect applications and games. Imagination's the limit.