Kinect深度和图像帧对齐

9
我正在研究新的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)

参数顺序、分辨率和数组大小都是正确的(已经双重检查过)。

代码的结果如下: 深度和MapDepthToColorImagePoint

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

如果有人能帮我找出错误或至少解释一下MapDepthToColorImagePoint的作用,我将不胜感激(假设我误解了其功能)。

2个回答

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开发工具包1.5中的greenscreen示例,它展示了这一技术的良好应用。


1

这是一个非常普遍的问题,由于两个摄像头位于不同的位置,所以在同步两个图像时涉及到的数学固有问题。就像尝试同步3D相机产生的两个视频流一样,它们总是会稍微偏离。

纠正的两个想法:

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

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

希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接