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

2024-01-04

在使用 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 < min2 && dist > 0) 
    min2 = dist;

  if (dist > max2) 
    max2 = dist;
}

我的问题是:

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

我怎样才能获得位置或直接将这些点添加到列表中 - 以便采取进一步行动?

我的最终目标是通过计算特定间隔内的像素数量来识别某些预定义的对象(例如,区分球和块)。

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

  if (dist < z2 && dist > z1) 
    a++;
}

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

var points = new List<Point>();
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)像以前一样,然后计算 x/y 值i。 (提示:模运算符将为您提供 x 值,简单的整数除法将为您提供或多或少的 y)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Kinect 深度数组获取位置 (x,y)? 的相关文章

随机推荐