一 绪论
开源汇总 | RGB-D SLAM用于静态/动态稠密三维重建_模型 (sohu.com)
InfiniTAM是一个开源、跨平台、实时的大范围深度信息融合与跟踪技术框架。该算法有好几个版本,有很大的借鉴意义。值得一提的是,InfiniTAM能够比KinectFusion重建更加大范围的3D环境,其关键因素在于InfiniTAM采用了哈希表的方式来存储隐式的体积表示,极大地节省了内存空间的消耗。
二 KinectFusion
Depth Map Conversion:读入的深度图像转换为三维点云,计算每一个点云的法向量;
Camera Tracking(map-to-frame):通过上一次对map中点云对上一帧的投影,用ICP对当前帧进行匹配求解位姿;
Volumetric Integration:根据步骤2的位姿,将当前帧的点云融合到网格模型中去,这里用了TSDF;
Raycasting :根据当前帧相机位姿将模型中的点云投影到当前帧并且计算其法向量,用来在步骤2中对下一帧的输入图像配准。
KinectFusion基于深度的实时稠密三维重建&TSDF开山之作-腾讯云开发者社区-腾讯云 (tencent.com)
2.1 Depth Map Conversion
详解kinectfusion之二深度图转三维点云和法向量计算_kinect深度图像转点云-CSDN博客
- 双边滤波:对采集的深度图进行去噪
- 深度图中的像素坐标,通过相机内参和深度值,可以对应到相机坐标系下的三维点,再通过后续估计的相机位姿,即可对应到模型中的三维点坐标
- 相邻像素在相机系下的三维点坐标经过相减、叉乘即可计算出当前帧的法向量图
- 对双边滤波的结果进行两次下采样再计算顶点图和法向量图,最后共有三种尺度的结果以供后续位姿估计
2.1.1 深度图转三维坐标
2.2.2 点云法向量
2.2 Camera Tracking
- 使用所有的历史信息进行稠密的迭代最近点位姿估计是基于两个考虑:
通过保持高帧率的跟踪,可以假设相邻帧的移动是很微小的,因此可以使用快速投影关联法获得点对之间的关系。
GPU支持并行处理,因此点对关联和平面优化可以使用所有历史信息,猜测大致意思是所有历史信息重建的结果会被存储下来。
- 相比于以往的方法都是使用ICP估计当前帧和上一帧的位姿,本文估计当前帧和历史信息重建出的模型的位姿
- 优化目标是当前帧和模型匹配点对在模型点的法向量方向上的投影距离尽可能小(ICP目标)
- 使用了相邻帧移动很小的假设,建立增量变换模型,采用迭代优化的方法进行最小化目标函数
2.2.1 ICP
将当前点云转换到上一帧位姿,再投影到模型中得到相对应的模型点,而每个模型点都拥有法向量,将模型点到转换后点云点作为当前“法向量”,这两个法向量的夹角就组成了求当前位姿的误差函数,这种方法也可称为点到面的ICP方法。
2.3 Volumetric Integration
全局场景融合,给定当前帧的位姿,将当前帧的表面信息融合进重建的模型,模型表示为TSDF。
- 有了当前深度帧,以及当前帧的位姿,可以将当前深度信息融合进当前重建的TSDF模型
- TSDF模型每个体素点存储了两个值,一个表示到最近的表面的截断距离,另一个表示该点的权重,截断距离的意思是:
·对于距离最近表面的距离大于μ,且靠近相机一侧的体素点,TSDF截断距离值记为μ
·对于距离最近表面的距离大于μ,且远离相机一侧的体素点,不记录截断距离值,认为其为不可见区域
TSDF更新的思路:
- 对于每一个体素点,根据当前帧的位姿以及相机内参,计算其在图像上对应的像素坐标
- 根据像素坐标对应到深度图中,得到的是该体素点和相机光心连线上经过的表面的深度
- 计算体素点到相机的距离深度,和上一步得到的表面深度,二者之差,化为截断距离,即得到了当前体素点的截断距离值
- 当前体素点的权重,与像素射线方向和表面的夹角有关,夹角越小,说明这个平面越垂直,权重越大;权重和深度有关,深度越小,说明离得越近,权重越大
- 上述更新思路仅考虑当前帧信息,实际上还需要和上一帧的结果进行融合,融合方式是和上一帧进行加权平均,权重就是每一帧计算出的体素权重;权重的融合方式就是相加
- 这种更新方式虽然访问了大量无需访问的体素,但是简单并且可并行,因此总时间是较短的
三维重建入门第一篇:KinectFusion论文精读,原理、流程详解,帮你看懂这篇文章-CSDN博客
2.4 Raycasting
对TSDF模型进行射线投射,估计出当前模型的稠密表面表示以供展示。
这一步骤的目的是计算出当前重建的TSDF模型对应的表面顶点以及法向量。
- ·每个像素点根据外参内参计算出射线方向,从最小深度开始遍历,直到经过0点,或者从负值变为正值,将该点记为表面的顶点
- ·对于非常接近表面的点,假设这一处的TSDF梯度是和表面正交的,因此表面法向量可以通过对TSDF求梯度获得
三 InfiniTAM
InfiniTAM∞ 在开发过程中遵循可扩展性、可重用性和可移植性的原则:
- 在一个含有单个Nvidia GTX 780Ti显卡的机器上,该方法的处理速度达到100+fps以上(根据所处理场景的不同而速度略有变化)。
- 现实世界的信息的描述可以利用稠密(基于完全的3D体数据的表达)或稀疏性(基于哈希索引的体数据小块)的表达。 该算法框架的设计同样允许方便地切换到其它表达方式,例八叉树。
- InfiniTAM∞在CPU和GPU之间实时地互换内存数据,以便能实现理论上无线空间的三维重建(不局限于GPU内存大小)。
- 我们为CPU和GPU的实现同时提供C++代码,并且这些代码在大多数情况下在两种实现间公用。
- 该框架使得集成新的模块非常容易:既可以替换现有模块,也可以扩展系统的用途。例如3D物体检测、新的跟踪器、等。
- 代码原生支持Windows, Linux 和 Mac OS X 下运行。
核心处理库的CPU版本无第三方依赖(可以独立运行),GPU版本仅依赖CUDA。用户界面仅依赖于OpenGL 和 GLUT。深度信息可以来源于图像文件,或者支持OpenNI 2的摄像头。
3.1 Allocation
分配阶段分为三个独立的部分。
首先,对于深度图像中的每个2.5D像素,我们反向投影一条连接d-µ到d+µ的线,其中d是图像坐标中的深度,µ是一个固定的、可调的参数。我们在哈希表中搜索这些块中的每一个,并查找每个未分配的条目,记录下来用于下一阶段的分配。
其次,我们为构建的分配和可见性阵列中的每个非零条目分配体素块。
第三,我们构建了一个实时哈希条目的列表,即包含投影在可见截锥体内的条目。
以当前3d坐标正负mu内的立方体包含多少个体素块,确认其可见性及是否分配内存,如果没有分配内存的为其分配内存。
每个体素块为8*8*8,其存储的对应pos为左下角最小坐标。
3.2 Voxel Hashing
论文《Real-time 3D Reconstruction at Scale using Voxel Hashing》阅读_体素哈希-CSDN博客
代码中Hash entries和Voxel Block个数都是用宏定义为12万个,其中Ordered entries为10万个,unordered entries为2万个。
体素块入口结构体,Pos就是体素块最左下角坐标。通过Hash function这个pos就可以在ordered entries中找到其对应的体素块;当哈希桶溢出时,需要通过offset在unordered entries(代码里是excess list)查找其对于的体素块;
Ptr指向其在local VBA中的位置,local VBA下一节讲述。
3.3 swapping
论文中给出的说明图,为GPU和CPU的之间内存对应关系。但其实device voxel可以理解为当前需要处理的可视部分的体素块;host voxel memory可理解为global体素块,所有体素块都存储在这里。
3.3.1 Local VBA
InfiniTAM v3中localVBA的使用原理-CSDN博客
Local VBA就是device voxel。
3.4 integration
用于场景重建的TSDF的替代方案。一方面,它们可以用于处理动态场景,因为冲浪模型的表面可以四处移动,而不需要更新另一方面,surfel中的可见性确定和碰撞检测场景可能比使用TSDF时的成本高得多。我们添加到的实施InfiniTAM旨在让其他人更容易在单个框架内探索这种权衡。
3.5 Tracking
3.5.1 RGB颜色图像对齐追踪。
ITMColorTracker
彩色图像可以在ITMColorTracker中使用。在这种情况下,对齐过程如下所示:
•从初始点的角度创建表面点列表V和相应的颜色列表C
•将V的所有点投影到当前彩色图像I中,并计算颜色差异,即。
d=k I(π(RV(I)+t))−C(I)k2
•使用Levenberg-Marquardt优化算法求差平方和的R和t最小化。
3.5.2 重定位
实现了一个跟踪质量评估系统,允许检测跟踪故障,以便触发接下来描述的重新定位系统。