我在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);
}
请参阅下面的点云截图 -
请在上图中看看橙色的球。仔细检查后,可以看到点云存在偏移。
我想知道为什么会出现这种转变以及如何删除/最小化它?请解决任何变通方法。
答案 0 :(得分:1)
颜色叠加和深度图的偏移量可能是由多种原因造成的。
_reader_MultiSourceFrameArrived
函数的工作方式一样。两个摄像头的时间戳略有不同,因此略有偏移。这是更多如果你在视野中移动物体,那就很突出。coordinateMapper
功能使用摄像机校准参数。默认的摄像机校准参数已在sdk中编码,但每个设备都有细微差别。您可以尝试重新校准Kinect摄像机并使用更新的校准参数来获得颜色和深度贴图的正确叠加。但请注意,通过在Kinect Fusion代码中逐步更换相机校准参数并重新编译不起作用,因为参数将从闭源Kinect融合dll中替换。因此,您必须编写自己的代码来更新每个帧在运行时。 希望这会有所帮助。