Kinect深度和图像帧对齐

时间:2012-04-30 23:09:44

标签: c# kinect color-depth

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

仅RGB RGB

只有深度 Depth

深度& RGB RGB & Depth equally blended

我需要对齐它们,并且有一个名为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)

参数,分辨率,数组大小的顺序是正确的(双重检查)。

代码的结果是: depth and MapDepthToColorImagePoint

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

如果有人能帮助我找出我的错误或者至少解释一下MapDepthToColorImagePoint是什么(假设我误解了它的功能),我将不胜感激?

2 个答案:

答案 0 :(得分:4)

由于两个传感器安装在略有不同的位置,因此总是会略有发生。

试一试:

用两只眼睛看一些物体,然后只用你的左眼,然后只用你的右眼。事情看起来略有不同,因为你的两只眼睛不在同一个地方。

但是:可以使用某些API代码纠正许多问题。

我正在使用Kinect for Windows 1.5,因此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中的greenscreen示例,它就会很好地用于此。

答案 1 :(得分:1)

这是一个非常常见的问题,由于两个摄像机位于两个不同的位置,所以数学中固有的同步两个图像。有点像拍摄由3D相机产生的两个视频输入并尝试同步它们。他们总是稍微偏离。

两个纠正的想法:

  1. 在计算时手动移动深度图像中的位。
  2. 在Kinect上添加振动电机以减少噪音: http://www.youtube.com/watch?v=CSBDY0RuhS4(我发现一个简单的寻呼机电机才有效。)
  3. MapDepthToColorImagePoint用于Skeletal API,将骨架点映射到深度点,然后映射到图像点,以便您可以在RGB图像的顶部显示关节。

    希望这会有所帮助。