从 Kinect 获取最大和最小深度

本文关键字:深度 获取 Kinect | 更新日期: 2023-09-27 18:36:07

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

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

从 Kinect 获取最大和最小深度

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

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