目前,我正在开发一个 C# 项目,以合并可以使用 Kinect SDK 从 Kinect-v2 设备检索的颜色和深度信息,以及可以从 3 维对象文件(.obj、. stl,等等..)。因此,我想创建一个包含两者信息的像素点云——来自 Kinect 设备的坐标和颜色信息以及来自目标文件的信息。
到目前为止我做了什么?
- 我设法设置了两个像素数组
Pixel[]
来保存所需的数据(X/Y/Z 坐标,以及相关的颜色信息 RGB)。 一个数组包含 Kinect 数据,而另一个数组包含
目标文件的数据。public class Pixel { public double X { get; set; } public double Y { get; set; } public double Z { get; set; } public byte R { get; set; } public byte G { get; set; } public byte B { get; set; } }
为了获取颜色和深度信息并设置 Kinect-array,我首先使用 Kinect-SDK 的MultiSourceFrameReader
类来获取一个MultiSourceFrame
..
MultiSourceFrame multiSourceFrame = e.FrameReference.AcquireFrame();
..这样我就可以在此之后获取颜色/深度帧:
DepthFrame depthFrame = multiSourceFrame.DepthFrameReference.AcquireFrame();
ColorFrame colorFrame = multiSourceFrame.ColorFrameReference.AcquireFrame();
通过这些方法.CopyConvertedFrameDataToArray()
,.CopyFrameDataToArray()
我得到了 RGB 和深度信息的帧数据,然后使用's方法将其映射到一个CameraSpacePoint[]
数组,以提取相机空间内的 X/Y/Z 坐标。使用这个数组和帧数据,我可以设置包含“Kinect-pointcloud”所有信息的数组。CoordinateMapper
.MapColorPointsToCameraSpace()
Pixel[]
为了为 3D 对象设置“点云”,我使用了第 3 方库来加载对象并提取其 X/Y/Z 坐标和颜色信息。
下一步
我的下一步是合并这两个点云,但那是我被卡住了。我必须以某种方式映射或调整一个点云的 3D 信息 (X/Y/Z) 的大小,以便它适合另一个点云的 3D 信息,因为它们的缩放比例不同。这导致了我的问题:
我的问题
- 如何缩放对象点云以使其适合 Kinect 点云?
- 如何找出对象的哪个像素覆盖了 Kinect 点云中的像素?(生成的点云不应改变其 1920*1080 像素的大小)
- 有没有图书馆能够做到这一点?
附加信息
Kinect 点云中的坐标如下所示:
- X:1.4294..
- Y:0.9721..
- Z:2.1650..
3D 对象内的坐标如下所示:
- X:0.8331..
- Y:-16.0591..
- Z:26.8001..