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