Microsoft Kinect SDK Depth calibration

前端 未结 1 375
没有蜡笔的小新
没有蜡笔的小新 2021-01-07 10:39

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

相关标签:
1条回答
  • 2021-01-07 11:36

    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.

    0 讨论(0)
提交回复
热议问题