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

相关文章

无人叉车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:核心交互文件夹,作用在于构建真

python内置模块datetime.time类详细介绍

​​​​​​​Python的datetime模块是一个强大的日期和时间处理库,它提供了多个类来处理日期和时间。主要包括几个功能类datetime.date、datetime.time、datetime.datetime、datetime.timedelta,datetime.timezone等。 ----------动动小手,非常感谢各位的点赞收藏和关注。----------- 使用datet

模具要不要建设3D打印中心

随着3D打印技术的日益成熟与广泛应用,模具企业迎来了自建3D打印中心的热潮。这一举措不仅为企业带来了前所未有的发展机遇,同时也伴随着一系列需要克服的挑战,如何看待企业引进增材制造,小编为您全面分析。 机遇篇: 加速产品创新:3D打印技术如同一把钥匙,为模具企业解锁了快速迭代产品设计的可能。企业能够迅速将创意转化为实体模型,缩短产品从设计到市场的周期,抢占市场先机。 强化定制化服务:面

win10不用anaconda安装tensorflow-cpu并导入pycharm

记录一下防止忘了 一、前提:已经安装了python3.6.4,想用tensorflow的包 二、在pycharm中File-Settings-Project Interpreter点“+”号导入很慢,所以直接在cmd中使用 pip install -i https://mirrors.aliyun.com/pypi/simple tensorflow-cpu下载好,默认下载的tensorflow

定位cpu占用过高的线程和对应的方法

如何定位cpu占用过高的线程和对应的方法? 主要是通过线程id找到对应的方法。 1 查询某个用户cpu占用最高的进程号 top -u 用户名 2 查询这个进程中占用cpu最高的线程号 top –p 进程号-H    3 查询到进程id后把进程相关的代码打印到jstack文件 jstack -l pid > jstack.txt 4 在jstack文件中通过16进制的线程id搜索到