0

我的 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();
4

2 回答 2

2

如果您只需要最小/最大值,并且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似乎在其他地方声明的变量看起来很危险。而且这个列表是多余的!

于 2013-10-18T15:34:01.100 回答
0

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

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];
    }

}
于 2013-10-28T04:30:20.500 回答