几何处理:是一种计算的方法研究世界中的物理对象,通过硬件扫描生成物理对象的三维模型然后做各种处理和分析。
三维视觉:传统的3D视觉是指从图像中恢复底层的三维结构。
从点云重建网格模型的关键是从离散点构造出拓扑连接关系,常见分为两种:
认为输入点云中的每个点都是重构网格的顶点,计算输入点云的Delaunay图或其对偶的Voronoi图,利用这些图结构构造出点云中的拓扑关系。
可以最大程度地保持重建网格和输入点云的几何特征一致性。
很依赖输入点云的质量,若点云含有噪声则需要去噪后再重构。
以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。
主要分为以下两步:
1.1 对每个数据点拟合切平面
1.2 让拟合出的切平面在局部的朝向尽量一致
1.3 根据切平面生成距离函数f
2、抽取等值面,重建网格模型
根据顶点处的f取值的正负共有256种情况,去除旋转映射后重合的情形共有15种基本情形。
所有体素处理完成后就得到网格模型。
实现:c++可使用pcl库
https://vgc.poly.edu/~csilva/papers/tvcg99.pdf
Ball-Pivoting Algorithm (BPA) 对给定的点云插值得到一个三角形网格。
想象在点云“表面”上滚动一个半径为p(p应该比点之间的平均距离略大)的小球,当球接触到三个点时,这三个点将形成种子三角形。从这个种子三角形开始,球与端点保持接触围绕其中一个边进行旋转直到触及另一个点,形成新的三角形。持续该过程直到所有可到达的边都尝试过。继续从另一个种子三角形开始直到所有的点都被考虑到。
球半径如何选择:半径是根据输入点云的大小和比例凭经验获得的。理论上,球的直径应该略大于点之间的平均距离。
如上图b,当采样密度较低时导致会有一些边不会被创建,存在孔洞。
如上图c,当存在曲率较大时会导致球旋转时不会经过一些点会丢失一些特征。
实现:软件meshlab
c++可使用vcglib库。
对原始点云进行快速三角化的算法,该算法假设曲面光滑,点云密度变化均匀,不能在三角化的同时对曲面进行平滑和孔洞修复。
1、定义
贪婪投影算法(Greedy Projection Algorithm)是M. Gopi等人[1]于2003年提出的点云表面重建算法。该算法从一个数据点R开始,找到与R相邻的一组数据点,连接R与该组数据点,就可得到数据点R的所有邻接三角形(顶点中包含R的三角形)。然后以广度优先搜索的形式,遍历中的数据点,找到这些数据点的邻接三角形,直到遍历完所有数据点。该算法的重点在于如何连接数据点R和以生成高质量三角形(避免小角度),并保证三角形不会交叠。算法通过投影的方式,将三维数据点投影至二维,在二维平面内连接数据点,以获取不交叠三角形;通过贪婪的方式,当有多个数据点可连成三角形时,尽可能生成角度大的三角形。
2、算法流程
3、根据可见度删除数据点(Pruning by Visibility)
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库。
泊松重建算法更适合水密性即模型是闭合的三维点云数据,而现实中自己所采用的数据并不会向官方数据集中的数据那样完美,所以在利用泊松重建的过程中就会出现大量的“假想”冗余平面。