0

我在 Windows 10 64 位操作系统中使用 Kinect v2 API 获取点云。下面是代码片段-

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);
}

请看下面的点云截图——

在此处输入图像描述

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

我想知道,为什么存在这种转变以及如何消除/最小化它?任何解决方法,请。

4

1 回答 1

1

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

  • 深度和颜色帧的帧采集不是在同一时刻(因为这就是_reader_MultiSourceFrameArrivedkinect SDK 中的功能的工作方式。两个相机的时间戳略有不同,因此略有偏移。如果您将对象移动到其中,这一点会更加突出看法。
  • coordinateMappersdk 中用于映射颜色帧和深度帧的函数使用相机校准参数。默认相机校准参数已编码在 sdk 中,但是每个设备都存在细微差异。您可以尝试重新校准 Kinect 相机并使用更新的校准参数来获得颜色和深度图的正确叠加。但是请注意,通过在 Kinect Fusion 代码中简单地替换相机校准参数并重新编译不起作用,因为这些参数是从闭源 Kinect fusion dll 中替换的。因此,您必须编写自己的代码来更新每一帧在运行时。

希望这可以帮助。

于 2018-02-01T06:07:30.410 回答