本文主要是介绍FlashFusion: Real-time Globally Consistent Dense 3D Reconstruction using CPU Computing,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 系统结构
- 相机定位
- TSDF建图
- 有效体素块选择
- 基于关键帧的优化
- Mesh创建
- 创建多边形
- 法线计算
- 地图重组
系统结构
项目地址:http://www.luvision.net/FlashFusion/ (暂时还没有代码) 系统结构如上图所示,系统分为三个线程:1、跟踪线程。2、优化线程。3、Mesh生成线程。通过MILD闭环检测器来根据ORB特征点发现闭环。
- 定位:如果当前帧和对应关键帧的特征平均视差大于阈值,当前帧被选为关键帧。在全局优化时,只优化关键帧的位姿,非关键帧的位姿随关键帧一起被优化。
- 重建:体素块包含一定数量的体素,体素块使用动态Hash进行存储。TSDF会进行逐帧更新,而Mesh的更新只在新的关键帧进行。
相机定位
当前帧被选为关键帧之后,最小化到之前的所有关键帧的重投影误差之和。第i帧和第j帧之间的重投影误差为: E i , j ( T i , j ∣ T i , j ∈ S E 3 ) = ∑ k = 0 ∣ C i , j ∣ − 1 ∥ p i k − T i , j p j k ∥ 2 (1) E_{i, j}\left(T_{i, j} | T_{i, j} \in S E 3\right)=\sum_{k=0}^{\left|C_{i, j}\right|-1}\left\|\boldsymbol{p}_{i}^{k}-T_{i, j} \boldsymbol{p}_{j}^{k}\right\|^{2} \tag{1} Ei,j(Ti,j∣Ti,j∈SE3)=k=0∑∣Ci,j∣−1∥∥pik−Ti,jpjk∥∥2(1) 其中 T i , j T_{i,j} Ti,j是关键帧之间的坐标变换 , ( p i k , p j k ) (\boldsymbol{p}_{i}^{k},\boldsymbol{p}_{j}^{k}) (pik,pjk)是一对匹配的特征。全局的误差函数如下: E ( ξ ) = ∑ i = 0 N − 1 ∑ j ∈ Φ ( i ) E i , j = ∑ i = 0 N − 1 ∑ j ∈ Φ ( i ) ∑ k = 0 ∣ C i , j ∣ − 1 ∥ p i k − T i , j p j k ∥ 2 (2) E(\boldsymbol{\xi})=\sum_{i=0}^{N-1} \sum_{j \in \Phi(i)} E_{i, j}=\sum_{i=0}^{N-1} \sum_{j \in \Phi(i)} \sum_{k=0}^{\left|C_{i, j}\right|-1}\left\|\boldsymbol{p}_{i}^{k}-T_{i, j} \boldsymbol{p}_{j}^{k}\right\|^{2} \tag{2} E(ξ)=i=0∑N−1j∈Φ(i)∑Ei,j=i=0∑N−1j∈Φ(i)∑k=0∑∣Ci,j∣−1∥∥pik−Ti,jpjk∥∥2(2) 其中 Φ ( i ) \Phi(i) Φ(i)表示通过MILD算法找到的最相似的五个关键帧。通过FastGO来加速高斯牛顿法最小化 ( 2 ) (2) (2)的过程。
TSDF建图
有效体素块选择
首先通过hash表,找到在相机视野中的体素块,分层检查体素块的有效性。通过首先检查体素块的八个端点的方式,来加速有效体素块的选取。
基于关键帧的优化
将有效体素块存储在关键帧中,方便进行关键帧的去除和重组。同时改进了颜色的存储来加速优化。
Mesh创建
创建多边形
在加入了新的关键帧之后,用包含Mesh的体素的最大tsdfz值作为阈值,超过这个阈值的体素会被忽略。文章认为Mesh顶点一定在边缘上,只需要在边缘上计算权重就可以确定顶点的位置。
法线计算
法线通过如下方式计算: n = [ δ x δ y δ z ] = [ s i + 1 , j , k − s i − 1 , j , k s i , j + 1 , k − s i , j − 1 , k s i , j , k + 1 − s i , j , k − 1 ] (3) \mathbf{n}=\left[\begin{array}{l} \delta_{x} \\ \delta_{y} \\ \delta_{z} \end{array}\right]=\left[\begin{array}{l} s_{i+1, j, k}-s_{i-1, j, k} \\ s_{i, j+1, k}-s_{i, j-1, k} \\ s_{i, j, k+1}-s_{i, j, k-1} \end{array}\right] \tag{3} n=⎣⎡δxδyδz⎦⎤=⎣⎡si+1,j,k−si−1,j,ksi,j+1,k−si,j−1,ksi,j,k+1−si,j,k−1⎦⎤(3) i , j , k i,j,k i,j,k是最近的体素,这些体素在Mesh生成时已由算法确定。同时本文维护体素块的相邻体素块地址,降低体素块周围的Mesh生成时的计算量。
地图重组
在当前的地图选择策略下,每个关键帧对应的非关键帧最多为十个。
这篇关于FlashFusion: Real-time Globally Consistent Dense 3D Reconstruction using CPU Computing的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!