点云重建总结

几何处理和三维视觉

几何处理:是一种计算的方法研究世界中的物理对象,通过硬件扫描生成物理对象的三维模型然后做各种处理和分析。

三维视觉:传统的3D视觉是指从图像中恢复底层的三维结构。

1 几何重建

1.1几何重建的基本流程

  • 扫描:从不同视角观察获取深度信息。(shape from X)、激光雷达等。
  • 配准:将不同视角观察同一事物获得的多个点云合并到一起。
  • 重建:根据点云数据构建网格模型。

从点云重建网格模型的关键是从离散点构造出拓扑连接关系,常见分为两种:

  • 基于计算几何学的显式方法:

认为输入点云中的每个点都是重构网格的顶点,计算输入点云的Delaunay图或其对偶的Voronoi图,利用这些图结构构造出点云中的拓扑关系。

可以最大程度地保持重建网格和输入点云的几何特征一致性。

很依赖输入点云的质量,若点云含有噪声则需要去噪后再重构。

  • 基于隐式曲面的隐式方法:认为输入点云是三维空间在隐式函数零水平集的采样。先根据点云位置拟合出光滑的隐式函数再构造轮廓面。最后将隐式函数的零水平集离散为三角网格。

2、Delaunay算法

以Delaunay2D为例:

1、定义:假设V是二维点集,边e是由V中的点作为端点构成的封闭线段,E为e的集合

三角剖分:给定平面点集生成三角形集合的过程。

在这里插入图片描述

给定点集的三角剖分并不唯一,评价一个三角剖分的好坏有以下标准:

  • 最小角:所有三角形的内角中最小的角。
    在这里插入图片描述

  • 纵横比:三角形最短边和最长边的比例。

  • 半径比:三角形内接圆和外接圆半径的比例。

  • 空圆特性:对于边e(a,b)若存在一个圆经过a,b两点,且圆内不含V中的其他任何点。则e是Delaunay边。

在这里插入图片描述

Delaunay三角剖分:所有三角形的外接圆均满足空圆性质。

2、Delaunay三角剖分的构造算法

是通过逐点插入来实现的。如Bowyer-Watson算法。

  • 构造一个包含所有点的三角形,放入三角形链表。
  • 将点集中的点依次插入,在三角形链表中找出插入点的影响三角形:三角形外接圆包含插入点。删除影响三角形的公共边,将插入点与影响三角形的全部顶点连接起来。
  • 对局部形成的三角形进行优化,将形成的三角形加入三角形链表。
    在这里插入图片描述

3、相关实现

matlab可直接调用delaunay;

python:

from scipy.spatial import Delaunay
def create_delauney(points):
    # create a Delauney object using (x, y)
    tri = Delaunay(points)

c++可以使用第三方库如vtk、CGAL库。

相关软件:CloudCompare:Edit->Mesh->Delaunay 2.5D。

3 基于隐式曲面的隐式方法

主要分为以下两步:

  • 从点云构建隐函数的定义;
  • 从隐函数零水平集抽取等值面、重建网格模型;

3.1 Marching Cubes

1.1 对每个数据点拟合切平面

  • 切平面以中心点 o o o 和法线方向 n ⃗ \vec n n 来表示,选取采样点附近的 k 个点 x i x_i xi,则 o o o 取这 k 个点的重心 o = 1 k ∑ i = 1 k x i o=\frac{1}{k}\sum_{i=1}^{k}x_i o=k1i=1kxi n ⃗ \vec n n 取协方差矩阵 ∑ i = 1 k ( x i − o ) ( x i − o ) T \sum_{i=1}^{k}(x_i-o)(x_i-o)^T i=1k(xio)(xio)T 最小特征值对应的特征向量;详细见:

1.2 让拟合出的切平面在局部的朝向尽量一致

  • 构建欧式最小生成树连接各切平面中心,再连接各切平面中心的k近邻向EMST加入一些新的边得到黎曼图。
  • 选择一个法线最接近于Z轴的切平面,以此法线为朝向根据最小生成树将法线方向传播到黎曼图中的邻近平面。如果两个邻近平面的法线夹角大于180°则暂时反转法线朝向。

1.3 根据切平面生成距离函数f

  • 输入点云数据的采样密度ρ,噪声量级 δ \delta δ.找到距离p最近的切平面中心 o i o_i oi,计算p在该切平面的投影点z,如果z与所有切平面中心之间的最小距离大于 ρ + δ ρ+\delta ρ+δ,则 f ( p ) = ( p − o i ) ⋅ n i ⃗ f(p)=(p-o_i)\cdot\vec{n_i} f(p)=(poi)ni ,否则认为f§是未定义的。

2、抽取等值面,重建网格模型

  • 定义一个空间的立方体划分,每个立方体的边长小于 ρ + δ ρ+\delta ρ+δ(小立方体称为体素);
  • 对于每个立方体计算顶点处有符号距离函数f的值;
  • 对于每条边,如果连接的两个顶点f符号不同则在这边上插值计算插值为0的位置,放置顶点;

根据顶点处的f取值的正负共有256种情况,去除旋转映射后重合的情形共有15种基本情形。

在这里插入图片描述

所有体素处理完成后就得到网格模型。

实现:c++可使用pcl库

3.2 滚球法

https://vgc.poly.edu/~csilva/papers/tvcg99.pdf

Ball-Pivoting Algorithm (BPA) 对给定的点云插值得到一个三角形网格。

  • 想象在点云“表面”上滚动一个半径为p(p应该比点之间的平均距离略大)的小球,当球接触到三个点时,这三个点将形成种子三角形。从这个种子三角形开始,球与端点保持接触围绕其中一个边进行旋转直到触及另一个点,形成新的三角形。持续该过程直到所有可到达的边都尝试过。继续从另一个种子三角形开始直到所有的点都被考虑到。

  • 最后可以使用半径更大的球重复上述过程。
    在这里插入图片描述

  • 球半径如何选择:半径是根据输入点云的大小和比例凭经验获得的。理论上,球的直径应该略大于点之间的平均距离。

  • 如上图b,当采样密度较低时导致会有一些边不会被创建,存在孔洞。

  • 如上图c,当存在曲率较大时会导致球旋转时不会经过一些点会丢失一些特征。

实现:软件meshlab

c++可使用vcglib库。

3.3 贪心投影三角化法

对原始点云进行快速三角化的算法,该算法假设曲面光滑,点云密度变化均匀,不能在三角化的同时对曲面进行平滑和孔洞修复。

1、定义
贪婪投影算法(Greedy Projection Algorithm)是M. Gopi等人[1]于2003年提出的点云表面重建算法。该算法从一个数据点R开始,找到与R相邻的一组数据点,连接R与该组数据点,就可得到数据点R的所有邻接三角形(顶点中包含R的三角形)。然后以广度优先搜索的形式,遍历中的数据点,找到这些数据点的邻接三角形,直到遍历完所有数据点。该算法的重点在于如何连接数据点R和以生成高质量三角形(避免小角度),并保证三角形不会交叠。算法通过投影的方式,将三维数据点投影至二维,在二维平面内连接数据点,以获取不交叠三角形;通过贪婪的方式,当有多个数据点可连成三角形时,尽可能生成角度大的三角形。

2、算法流程

  • 首先以R为中心,长为μ*m的正方体初步筛选相邻数据点。其中μ为用户定义的常量,表示相邻区域的范围;m为R与最近点的距离。然后计算数据点到R的距离,准确筛选出半径以内的数据点。在PCL中,是通过设置常量(mu_),搜索半径(search_radius_),最大搜索数目(nnn_)来确定相邻数据点。首先搜索最近的nnn_个数据点,然后选出距离小于 m u ∗ m mu*m mum和search_radius_的数据点作为相邻点集 C R C_R CR。_
  • 局部区域三维数据点连线问题可以简化至二维平面:我们可以沿着数据点R的法向量进行投影,R的投影R_为投影平面的坐标原点, C R C_R CR的投影结果定义为 C P R C_P^{R} CPR
  • 按角度排序 C P R C_P^{R} CPR:投影点与坐标原点R_可连成向量,根据这些向量到X轴的角度排序。按照该排序依次连接中的数据点就可以形成不交叠的三角形。但是 C P R C_P^{R} CPR中可能有部分点已经生成过三角形,所以要删除部分数据点以避免与原三角形交叠。

3、根据可见度删除数据点(Pruning by Visibility)

在这里插入图片描述

  • 如图1中R与数据点V的连线会与已有三角形相交,应删除数据点V。
  • 删除数据点R的边界边之间的数据点。定义数据点R的边界边之间区域为R的不可见区域,如图1黑色点,当R与这些黑色点相连时会与现有三角形交叠,所以应删除这些黑色点。
  • 删除会被已有网格阻挡的数据点如图白色点。

4、根据角度删除数据点(Pruning by Angle Criterion)

根据可见度删除数据点后,依次连接相邻点就可形成不交叠的三角形,但是这样很容易形成小角度三角形。最好的方式是直接连接和形成大角度三角形,按照如下方法来寻找所有可与线段RP连成三角形的数据点。其中按到R的距离从小到大排列相邻点得到 P s = N 1 , N 2 , N 5 , N 4 , N 3 P_s={N_1,N_2,N_5,N_4,N_3} Ps=N1,N2,N5,N4,N3;按角度排列相邻点 R s = N 1 , N 2 , N 3 , N 4 , N 5 R_s={N_1,N_2,N_3,N_4,N_5} Rs=N1,N2,N3,N4,N5

则执行算法后, N 1 , N 2 , N 3 N_1,N_2,N_3 N1,N2,N3可以跟RP形成三角形,再根据角度要求可形成 R P N 3 RPN_3 RPN3。再寻找可与 R N 3 RN_3 RN3连成三角形的数据点,仅有 N 4 N_4 N4符合要求,所以可连接 N 3 N 4 N_3N_4 N3N4
在这里插入图片描述
在这里插入图片描述

5、三角化

依次连接剩下的数据点就可连成三角形。若相邻数据点的角度过大(如大于120°),则不连成三角形。

6、参考文献
A Fast and Efficient Projection Based Approach for Surface Reconstruction.

实现:c++可使用pcl库。

3.4 泊松重建

泊松重建算法更适合水密性即模型是闭合的三维点云数据,而现实中自己所采用的数据并不会向官方数据集中的数据那样完美,所以在利用泊松重建的过程中就会出现大量的“假想”冗余平面。

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 三维点重建是将离散的二维图像或深度图像转换为三维点的过程。在Matlab中,可以使用计算机视觉和深度学习工具箱来实现三维点重建。 首先,需要读取输入的二维图像或深度图像。可以使用imread函数读取输入图像,然后对其进行预处理,如图像灰度化或归一化。 接下来,可以使用计算机视觉工具箱中的特征提取和匹配算法来对二维图像进行特征点匹配。例如,可以使用SURF或SIFT算法检测和描述图像的特征点,并利用RANSAC算法进行特征点匹配和去除错误匹配。 然后,可以使用深度学习工具箱中的深度估计网络进行深度图像的估计。深度估计网络可以根据输入的二维图像预测每个像素的深度值。例如,可以使用深度学习框架中的卷积神经网络(CNN)或全卷积神经网络(FCN)进行深度估计。 最后,根据二维图像中的特征点和深度图像的深度值,可以通过三角剖分算法或稠密重建算法将特征点转换为三维点。可以使用Matlab的triangulation函数进行三角剖分或使用重建算法将离散的深度点转换为稠密的三维点总结而言,三维点重建的Matlab代码主要包括读取和预处理输入图像、特征点匹配、深度图像的估计和三维点的生成。在实际应用中,还可以对生成的三维点进行滤波、降噪和表面重建等后处理操作,以提高重建结果的质量和精度。 ### 回答2: 三维点重建是通过利用点数据进行三维模型的重建和重构的过程。在Matlab中,可以使用一些工具和库来实现点重建的功能。 首先,要导入点数据。可以使用Matlab的PointCloud对象来加载点数据。例如,可以使用pcdread函数来读取.pcd文件,或者使用plyread函数来读取.ply文件。 然后,可以使用点数据进行三维模型重建。在Matlab中,可以使用点处理工具箱(Point Cloud Processing Toolbox)来进行重建。其中,一种常用的方法是基于三角化的点重建方法。 在进行三维点重建时,首先需要对点进行滤波和预处理,以去除噪音和无效点。可以使用filterGround函数将地面点过滤掉,或者使用平滑滤波器进行平滑处理。 然后,可以使用点数据进行三维重建。可以使用pointCloudReconstruction函数来进行点三维重建。该函数使用基于距离的重建方法,通过计算点之间的距离来构建三维模型。 在重建过程中,可以设置一些参数来控制重建的精度和速度。例如,可以设置最小距离和最大距离来定义点的有效范围,或者设置采样率来控制密度。 最后,可以使用plot函数将重建的三维模型可视化。可以将点数据和重建的模型一起绘制在三维坐标系中,以便于观察和分析。 综上所述,通过Matlab的PointCloud对象和点处理工具箱,可以实现三维点重建。通过导入点数据,进行滤波和预处理,使用点重建算法进行重建,最后将重建的模型可视化,可以得到一个完整的三维点重建的Matlab代码。 ### 回答3: 三维点重建是指通过一系列的点数据,利用计算机算法将这些点数据转换为三维模型的过程。Matlab是一种强大的科学计算软件,也可以用于进行三维点重建。 在Matlab中,可以利用点库pcl(Point Cloud Library)来进行三维点重建。pcl提供了一系列的点处理算法和工具,可以很方便地实现点重建功能。 点重建的基本步骤如下: 1. 导入点数据:首先,需要将点数据导入Matlab中。点数据可以通过激光扫描仪、摄像机等设备获取,也可以从已有的点数据文件中读取。 2. 数据预处理:对导入的点数据进行预处理,包括去噪、滤波、点配准等操作。这些操作可以帮助消除噪点,提高点数据的质量。 3. 特征提取:在进行重建之前,需要提取点数据中的特征。常用的特征包括表面法向量、曲率等,可以通过计算点数据的几何属性得到。 4. 三维重建:利用特征提取的结果,可以进行三维重建。在Matlab中可以使用pcl库中的算法,如贪婪投影三角化(greedy projection triangulation)、无约束全局优化(unconstrained global optimization)等。 5. 结果显示与分析:最后,可以将重建结果显示出来,并进行结果的分析和评估。Matlab提供了丰富的绘图函数和可视化工具,方便对重建结果进行展示和分析。 总结一下,三维点重建的Matlab代码主要包括导入点数据、数据预处理、特征提取、三维重建等步骤。通过调用pcl库中的算法和函数,可以实现三维点重建和可视化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值