Skip to content

Instantly share code, notes, and snippets.

@taylor224
Created March 12, 2015 04:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save taylor224/1a534cb9287a4205c91f to your computer and use it in GitHub Desktop.
Save taylor224/1a534cb9287a4205c91f to your computer and use it in GitHub Desktop.
Get Depth(Z position) of specified coordinate with Kinect v2
public partial class MainWindow : Window
{
private KinectSensor kinectSensor = null;
private CoordinateMapper coordinateMapper = null;
private MultiSourceFrameReader multiFrameSourceReader = null;
public MainWindow()
{
InitializeComponent();
// one sensor is currently supported
this.kinectSensor = KinectSensor.GetDefault();
// get the coordinate mapper
this.coordinateMapper = this.kinectSensor.CoordinateMapper;
// get the depth (display) extents
FrameDescription colorFrameDescription = this.kinectSensor.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Bgra);
FrameDescription frameDescription = this.kinectSensor.DepthFrameSource.FrameDescription;
// open multiframereader for depth, color, and bodyindex frames
this.multiFrameSourceReader = this.kinectSensor.OpenMultiSourceFrameReader(FrameSourceTypes.Depth | FrameSourceTypes.Color | FrameSourceTypes.Body);
this.multiFrameSourceReader.MultiSourceFrameArrived += this.Reader_MultiSourceFrameArrived;
}
private void Reader_MultiSourceFrameArrived(object sender, MultiSourceFrameArrivedEventArgs e)
{
MultiSourceFrame multiSourceFrame = e.FrameReference.AcquireFrame();
if (multiSourceFrame != null)
{
using (DepthFrame depthFrame = multiSourceFrame.DepthFrameReference.AcquireFrame())
{
if (depthFrame != null)
{
// Specified X, Y coordinate
// In 1920 x 1080 color frame
double x = 1000;
double y = 900;
FrameDescription depthFrameDescription = depthFrame.FrameDescription;
depthWidth = depthFrameDescription.Width;
depthHeight = depthFrameDescription.Height;
depthframeData = new ushort[depthWidth * depthHeight];
depthFrame.CopyFrameDataToArray(depthframeData);
CameraSpacePoint[] csp = new CameraSpacePoint[1920 * 1080];
this.coordinateMapper.MapColorFrameToCameraSpace(depthframeData, csp);
// Depth(Z Position) of specified coordinate
float DepthPosition = csp[(1920 * Convert.ToInt16(y)) + Convert.ToInt16(x)].Z;
}
}
}
}
}
@taylor224
Copy link
Author

Get Depth of specified coordinate with Kinect V2

Use this when you want to get depth(Z coordinate) of specified X,Y coordinate.
It will return float Z coordinate.
Z value means meter distance from Kienct sensor.
1 meter = 1.0 / 2.5 meter = 2.5
If Z value is zero, It means Kinect sensor could not get distance of that coordinate.
Max X coordinate is 1920 and Max Y coordinate is 1080.
X,Y coordinate is referenced by ColorFrame(1920x1080) not DepthFrame(512x424).

This source is part of WPF program. Modify it to fit your program.
MapColorFrameToCameraSpace() function can make your program update slowly. Please notice about this.

You need Kinect for Windows V2 sensor, Kinect SDK 2.0 and Visual Studio 2013 to use this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment