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

相关文章

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

使用Python检查CPU型号并弹出警告信息

《使用Python检查CPU型号并弹出警告信息》本教程将指导你如何编写一个Python程序,该程序能够在启动时检查计算机的CPU型号,如果检测到CPU型号包含“I3”,则会弹出一个警告窗口,感兴趣的小... 目录教程目标方法一所需库步骤一:安装所需库步骤二:编写python程序步骤三:运行程序注意事项方法二

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

linux 下Time_wait过多问题解决

转自:http://blog.csdn.net/jaylong35/article/details/6605077 问题起因: 自己开发了一个服务器和客户端,通过短连接的方式来进行通讯,由于过于频繁的创建连接,导致系统连接数量被占用,不能及时释放。看了一下18888,当时吓到了。 现象: 1、外部机器不能正常连接SSH 2、内向外不能够正常的ping通过,域名也不能正常解析。

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室

Java程序到CPU上执行 的步骤

相信很多的小伙伴在最初学习编程的时候会容易产生一个疑惑❓,那就是编写的Java代码究竟是怎么一步一步到CPU上去执行的呢?CPU又是如何执行的呢?今天跟随小编的脚步去化解开这个疑惑❓。 在学习这个过程之前,我们需要先讲解一些与本内容相关的知识点 指令 指令是指导CPU运行的命令,主要由操作码+被操作数组成。 其中操作码用来表示要做什么动作,被操作数是本条指令要操作的数据,可能是内存地址,也

UMI复现代码运行逻辑全流程(一)——eval_real.py(尚在更新)

一、文件夹功能解析 全文件夹如下 其中,核心文件作用为: diffusion_policy:扩散策略核心文件夹,包含了众多模型及基础库 example:标定及配置文件 scripts/scripts_real:测试脚本文件,区别在于前者倾向于单体运行,后者为整体运行 scripts_slam_pipeline:orb_slam3运行全部文件 umi:核心交互文件夹,作用在于构建真