如何从Kinect深度数组中获取位置(x,y)?

在使用kinect时,我发现,位图及其深度信息不可靠,并且出于某种原因比实际字节数组中的数据更加干扰。

当我尝试通过访问这样的位图来获取最小值和最大值时,我意识到了这一点

for (var y = 0; y < height; y++) { var heightOffset = y * width; for (var x = 0; x < width; x++) { var index = ((width - x - 1) + heightOffset) * 4; var distance = GetDistance(depth[depthIndex], depth[depthIndex + 1]); 

但另一方面,当我直接访问深度字节数组(作为Stackoverflow成员Chris指出,谢谢你,Chris)使用这种方法时,我取得了更好的结果:

 int min2 = int.MaxValue, max2 = int.MinValue; for (int i = 0; i < depth.Length; i += 2) { int dist = GetDistance(depth[i], depth[i + 1]); if (dist  0) min2 = dist; if (dist > max2) max2 = dist; } 

我的问题是:

  • 我想计算一定距离内的所有点数。
  • 然后我想得到他们的实际位置(x,y)。

我如何获得该职位或直接将这些积分添加到列表中 – 以便采取进一步行动?

我的最终目标是通过计算某些intervall中的像素数来识别某些预定义的对象(例如,与块中的球不同)。

 for (int i = 0; i < depth.Length; i += 2) { int dist = GetDistance(depth[i], depth[i + 1]); if (dist  z1) a++; } 

假设depth是一个字节数组,每行2 * width字节, height行,请尝试这样的事情:

 var points = new List(); for( int y = 0; y < height; y++ ) for( int x = 0; x < width; x++ ) { int i = y * width * 2 + x * 2; int dist = GetDistance( depth[i], depth[i + 1] ); if( dist < z2 && dist > z1 ) points.Add( new Point( x, y ) ); } 

你显然必须用一些类型替换Point来表示一个int x / y对!

您也可以像以前一样使用简单的for (int i = 0; i < depth.Length; i += 2) ,然后从i计算x / y值。 (提示:模数运算符会给你x值,一个简单的整数除法会得到y,或多或少)