9

我正在玩新的 Kinect SDK v1.0.3.190。(stackoverflow 中的其他相关问题在以前的 kinect sdk 上)我从 Kinect 获得深度和颜色流。由于深度和 RGB 流是使用不同的传感器捕获的,因此两帧之间存在不对齐,如下所示。

只有 RGB RGB

只有深度 深度

深度和RGB RGB 和深度均匀混合

我需要对齐它们,并且有一个名为 MapDepthToColorImagePoint 的函数正是为此目的。但是,它似乎不起作用。这是一个同样混合(深度和映射颜色)的结果,下面是使用以下代码创建的

            Parallel.For(0, this.depthFrameData.Length, i =>
        {
            int depthVal = this.depthFrameData[i] >> 3;
            ColorImagePoint point = this.kinectSensor.MapDepthToColorImagePoint(DepthImageFormat.Resolution640x480Fps30, i / 640, i % 640, (short)depthVal, ColorImageFormat.RgbResolution640x480Fps30);
            int baseIndex = Math.Max(0, Math.Min(this.videoBitmapData.Length - 4, (point.Y * 640 + point.X) * 4));

            this.mappedBitmapData[baseIndex] = (byte)((this.videoBitmapData[baseIndex]));
            this.mappedBitmapData[baseIndex + 1] = (byte)((this.videoBitmapData[baseIndex + 1]));
            this.mappedBitmapData[baseIndex + 2] = (byte)((this.videoBitmapData[baseIndex + 2]));
        });

在哪里

depthFrameData -> raw depth data (short array)

videoBitmapData -> raw image data (byte array)

mappedBitmapData -> expected result data (byte array)

参数的顺序、分辨率、数组大小是否正确(仔细检查)。

代码的结果是: 深度和 MapDepthToColorImagePoint

错位继续!更糟糕的是,使用 MapDepthToColorImagePoint 后的结果图像与原始图像完全相同。

如果有人可以帮助我找出我的错误或至少向我解释 MapDepthToColorImagePoint 的用途(假设我误解了它的功能),我将不胜感激?

4

2 回答 2

4

这总是会稍微发生,因为两个传感器安装在稍微不同的地方。

试试看:

用你的两只眼睛看某个物体,然后试着只用你的左眼,然后只用你的右眼。事情看起来略有不同,因为你的两只眼睛并不完全相同。

但是:可以纠正一些 API 代码的许多问题。

我使用的是 Windows 1.5 的 Kinect,所以 API 与 1.0 略有不同。

short[] depth=new short[320*240];
// fill depth with the kinect data
ColorImagePoint[] colorPoints=new ColorImagePoint[320*240];
// convert mappings
kinect.MapDepthFrameToColorFrame(DepthImageFormat.Resolution320x240Fps30,
            depth, ColorImageFormat.RgbResolution640x480Fps30, colorPoints);
// now do something with it
for(int i=0;i<320*240;i++)
{
  if (we_want_to_display(depth[i]))
  {
    draw_on_image_at(colorPoints[i].X,colorPoints[i].Y);
  }  
}

这就是基础。如果您查看 Kinect Developer Toolkit 1.5 中的绿屏示例,它会很好地使用它。

于 2012-10-30T02:50:31.040 回答
1

这是一个非常常见的问题,因为两个摄像头位于两个不同的位置,所以同步两个图像所涉及的数学问题是固有的。有点像获取 3D 相机生成的两个视频源并尝试同步它们。他们总是会稍微偏离。

修正的两个想法:

  1. 在计算时手动移动深度图像中的位。
  2. 在 Kinect 中添加振动电机以降低噪音: http ://www.youtube.com/watch?v=CSBDY0RuhS4 (我发现一个简单的寻呼机电机很有效。)

MapDepthToColorImagePoint 用于在 Skeletal API 中将骨架点映射到深度点,然后映射到图像点,以便您可以在 RGB 图像上显示关节。

希望这可以帮助。

于 2012-05-07T18:06:17.983 回答