SurfelMeshing 解析

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. Pscsnsσsrsts,0ts

数据关联。

类似于[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坐标。

image-20220303165801079

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

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

回环检测

​ 该部分和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,来避免,在优化之后,出现观察和没观察的边界之间不连续的情况。

image-20220304144927561

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

image-20220304145303513

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

image-20220304145451894

三、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不可见,或者法向量相差太多,就丢弃该投影。如下图。

image-20220304091341860

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

image-20220304091356563

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

image-20220304091421792

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

image-20220304091434678

四、Remeshing

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

识别步骤

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

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

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

image-20220304101726884

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

image-20220304102323351

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值