从Kinect获得最大和最小深度

时间:2013-10-18 15:26:54

标签: c# max kinect object-recognition

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

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

2 个答案:

答案 0 :(得分: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变量看起来很危险。这个清单只是多余的!

答案 1 :(得分: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];
    }

}