你是在正确的轨道上,这是一个雄心勃勃的项目,但非常酷的,如果你能做到这一点。
首先,值得一个好主意这些事情是如何工作的。标识TSDF的原始文件由Curless和Levoy提供,并且合理易行 - 副本为here。有许多后来的变化,但这是起点。
其次,您需要按照您的说法创建nxnxn存储。这很快就会变大。例如,如果您想要具有RGB数据和浮点数值的400x400x400像素来计算距离和重量,那么这将是768MB的GPU内存 - 您可能需要检查移动设备上有多少GPU可用内存。是啊,我说GPU是因为...
虽然可以实现对CPU玩具的解决方案,你真的需要认真对待GPU编程如果你想有什么样的表现。我在英特尔i7 CPU笔记本电脑上构建了一个早期版本。无可否认,我没有花时间优化它,但需要几十秒来集成单个深度图像。如果你想得到实时(30Hz),那么你需要一些GPU编程。
现在,你有你的TSFD数据表示,你需要做的每一帧:相机在哪里,在世界对于TSDF
1.工作了坐标。 通常假定你是时间t = 0的原点,然后测量相对于前一帧的相对平移和旋转。执行此操作的最常见方法是使用称为迭代最近点(ICP)的算法。您可以自己实现此操作,也可以使用像PCL这样的库,但我不确定它们是否具有移动版本。我建议你在没有这个的情况下开始使用,只需保持相机和场景静止不动,并在稍后进行移动。
2.将你的深度图像到TSDF这意味着更新下一个深度图像的TSDF。你不会丢弃你有的信息,你会将新信息与旧信息合并。 您可以通过在你的TSDF遍历每个体素做到这一点,:
一)从体素中心的距离摸出相机
b)项目点到你的深度相机的图像平面得到一个像素坐标(使用上述得到的外在照相机位置和照相机,其是易于搜索用于超高动力学固有参数)
c)中查找了在该像素处的深度图中的深度坐标
d)项目这个点回到使用像素x和y坐标加上深度的空间e)使用值distance_from_step_d - distance_from_step_a更新当前体素距离的值(更新通常是现有值加上新值的加权平均值)。
您可以对体素颜色使用类似的方法。
将所有深度图集成到TSDF后,可以通过光线跟踪或提取ISO表面(3D网格)并在另一个包中查看结果来可视化结果。
A 真的有用的纸张,会让你在那里是here。这是一些实际上在PC上实施Kinect Fusion的学生的实验报告。这几乎是一步一步的指导,虽然你仍然必须学习CUDA或类似的实现它
你也可以看看我的源代码GitHub的想法,虽然所有正常的免责声明适用于适用性。
祝你好运!