FlashFusion: Real-time Globally Consistent Dense 3D Reconstruction using CPU Computing

本文主要是介绍FlashFusion: Real-time Globally Consistent Dense 3D Reconstruction using CPU Computing,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 系统结构
  • 相机定位
  • TSDF建图
    • 有效体素块选择
    • 基于关键帧的优化
  • Mesh创建
    • 创建多边形
    • 法线计算
  • 地图重组

系统结构

framework of FlashFusion
项目地址: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,jTi,jSE3)=k=0Ci,j1pikTi,jpjk2(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=0N1jΦ(i)Ei,j=i=0N1jΦ(i)k=0Ci,j1pikTi,jpjk2(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,ksi1,j,ksi,j+1,ksi,j1,ksi,j,k+1si,j,k1(3) i , j , k i,j,k i,j,k是最近的体素,这些体素在Mesh生成时已由算法确定。同时本文维护体素块的相邻体素块地址,降低体素块周围的Mesh生成时的计算量。

地图重组

在当前的地图选择策略下,每个关键帧对应的非关键帧最多为十个。

这篇关于FlashFusion: Real-time Globally Consistent Dense 3D Reconstruction using CPU Computing的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/385118

相关文章

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的