从Kinect获得最大和最小深度

问题描述:

我的Kinect将安装在直接向下看地面的天花板上(应平行于地面)。对于物体识别,我想获得到地面的距离(maxDistance)和到物体的距离(minDistance)。 我写了一个循环,将每个像素的所有距离值添加到列表中,然后尝试获取该列表的最大整数和最小值。从Kinect获得最大和最小深度

不幸的是,对于zMIN和zMAX的结果(我写信给一个文本框来检查它)总是一样的 - 这肯定是错误的。

问题:我在做什么错? :)

List<int> tiefe = new List<int>(); 

     for (var y = 0; y < height; y++) 
     { 

      for (var x = 0; x < width; x++) 
      { 

       var distance = GetDistance(depthdata[depthIndex], depthdata[depthIndex + 1]); 
       tiefe.Add(distance); 
       depthIndex += 2; 
      } 
     } 
     var zMAX = tiefe.Max(); 
     var zMin = tiefe.Min(); 
+0

雅我的意思是应该返回的最小值和最大值。当你到达那一点时,你的名单上有什么? –

如果你只需要最小/最大,并且depthData是16位深度值的字节数组,这将是更容易和更快:

int min = int.MaxValue, max = int.MinValue; 
for(int i = 0; i < depthData.Length; i += 2) 
{ 
    int dist = GetDistance(depthData[i], depthData[i + 1]); 
    if(dist < min) min = dist; 
    if(dist > max) max = dist; 
} 

使用depthIndex变量似乎在其他地方宣布看起来很危险。而这个清单只是多余的!

+0

好的,我明白了。我现在使用这样的循环代码http://*.com/questions/19274287/creating-a-bitmap-of-depth-data-where-color-shows-the-distance-c-sharp,但仍然输出是两个完全相同的数字。 –

+0

您仍然有'depthdata [depthIndex]',而您的计算索引只被称为'index'。错字? – Chris

+0

在另一个循环中(即我在评论中链接)索引仅用于使用某种颜色为新的颜色着色。所以在这种情况下,我实际上甚至不需要它。我现在很困惑,为什么我在循环中不使用x和y而使用循环。不过现在,我现在得到了zMax的结果,这对于zMin来说似乎是合法的,并且始终为0。 –

为了计算zMax,您可以搜索深度数据数组中的最大值,但要计算zMin,必须搜索大于FLT_EPSILON(= 1.192092896e-07f)的最小值。实现你需要使用J4K Java for Kinect library正是代码如下:

public void onDepthFrameEvent(short[] packed_depth, int[] U, int V[]) { 
    DepthMap map=new DepthMap(depthWidth(),depthHeight(),packed_depth); 
    float zMIN=4;//The largest possible value 
    float zMAX=0;//The smallest possible value 
    for(int i=0;i<map.realZ.length;i++) 
    { 
     if(zMAX<map.realZ[i]) zMAX=map.realZ[i]; 
     if(map.realZ[i]>DepthMap.FLT_EPSILON && zMIN>map.realZ[i]) zMIN=map.realZ[i]; 
    } 

} 
+0

谢谢你的答案,无论我我有义务使用C#,并且由于我以前的kinect,我也必须使用beta sdk 2.但是,您是对的,我需要大于0的zMIN(因为0是所有点的值太远或太接近。) –

+0

不用谢。作为次要评论,测试> 0与测试> FLT_EPSILON稍有不同,后者在Microsoft的所有Kinect SDK示例中都有使用。 –