Kinect原始深度以米为单位的距离

时间:2012-01-11 18:36:35

标签: kinect depth

我正在尝试将Kinect深度贴图转换为以米为单位的距离。问题是,对于深度图值'1080'及其周围,距离太大,因为分母中的项变得非常接近'0'。对于高于'1090'的值,距离为负。

if (depthValue < 2047) 
{
  depthM = 1.0 / (depthValue*-0.0030711016 + 3.3309495161);
}

2 个答案:

答案 0 :(得分:5)

正确答案实际上是对您的问题的评论。给出的数字实际上是以毫米为单位的距离。要获得此数字,您需要使用骨架关节并调用DepthImageFrame的MapFromSkeletonPoint或将原始短值右移DepthImageFrame.PlayerIndexBitmaskWidth。

E.g。骨架

using (var skeletonFrame= e.OpenSkeletonFrame())
using (var depthFrame = e.OpenDepthImageFrame())
{
    skeletonFrame.CopySkeletonDataTo(skeletons);
    var skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];

    foreach (var skeleton in skeletons)
    {
            if (skeleton.TrackingState != SkeletonTrackingState.Tracked) continue;

            var head = skeleton.Joints[JointType.Head];
            if (head.TrackingState == JointTrackingState.NotTracked) continue;

            var depthImagePoint = depthFrame.MapFromSkeletonPoint(head.Position);

            int depthInMillimeters = depthImagePoint.Depth; // TADA!
    }
}

E.g。移

using (var depthFrame = e.OpenDepthImageFrame())
{
    var depthArray = new short[depthFrame.PixelDataLength];
    depthFrame.CopyPixelDataTo(depthArray);

    for (int i = 0; i < depthArray.Length; i++) {
        int depthInMillimeters = 
            depthArray[i] >> DepthImageFrame.PlayerIndexBitmaskWidth;
        // TADAx2!
}

以下原始解决方案不再正确:

根据本文的内容 - http://openkinect.org/wiki/Imaging_Information

if (depthValue <= 2047) {
   depthM = 0.1236 * Math.Tan(depthValue / 2842.5 + 1.1863);
}

答案 1 :(得分:3)

旧的不活跃的问题,但无论如何这里对我有用我有一个旧的kinect模型(1414 for XBOX360 + PC减少),最近有时间做一些代码和测量:

  1. 我的原始数据是16位而非10/11/12/13位!!!

    所以可能你的数据非常相似。最小距离测量为~0.95m最大距离未知(测试区域不够大),最小有效值为传感器6408 ... ~0.95m。来自传感器的另一个有效值是15800 ... ~2.5m用于插值

  2. 天真(线性)转换为米

    float z,m=(2.5-0.9)/(15800.0-6408.0);
    WORD raw;
    
    raw=... raw depth form camera/image;
    z=0.0;
    if ((raw>=6408)&&(raw< 0xFFF0)) 
     z=0.9+(float(raw-6408)*m);
    // here z is range in [m] or 0 for invalid depth
    
  3. 当我有更多时间时,我会检查线性并使其更精确

    要做到这一点,我需要进行一些编程以获得更好的测量和设置工作区域,以实现更精确的距离测量。如果需要,更精确的常数可以添加余弦校正。我不知道设备/驱动程序是否自行测量它。当我到达它会更新我的答案,但我很懒,所以它可能有一段时间......

  4. [编辑1]进行了一些几何测量设置和代码更改
    所以这里有更精确的新结论:

    if (raw==0x0000) z=0.0;
    else if (p.raw>=0x8000) p.z=4.0;
    else p.z=0.8+(float(p.raw-6576)*0.00012115165336374002280501710376283);
    

    raw数据已由驾驶员或 kinect 本身进行余弦校正,因此raw表示距离传感器的垂直距离。 raw数据与垂直距离呈线性关系(至少在0.8 - 2.0 m范围内),经过更精确的测量后,深度范围为<0.8 - 4.0> [m]。之前的测量结果不准确。


    raw = 0价值太高了
    raw >= 32768太远/未知的价值甚至是别的东西(有更多的可能性)