我正在玩新的Kinect SDK v1.0.3.190。 (stackoverflow中的其他相关问题在kinect的先前sdk上)
我从Kinect获得深度和颜色流。由于深度和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的作用(假设我误解了其功能),将不胜感激?

最佳答案

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

尝试一下:

用两只眼睛看一些物体,然后尝试只用左眼,然后再用右眼。事情看起来略有不同,因为您的两只眼睛不在同一位置。

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

我将Kinect用于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中的绿屏示例,则可以很好地说明这一点。

关于c# - Kinect深度和图像帧对齐,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10391719/

10-12 22:34