使用Kinect v2 API获得Point Cloud的转变

时间:2018-01-31 15:12:38

标签: kinect kinect-sdk point-clouds kinect-v2

我在Windows 10 64位操作系统中使用Kinect v2 API获取Point Cloud。以下是代码段 -

depthFrame = multiSourceFrame.DepthFrameReference.AcquireFrame();
colorFrame = multiSourceFrame.ColorFrameReference.AcquireFrame();

if (depthFrame == null || colorFrame == null) return;

depthFrame.CopyFrameDataToArray(depthData);
coordinateMapper.MapDepthFrameToCameraSpace(depthData, cameraSpacePoints);
coordinateMapper.MapDepthFrameToColorSpace(depthData, colorSpacePoints);
colorFrame.CopyConvertedFrameDataToArray(pixels, ColorImageFormat.Rgba);

for (var index = 0; index < depthData.Length; index++)
{
    int u = (int)Math.Floor(colorSpacePoints[index].X);
    int v = (int)Math.Floor(colorSpacePoints[index].Y);

    if (u < 0 || u >= COLOR_FRAME_WIDTH || v < 0 || v >= COLOR_FRAME_HEIGHT) continue;

    int pixelsBaseIndex = v * COLOR_FRAME_WIDTH + u) * COLOR_BYTES_PER_PIXEL;

    float x = cameraSpacePoints[index].X;
    float y = cameraSpacePoints[index].Y;
    float z = cameraSpacePoints[index].Z;

    byte red   = pixels[pixelsBaseIndex + 0];
    byte green = pixels[pixelsBaseIndex + 1];
    byte blue  = pixels[pixelsBaseIndex + 2];
    byte alpha = pixels[pixelsBaseIndex + 3];

    PointXYZRGB point = new PointXYZRGB(); // Color point in 3D
    point.postion(x, y, z);
    point.color(red, green, blue, apha);
}

请参阅下面的点云截图 -

enter image description here

请在上图中看看橙色的球。仔细检查后,可以看到点云存在偏移。

我想知道为什么会出现这种转变以及如何删除/最小化它?请解决任何变通方法。

1 个答案:

答案 0 :(得分:1)

颜色叠加和深度图的偏移量可能是由多种原因造成的。

  • 深度和颜色帧的帧采集不是同一时刻(就像kinect SDK中_reader_MultiSourceFrameArrived函数的工作方式一样。两个摄像头的时间戳略有不同,因此略有偏移。这是更多如果你在视野中移动物体,那就很突出。
  • 用于映射颜色框架和深度框架的sdk中的coordinateMapper功能使用摄像机校准参数。默认的摄像机校准参数已在sdk中编码,但每个设备都有细微差别。您可以尝试重新校准Kinect摄像机并使用更新的校准参数来获得颜色和深度贴图的正确叠加。但请注意,通过在Kinect Fusion代码中逐步更换相机校准参数并重新编译不起作用,因为参数将从闭源Kinect融合dll中替换。因此,您必须编写自己的代码来更新每个帧在运行时。

希望这会有所帮助。