Surfel-Based Mesh Reconstruction

​ 该算法是输入是RGB-D图像流,和通过SLAM系统求出的相机位姿(ElasticFusion),该算法由四大部分组成

surfel reconstruction,采用ElasticFusion的方式进行面元重建;

surfel denoising,创新点;

meshing,采用A fast and efficient projection-based approach for surface reconstruction类似方法;

remeshing,创新点。

前两部分主要是对点云进行处理,后两部分主要是对点云进行网格三角化。

原文

一、Surfel Reconstruction

​ 我们的算法是对一个surfel cloud进行三角划分。为重建出这些cloud,我们采用ElasticFusion,以下阐述这种算法以及我们的修改。

​ 从RGB-D图像输入流中,新来一帧图像时,数据关联步骤会决定深度测量值是创建一个新的surfel还是用来修正已有的surfel。对于回环检测部分,surfel cloud会变形对齐到匹配的表面。

Surfel s表示

{ P s 坐 标 c s 颜 色 n s 法 向 量 σ s 置 信 度 r s 半 径 t s , 0 创 建 时 间 t s 最 后 更 新 时 间 \left\{\begin{matrix} P_s && 坐标 \\c_s && 颜色 \\n_s && 法向量 \\\sigma_s && 置信度 \\r_s && 半径 \\t_{s,0} && 创建时间 \\t_s && 最后更新时间 \end{matrix}\right. ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧​Ps​cs​ns​σs​rs​ts,0​ts​​​坐标颜色法向量置信度半径创建时间最后更新时间​

数据关联。

类似于[24],我们投影surfels到当前帧图像,决定哪个深度测量值关联已存在的surfels。为了决定哪个surfel投影到哪个pixel,[24]创建了一种super-sampled 索引图来渲染所有surfels, 但仍然受限于分辨率。我们通过始终直接从投影操作的结果中获取面元索引来改进这一点。 对于获取数据关联, 每个surfel针对投影到像素,以及这个像素相邻像素进行评估,使用一个简单模型,测量深度为 z z z,对于离这个像素距离在 [ ( 1 − γ ) z , ( 1 + γ ) z ] [(1-\gamma)z,(1+\gamma)z] [(1−γ)z,(1+γ)z]内的surfel,称为支持sufel,在小于区间的最小值,称为冲突surfel,大于区间的最大值,则称为占用surfel。

测量融合

​ 我们为没有关联到冲突surfel或者支持surfel的像素点创建一个新的surfel。初始化surfel的值,半径r由下式计算,p(x,y)是像素点(x,y)对应的3D坐标。

在图像空间中半径内的像素作为直接邻居,进而推算出3D空间中surfel的邻居以及与邻居的距离。

​ 像[24]那样融合当前surfel,不同的是我们将其融合到支持surfels中,将当前的surfel与每个支持的surfel使用下式进行加权平均。权重 ω \omega ω由所有支持surfels个数的倒数。

回环检测

​ 该部分和ElasticFusion中的回环检测相似。

二、Surfel Denosing

​ 尽管在融合surfel时用的加权平均,但在surfel还是存在很多噪声,在融合深度图的边界可能出现不连续的点,我们使用混合的方式处理这个问题。

Regularization

​ 正则化的目的是保持一个平滑的surfel,减少与邻近的surfel之间的噪声。对surfel的结构进行扩展, p s p_s ps​,四个邻居surfel的下标索引 N s N_s Ns​,用来加速计算梯度临时存储。每个面元的降噪后的位置取决于邻居的降噪后的位置,邻居又取决于邻居的邻居,以此类推。

通过优化两个误差项,来更新surfel的位置和法向量。

Observation Boundary Blending

​ 使用算法1,来避免,在优化之后,出现观察和没观察的边界之间不连续的情况。

按照算法1流程,将灰色的点的深度线性靠近到黑色表面。

最后使用icp将之前重建好的点(黑色)对齐到当前的点(灰色)。

三、Meshing

​ 我们需要一个非常快的尺度无关的网格算法,来对数百万surfel进行三角网格化。对于meshing网格化使用[22]、[23],并作小的修改。

Spatial access

​ 网格划分算法需要快速准确地找到一个surfel半径内所有其他surfel。因此需要一个空间访问结构。使用八叉树进行存储。

Triangulation

​ 网格划分算法贪婪地遍历所有surfels,并对每个surfel与它邻近的surfels进行局部三角化,以增加网格。每一个surfel有三种状态,

  1. free 没有附带三角形。
  2. front 在三角网格的边界上。
  3. completed 在三角网格里。

所有新的surfel都为free状态。算法遍历所有的新的surfel…

对于遍历到某surfel,使用surfel的半径来进行搜索srufel,如果当前surfel在网格边界上,且边界邻居在半径外,我们就扩展搜索半径为2倍,以包含这些邻居。将所有的邻居surfel投影到当前surfel的切平面上,对于投影后的surfel不可见,或者法向量相差太多,就丢弃该投影。如下图。

如果当前surfel三free状态,则首先尝试创建一个初始三角形,如下图。

将当前surfel的所有邻居按角度进行排序,相邻两个邻居之间成为空隙,如果相邻两个邻居之间的夹角过大,则会形成狭窄的三角形,则会丢弃该三角形。

最后通过三角形填充完所有相邻邻居之间的空隙。

四、Remeshing

​ 当surfels移动或创建新的surfels时,网格的现有部分可能会过时,需要有效地更新。对此,我们提出的方法工作在现有网格算法遍历每个网格之前,首先定义一种网格状态,存在一个洞,上图的e,红色部分的三角形,这里不可能生成一个表面,所以最后的渲染结果会存在一个洞,我们首先要识别所有的洞,然后使用网格算法重建那里的表面。

识别步骤

​ 对于一个有效的三角形,它至少有一个顶点s,s是包含了s所有搜索半径内的邻居,且法向量相似。

​ 三角形的法向量必须与这个顶点s的在90度内。

​ 在s的切平面,没有其他邻居再投影到这个三角形中,并且这个三角形不会与另一个三角形相交。

如上红色部分是一个洞,导致周围几个三角形都不是有效的三角形。接下来将这些三角形,以及对应的顶点的三角形都删除,最后再进行上一节中的meshing,就可以重建出有效的比较好的表面。

SurfelMeshing 解析相关推荐

  1. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

  2. List元素互换,List元素转换下标,Java Collections.swap()方法实例解析

    Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...

  3. 条形码?二维码?生成、解析都在这里!

    二维码生成与解析 一.生成二维码 二.解析二维码 三.生成一维码 四.全部的代码 五.pom依赖 直接上代码: 一.生成二维码 public class demo {private static fi ...

  4. Go 学习笔记(82)— Go 第三方库之 viper(解析配置文件、热更新配置文件)

    1. viper 特点 viper 是一个完整的 Go应用程序的配置解决方案,它被设计为在应用程序中工作,并能处理所有类型的配置需求和格式.支持特性功能如下: 设置默认值 读取 JSON.TOML.Y ...

  5. Go 学习笔记(77)— Go 第三方库之 cronexpr(解析 crontab 表达式,定时任务)

    cronexpr 支持的比 Linux 自身的 crontab 更详细,可以精确到秒级别. ​ 1. 实现方式 cronexpr 表达式从前到后的顺序如下所示: 字段类型 是否为必须字段 允许的值 允 ...

  6. mybatis配置文件解析

    mybatis配置文件解析 mybatis核心配置文件`mybatis-config.xml文件. mybatis的配置文件包含了会深深影响mybatis行为的设置和属性信息. 能配置的内容: con ...

  7. 谷歌BERT预训练源码解析(二):模型构建

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_39470744/arti ...

  8. Python 标准库之 xml.etree.ElementTree xml解析

    Python 标准库之 xml.etree.ElementTree Python中有多种xml处理API,常用的有xml.dom.*模块.xml.sax.*模块.xml.parser.expat模块和 ...

  9. 谷歌BERT预训练源码解析(三):训练过程

    目录 前言 源码解析 主函数 自定义模型 遮蔽词预测 下一句预测 规范化数据集 前言 本部分介绍BERT训练过程,BERT模型训练过程是在自己的TPU上进行的,这部分我没做过研究所以不做深入探讨.BE ...

最新文章

  1. 中科点击矩阵式推进大数据落地与应用
  2. msql安装(zip)
  3. /usr/share/virtualenvwrapper/virtualenvwrapper_lazy.sh: No such file or directory解决方案
  4. js粘贴板为什么获取不到图片信息_【第1829期】复制黏贴上传图片和跨浏览器自动化测试...
  5. ASP.NET MVC3 系列教程 - 部署你的WEB应用到IIS 6.0
  6. [转载] 【python魔术方法】迭代器(__iter__和__next__)
  7. php怎么跟小程序链接,小程序的链接怎么提取?
  8. 小程序学习笔记三:页面文件详解之视图层WXML、WXS、WXSS文件
  9. 自学python入门训练营 李笑来_如何看待李笑来发布的Python教程《自学是门手艺》?...
  10. HTML前端数据管理,前端数据管理
  11. plsql 备份还原 教程_PLSQL导出还原数据库
  12. OI国家集训队论文集1999~2018
  13. 怎么查看html隐藏代码,隐藏HTML源代码 怎样查看网页中隐藏的html源码
  14. linux驱动:二、LED灯驱动编写
  15. golang数据结构初探之管道chan
  16. Codeforces Round #703 (Div. 2)C1C2 Guessing the Greatest(二分)
  17. 微信引流常用几大技巧
  18. 轻量级的肝脏与肝肿瘤 2.5D 分割网络阅读笔记
  19. 格与布尔代数(笔记)
  20. 1 php方式实现购物车原理,PHP购物车实现的原理

热门文章

  1. iperf测UDP和TCP丢包率及带宽
  2. 基于颜色的交通标志检测方法分析
  3. 东北林业大学计算机专业学科评估,东北林业大学a+学科有哪些?东北林业大学第四次学科评估成绩...
  4. uni动态class
  5. 使用Logistic回归进行评估分析
  6. MonkeyRunner_1_MonkeyRunner的简介
  7. 备案新规:个人网站有行业内容必须转为企业备案,草根站长该如何应对?
  8. vivo全球商城:电商交易平台设计
  9. 《人工智能导论》第二章:智能Agent(笔记一)
  10. 5个常见运维场景,用这几个Python脚本就够了