博主的源码地址:https://github.com/sjy234sjy234/KinectFusion-ios
原论文:"KinectFusion: Real-time dense surface mapping and tracking."
KinectFusion算法是三维视觉里面一个经典的基于深度相机的入门级实时静态场景重建算法,算法的流程简单易懂,项目复杂度适中,而且涵盖三维视觉一些基础知识细节,适合入门学习。值得一提的是,KinectFusion算法本身的并行度非常高,几乎每一个步骤都可以使用gpgpu的核函数并行实现。目前,github上已经有PC端的cuda开源实现版本。
博主此前在ios平台上做metal gpgpu开发,在此整理分享一下KinectFusion算法在ios移动端的metal实现代码,该代码是demo版本,目前还不能达到实时运行的效率,但是非常适合ios metal gpgpu的初学者。经测试,如果对编程做一些gpgpu方向的优化加速,可以在iphoneX上达到30以上的帧率。
上图是iphoneX上的运行示例,本文主要先对项目的结构框架做一个系统的介绍。
一、小白需要的前期准备工作
图形渲染的getting started部分:https://learnopengl.com/
ios metal入门:https://blog.csdn.net/sjy234sjy234/article/details/81812029
齐次坐标与空间变换:https://blog.csdn.net/qq_35976351/article/details/84871397
相机投影:https://blog.csdn.net/rurud/article/details/72823718
KinectFusion原文阅读——重点理解框架、TSDF、ICP,其它细节对照博主源码,很多可以略过
Marching Cube——用于提取TSDF中存储的网格模型,原文似乎不是用这个
二、项目结构介绍
从文首的源码链接克隆项目后,用xcode打开,在苹果真机上直接运行。注意metal相关应用无法在虚拟手机上测试运行,只能在真机上测试运行。经博主实测,demo项目在iphone X和iphone SE平台上都可以正常运行。
项目中的主要文件(夹)有:Utility、FusionProcessor、depth.bin、ViewController.mm。
1、Utility文件夹
文件夹中包含了算法中用到的数学计算的实现,包括投影矩阵、空间变换、线性方程求解等等。同时,还包含了ios metal相关的功能文件。其中,metal相关部分的写法,与博主此前的学习ios Metal系列是相同的,可以参考上面准备工作中的链接。
2、FusionProcessor文件夹
文件夹包含了KinectFusion的ios metal的实现源码,在后续的文章中将详细展开介绍。
3、depth.bin文件
文件预存了57帧来自iphoneX深度相机的深度帧,帧尺寸是480x640x2 byte。注意,ios平台的深度相机获取存储的是float16的深度数据,即每个深度用2个字节存储,而且存储的值是disparity。如果要获取深度值,需要进行如下换算,取disparity的倒数:depth = 1.0 / disparity。
4、ViewController.mm
文件里面编写了KinectFusion的运行示例。从depth.bin读取深度帧数据流,调用KinectFusion的方法逐帧的进行三维几何重建。
三、总结
综上,本文介绍了学习KinectFusion之前需要掌握的基础知识框架,以及博主的KinectFusion-ios项目的组织结构。后续的文章,会进一步解析在ios平台上,KinectFusion的调用、实现的相关源码部分。