【问题标题】:get max and min depth from Kinect从 Kinect 获取最大和最小深度
【发布时间】:2013-10-18 15:26:53
【问题描述】:

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

不幸的是,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();

【问题讨论】:

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

标签: c# max kinect object-recognition


【解决方案1】:

如果你只需要最小值/最大值,而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 变量看起来很危险。而且这个列表是多余的!

【讨论】:

  • 好的,我明白了。我现在使用了这样的循环代码stackoverflow.com/questions/19274287/…,但输出仍然是两个完全相同的数字。
  • 您仍然拥有depthdata[depthIndex],而您的计算索引仅称为index。错字?
  • 在另一个循环中(我在评论中链接),索引仅用于用某种颜色为新的着色。所以在这种情况下,我实际上什至不需要它。我现在很困惑为什么我使用循环而不在循环中使用 x 和 y。尽管如此,现在我得到了 zMax 的结果,这似乎是合法的,并且 zMin 始终为 0。
  • 是的,你现在有一个非常奇怪的循环。 depthdata是什么类型和大小?
  • Byte[] depthdata = imageFrame.Image.Bits;
【解决方案2】:

为了计算 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];
    }

}

【讨论】:

  • 谢谢你的回答,尽管如此我不得不使用c#并且由于我的旧kinect我还必须使用beta sdk 2。但是你是对的,我需要大于0的zMIN(因为 0 是所有点太远或太近的值。)
  • 不客气。作为一个小评论,测试 >0 与测试 >FLT_EPSILON 略有不同,后者在 Microsoft 的所有 Kinect SDK 示例中都使用。
猜你喜欢
  • 2013-01-07
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 2015-04-19
  • 1970-01-01
相关资源
最近更新 更多