【问题标题】:How to get the position (x,y) from a Kinect depth array?如何从 Kinect 深度数组中获取位置 (x,y)?
【发布时间】:2013-11-24 20:55:58
【问题描述】:

在使用 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++;
}

【问题讨论】:

    标签: c# arrays kinect depth object-recognition


    【解决方案1】:

    假设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 &lt; depth.Length; i += 2),然后从i 计算x/y 值。 (提示:模运算符会给你 x 值,一个简单的整数除法会得到你,或多或少)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多