几何处理和三维视觉
几何处理:是一种计算的方法研究世界中的物理对象,通过硬件扫描生成物理对象的三维模型然后做各种处理和分析。
三维视觉:传统的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=k1∑i=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(xi−o)(xi−o)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)=(p−oi)⋅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 mu∗m和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 泊松重建
泊松重建算法更适合水密性即模型是闭合的三维点云数据,而现实中自己所采用的数据并不会向官方数据集中的数据那样完美,所以在利用泊松重建的过程中就会出现大量的“假想”冗余平面。