从零开始一起学习SLAM | 点云到网格的进化
点击公众号“计算机视觉life”关注,置顶星标更快接收消息!
本文编程练习框架及数据获取方法见文末获取方式
菜单栏点击“知识星球”查看「从零开始学习SLAM」一起学习交流
小白:师兄,师兄,你在《从零开始一起学习SLAM | 给点云加个滤网》、《从零开始一起学习SLAM | 点云平滑法线估计》中都提到了点云网格化,这个听起来高大上,不过到底是什么意思呢?
师兄:别急,是这样的:你看我们之前处理的都是一个个点,不管是滤波还是平滑,我们都是对一个个离散的空间点进行的处理,虽然你远看能看出物体的轮廓,但是拉近了看是一个个分散的空间点,是吧?

小白:是啊,这样不算是3D模型吧
师兄:嗯,这样的结果分辨率比较低,也没办法进行三维打印,点云网格化就是用点云生成网格,最后得到的是一个连续(相对于前面的离散点)的表面。如果再加上纹理贴图,就能得到和真实物体一样的三维模型了
什么是网格?
小白:师兄,你说了很多次网格,其实我还不知道网格到底是啥?
师兄:哦,忘记说这个最基本的概念了。网格主要用于计算机图形学中,有三角、四角网格等很多种。下面左图就是四角网格,右图是三角网格

不过,计算机图形学中的网格处理绝大部分都是基于三角网格的,三角网格在图形学和三维建模中使用的非常广泛,用来模拟复杂物体的表面,如建筑、车辆、动物等,你看下图中的兔子、球等模型都是基于三角网格的

小白:仔细看了下还真是,为啥一般用三角网格啊?是因为三角形的稳定性吗?(滑稽)
师兄:还真是一个原因。三角形表示网格也叫三角剖分。它有如下几个优点:
1、正如你所说的,稳定性强。
2、三角网格比较简单(主要原因),实际上三角网格是最简单的网格类型之一,可以非常方便并且快速生成,在非结构化网格中最常见。而且相对于一般多边形网格,许多操作对三角网格更容易。
3、有助于恢复模型的表面细节。
小白:原来如此。三角网格在空间中如何表示呢?
师兄:实际应用中出现的三角网格,每个三角形都和其他三角形共享边。所以三角网格需要存储三类信息:
- 顶点。每个三角形都有三个顶点,各顶点都有可能和其他三角形共享。
- 边。连接两个顶点的边,每个三角形有三条边。
- 面。每个三角形对应一个面,我们可以用顶点或边列表表示面。
网格生成算法有什么要求?
小白:那这个点云网格化一般怎么做呢?
师兄:点云网格化一般输入就是点云啦,输出就是三维网格啦,不过输入的点云一般面临几个问题,我们前面也提到过:
1、点云噪声。 每个点云都会带有噪声,噪声有可能和物体表面光学性质、物体深度、传感器性能等都有关系。
2、点云匹配误差。三维重建中需要将不同帧得到的点云估计其在世界坐标系下的位姿,会引入一定的位置误差。
3、点云分布。分布的不均匀性体现在两个方面。一个是每个点云在不同的方向上分布是不均匀的另一个是不同的点云匹配后,不同位置的点云密度是不一样的。
4、缺失数据。 扫描中如果碰到不易成像的部位(比如不可见、反光等等),那么这部分的数据是缺失的,点云是不完整的。
小白:点云有这么多问题,网格化算法肯定要求比较高了?
师兄:是的,想要生成漂亮的网格,除了网格密度和精度外,我们还希望网格生成算法有如下的能力:
1、对点云噪声有一定的冗余度。
2、能够重建出曲率变化比较大的曲面。
3、能够处理大数据量,算法时间和空间复杂度不会太高。
4、重建出的网格中包含尽可能少的异常三角片,比如三角片交错在一起、表面法向量不连续或不一致、同一个位置附近出现多层三角片等。
小白:感觉要求挺高的,那我们一般用什么算法呢?
师兄:目前点云进行网格生成一般分为两大类方法:
1、 插值法。顾名思义,也就是重建的曲面都是通过原始的数据点得到的
2、逼近法。用分片线性曲面或其他曲面来逼近原始数据点,得到的重建曲面是原始点集的一个逼近。
点云贪心三角化原理
师兄:我们主要介绍一种比较简单的贪心三角化法(对应的类名:pcl::GreedyProjectionTriangulation),也就是使用贪心投影三角化算法对有向点云进行三角化。
小白:为啥介绍这个,有啥特点?
师兄:该算法的优点是可以用来处理来自一个或者多个设备扫描到得到、并且有多个连接处的散乱点云。但是也是有很大的局限性,它更适用于采样点云来自表面连续光滑的曲面,并且点云的密度变化比较均匀的情况
小白:这样啊,难怪之前师兄要讲点云滤波和平滑呢,原来都是铺垫啊
师兄:哈哈,是的。
小白:那这个贪心三角化法到底是什么原理呢?
师兄:贪心投影三角化的大致流程是这样的:
(1)先将点云通过法线投影到某一二维坐标平面内
(2)然后对投影得到的点云做平面内的三角化,从而得到各点的拓扑连接关系。平面三角化的过程中用到了基于Delaunay三角剖分 的空间区域增长算法
(3)最后根据平面内投影点的拓扑连接关系确定各原始三维点间的拓扑连接,所得三角网格即为重建得到的曲面模型
Delaunay 三角剖分简介
小白:师兄,这个Delaunay是啥?
师兄:先说说点集的三角剖分(Triangulation)吧,对数值分析以及图形学来说,三角剖分都是极为重要的一项预处理技术。而Delaunay 三角剖分是一种常用的三角剖分的方法,这个方法比较常见,关于点集的很多种几何图都和Delaunay三角剖分相关,如Voronoi图,当然这些很复杂了。我们这里只是简单介绍一下Delaunay 三角剖分,不然估计你要头大了。
小白:师兄,你一连说了几个我从来没听过的术语,我已经头大了。。
师兄:哈哈,那打住,只简单提一下Delaunay 三角剖分。你看下面这个图,左侧就是不满足Delaunay 三角剖分,右侧是Delaunay 三角剖分的结果。

小白:看起来右边的图好像很规则啊
师兄:的确,Delaunay 三角剖分的有两个优点:
1.最大化最小角,“最接近于规则化的“的三角网。
2.唯一性(任意四点不能共圆)。
我们来看一下它的定义,有点拗口:点集
从零开始一起学习SLAM | 点云到网格的进化的更多相关文章
- 从零开始一起学习SLAM | 点云平滑法线估计
点击公众号"计算机视觉life"关注,置顶星标更快接收消息! 本文编程练习框架及数据获取方法见文末获取方式 菜单栏点击"知识星球"查看「从零开始学习SLAM」一 ...
- 从零开始一起学习SLAM | 掌握g2o边的代码套路
点"计算机视觉life"关注,置顶更快接收消息! 小白:师兄,g2o框架<从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码>,以及顶点<从零开始 ...
- 从零开始一起学习SLAM | 掌握g2o顶点编程套路
点"计算机视觉life"关注,置顶更快接收消息! ## 小白:师兄,上一次将的g2o框架<从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码>真的很清晰 ...
- 从零开始一起学习SLAM | 用四元数插值来对齐IMU和图像帧
视觉 Vs. IMU 小白:师兄,好久没见到你了啊,我最近在看IMU(Inertial Measurement Unit,惯性导航单元)相关的东西,正好有问题求助啊 师兄:又遇到啥问题啦? 小白:是这 ...
- 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码
首发于公众号:计算机视觉life 旗下知识星球「从零开始学习SLAM」 这可能是最清晰讲解g2o代码框架的文章 理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种 ...
- 从零开始一起学习SLAM | 给点云加个滤网
对VSLAM和三维重建感兴趣的在计算机视觉life"公众号菜单栏回复"三维视觉"进交流群. 小白:师兄,上次你讲了点云拼接后,我回去费了不少时间研究,终于得到了和你给的参 ...
- 从零开始一起学习SLAM | 你好,点云
本文提纲 先热热身点云是啥你知道点云优缺点吗?点云库PCL:开发者的福音PCL安装指北炒鸡简单的PCL实践留个作业再走先热热身 小白:hi,师兄,好久不见师兄:师妹好,上周单应矩阵作业做了吗?小白:嗯 ...
- 从零开始一起学习SLAM | 为什么要学SLAM?
在<零基础小白,如何入门计算机视觉?>中我提到过,计算机视觉的研究目前主要分为两大方向:基于学习的方法和基于几何的方法.其中基于学习的方法最火的就是深度学习,而基于几何方法最火的就是视觉S ...
- 从零开始一起学习SLAM | 神奇的单应矩阵
小白最近在看文献时总是碰到一个奇怪的词叫“homography matrix”,查看了翻译,一般都称作“单应矩阵”,更迷糊了.正所谓:“每个字都认识,连在一块却不认识”就是小白的内心独白.查了一下书上 ...
随机推荐
- fillder---工具栏隐藏/显示
显示隐藏工具栏方法:view---show toolbar
- 5.基于优化的攻击——CW
CW攻击原论文地址——https://arxiv.org/pdf/1608.04644.pdf 1.CW攻击的原理 CW攻击是一种基于优化的攻击,攻击的名称是两个作者的首字母.首先还是贴出攻击算法的公 ...
- 前端技术之--CSS
在标签上设置style属性: background-color: #2459a2; height: 48px; ... 编写css样式: 1. 标签的style属性 2. 写在head里面 style ...
- arraylist 为什么 删除元素时要使用迭代器而不能使用遍历
因为你要是遍历了,arraylist 的长度就变了,容易数组越界和下标问题 public class Test { public static void main(String[] args) ...
- 一天带你入门到放弃vue.js(二)
接下来我们继续学习一天带你入门到放弃系列vue.js(二),如有问题请留言讨论! v-if index.html <div id="app"> <p v-if=& ...
- open
open服务指的是封装的订单流接口,给外部第三方提供使用.(当然也可以区别的名字,我司这么叫而已,并且是用Java写的,谁晓得为什么不选择PHP来写)通过open api合作方就可以通过调用接口直接下 ...
- defer 内追踪变量变化
遇到一个需求,需要追踪变量的最终情况.defer比较合适,但是写了变量和指针都无效,于是试了试: 变量,变量地址,指针的使用情况 func TestDefer(t *testing.T) { a := ...
- 问题11:web前端开发规范手册(转)
一.规范目的 1.1 概述 ..................................................................................... ...
- poj1106
极角排序扫一圈. 今天没什么状态写个水题减轻负罪感(大雾) #include <cstdio> #include <cmath> #include <cstring> ...
- PHP 数组按多个字段排序
$array1 = array( 0=>array('id'=>8,'name'=>'Apple','age'=> 18), 1=>array ...