我的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();
答案 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];
}
}