This is part one of series documenting my experiments with Kinect for Windows SDK.
After first two or three artices this seriers should make quite good walktrough for beginners and nice reference for more advanced developers.
Series table of contents:
- Coming soon...
Kinect is a sensor originaly developed for Microsoft's XBOX 360 console.
It has regular video camera, IR camera for depth detection and array of microphones.
Here you cand find all information about Kinect and its SDK for Windows.
To use SDK in your application you need to reference
Microsoft.Research.Kinect assembly. It contains two namespaces:
Microsoft.Research.Kinect.Nui - Used for visual features
Microsoft.Research.Kinect.Audio - Used for audio features
At this point I will focus on NUI part of SDK and its features:
DepthStream - Interface to depth sensor
VideoStream - Interface to video camera
SkeletonEngine - Engine for tracing up to two human bodies
NuiCamera - Device info and control (mainly for getting/setting elevation angle)
To start coding you need to use the
Runtime class from SDK. This class provides an entry point for device enumeration and initialization. In most of cases all you need is to get instance of
Runtime rt = Runtime.Kinects;
This will give you control over first Kinect found in system. If you have more Kinects connected you will want to enumerate devices trough
foreach (Runtime CurrentRuntime in Runtime.Kinects)
No matter which way you will get reference to
Runtime you must
Initialize() it. Failing to remember about it will cause exceptions while accessing ImageStreams or SkeletonEngine.
Initialize() you should check the status of runtime and device by examining
Documentation describes statuses as:
Connected - The sensor is fully connected and ready.
Error - An error has occured.
Disconnected - The sensor is not connected to the USB connector.
NotPowered - The sensor is not powered up.
NotReady - Some part of the sensor is not yet ready.
You should only proceed if
Status can be monitored by attaching to
Upon initialization several options are passed to
According to documentation their meaning is quite straightforward:
UseColor - Process color information.
UseDepth - Process depth information.
UseDepthAndPlayerIndex - Process the player index.
UseSkeletalTracking - Process skeletal tracking data.
Not enabling some of features probably will result in performance changes. I will try to verify it later.
Next thing you should do is to
Open() the ImageStreams. Again, failing to remember about this will result in exceptions when accessing frames.
Providing wrong parameters will result in
CurrentRuntime.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution1280x1024, ImageType.Color);
CurrentRuntime.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex);
Pieces of code shown above are taken from my first working application - InfoTool.
At the moment all this tool does is:
- Enumerating trough devices
- Initializing all devices
- Opening ImageStreams
- Displaing all information collected during steps above
Here is a sample output:
This sample output shows that there is one Kinect available for usage and all initializations where executed successfully.
As you can see,
DepthStream have some improper parameters at startup and are changed to proper ones by calling
Points of Interest
Next experiments will include:
- Determine best way of working with ImageStreams
- Skeletal tracking
- Benchmarking / Performance tuning
2011-11-20: Initial submission
2012-01-06: Added series TOC and updated source code (common for whole series)