从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();
如果你只需要最小/最大,并且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
变量似乎在其他地方宣布看起来很危险。而这个清单只是多余的!
好的,我明白了。我现在使用这样的循环代码http://*.com/questions/19274287/creating-a-bitmap-of-depth-data-where-color-shows-the-distance-c-sharp,但仍然输出是两个完全相同的数字。 –
您仍然有'depthdata [depthIndex]',而您的计算索引只被称为'index'。错字? – Chris
在另一个循环中(即我在评论中链接)索引仅用于使用某种颜色为新的颜色着色。所以在这种情况下,我实际上甚至不需要它。我现在很困惑,为什么我在循环中不使用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];
}
}
谢谢你的答案,无论我我有义务使用C#,并且由于我以前的kinect,我也必须使用beta sdk 2.但是,您是对的,我需要大于0的zMIN(因为0是所有点的值太远或太接近。) –
不用谢。作为次要评论,测试> 0与测试> FLT_EPSILON稍有不同,后者在Microsoft的所有Kinect SDK示例中都有使用。 –
雅我的意思是应该返回的最小值和最大值。当你到达那一点时,你的名单上有什么? –