I am working on a 3D model reconstruction application with Kinect sensor. I use Microsoft SDK to get depth data, I want to calculate the location of each point in the real-w
The getDistance()
function you're using to calculate real depth is referred to kinect player detection. So check that you are opening your kinect stream accordingly or maybe you should get only the raw depth data
Runtime nui = Runtime.Kinects[0] ;
nui.Initialize(RuntimeOptions.UseDepth);
nui.DepthStream.Open(
ImageStreamType.Depth,
2,
ImageResolution.Resolution320x240,
ImageType.Depth);
and then compute depth by simply bitshifting second byte by 8:
Distance (0,0) = (int)(Bits[0] | Bits[1] << 8);
The first calibration methods should work ok even if you could do a little improvement using a better approximation given by Stéphane Magnenat:
distance = 0.1236 * tan(rawDisparity / 2842.5 + 1.1863) in meters
If you really need more accurate calibration values you should really calibrate your kinect using for example a tool such as the matlab kinect calibration:
http://sourceforge.net/projects/kinectcalib/
And double check obtained values with the ones you are currently using provided by Nicolas Burrus.
EDIT
Reading your question again I noticed that you are using Microsoft SDK, so the values
that are returned from kinect sensor are already real distances in mm. You do not need to use the RawDepthToMeters()
function, it should be used only with non official sdk.
The hardware creates a depth map, that it is a non linear function of disparity values, and it has 11 bits of precision. The kinect sdk driver convert out of the box this disparity values to mm and rounds it to an integer. MS Kinect SDK has 800mm to 4000mm depth range.