1.可视化3D网格(Visualize 3D mesh)
如果网格包含顶点颜色,则返回True |
bool |
如果网格包含顶点法线,则返回True |
bool |
2.估计表面法线(Surface normal estimation)
compute_vertex_normals()函数在笔记已经做好了。
3.裁剪网格(Crop mesh)
通过直接对网格的triangle和triangle_normals操作数据字段来去除一半的表面。这是通过numpy完成的。
将形状(n,3)的float64 numpy数组转化为Open3D格式 |
将项目添加到列表末尾 清除内容 在列表中返回x的次数 1.extend(self:Vector3dVector,L:Vector3dVector):列表中的所有项目都通过附加给定列表扩展 2. extend(self:Vector3dVector,L:iteration):列表中的所有项目都通过附加给定列表扩展 在给定位置插入一个项目 1.pop(self):删除并返回最后一项 2.pop(self,i:int):删除并返回索引i的项目 从列表中删除x的第一项。如果没有,x,则报错 |
open3d.utility.Vector3iVector与之类似。
4.网格上色(Paint mesh)
paint_uniform_color()在笔记中已经做过笔记
5.网格属性(Mesh properties)
三角形网格有几个可以用Open3D测试的属性。一个重要的属性是,我们可以在其中测试三角形网格是否为边流形is_edge_manifold以及是否为is_vertex_manifold。如果每条边都包围一个或两个三角形,则三角形网格是边流形。
此外,如果顶点的星形是边流形和边连接的,例如,两个或多个面仅通过顶点连接而不是通过边连接,则三角形网格是顶点流形。
另一个属性是。
测试三角形网格是否为边流形 |
如果为真,则非流形边定义为具有两个以上相邻三角形的边,否则将不与两个三角形相邻的每条边定义为非流行 |
bool |
如果geometry为空的话,则返回True |
bool |
测试三角形网格是否与另一个三角形网格相交 |
bool |
测试三角形网格是否可定向 |
bool |
测试三角形网格是否自相交 |
bool |
测试三角形网格的所有顶点是否都是流形的 |
bool |
测试三角形网格是否水密 |
bool |
6. 网格滤波(Mesh filtering)
Open3D包含许多网格滤波的方法。
6.1 均值滤波
简单的均值滤波。 |
函数的迭代次数 |
open3d.geometry.TriangleMesh |
6.2 拉普拉斯算子(Laplacian)
使用拉普拉斯算子实现网格滤波。,是输入值,是输出值,N是相邻的集合。是基于反距离的邻居的权重(更近的邻居具有更高的权重),lambda_filter是平滑参数 |
函数的迭代次数 过滤器参数 |
open3d.geometry.TriangleMesh |
锐化滤波。,输出值是输入值加上强度乘以输入值减去相邻值之和 |
函数的迭代次数 |
open3d.geometry.TriangleMesh
|
使用Taubin算法进行网格滤波。在每次迭代中应用两次filter_smooth_laplacian,第一次使用过滤器参数lambda_filter,第二次使用过滤器参数mu作为平滑参数。这种方法避免的三角形网格的收缩 |
函数的迭代次数 过滤器参数 过滤器参数 |
open3d.geometry.TriangleMesh |
7.采样(Sampling)
Open3D中包含了从网格中采样点云的功能。最简单的方法是使用sample_points_uniformly函数从三角网格的三维表面均匀采样。参数number_of_points表示从网格中采样的点云的点数。
从网格中均匀采样点 |
应均匀采样的点数 如果为真,将三角形法线分配给返回的点,而不是插值的顶点法线。如有必要,将计算三角形法线并将其添加到网格中 随机生成器中使用的种子值,设置为 -1 以在每个函数调用中使用随机种子值 |
open3d.geometry.PointCloud |
均匀采样可以得到表面上的点簇。泊松盘采样能够使采样点均匀的分布。sample_points_poisson_disk实现了该功能。
从网格中均匀采样点的函数,其中每个点与相邻点的距离大致相同(蓝噪声)。 |
应采样的点数 初始均匀采样点云的因子。此init PointCloud用于样本消除 用于样本消除的初始点云。如果提供了此参数,则忽略init_factor 如果为真,将三角形法线分配给返回的点,而不是插值的顶点法线。如有必要,将计算三角形法线并将其添加到网格中 随机生成器中使用的种子值,设置为 -1 以在每个函数调用中使用随机种子值 |
open3d.geometry.PointCloud |
8.网格细分(Mesh subdivision)
网格细分就是把每个三角形划分为更小的三角形。最简单的方式就是,计算三角形每个边的中点,将其划分为四个较小的三角形。这个通过subdivide_midpoin函数实现。3D曲面和面积保持不变但是顶点和三角形的数量增加了。number_of_iterations参数定义了重复细分多少次。
使用中点(midpoint)算法细分网格 |
迭代次数。一次迭代将每个三角形拆分为覆盖同一表面的四个三角形 |
open3d.geometry.TriangleMesh |
Open3D实现了基于【Loop】的附加细分方法,可以得到更加平滑的拐角
使用Loop算法细分网格 |
迭代次数。一次迭代将每个三角形拆分为覆盖同一表面的四个三角形 |
open3d.geometry.TriangleMesh |
9.网格简化(Mesh simplification)
有时候我们想用较少的三角形来表示一个高分辨率的网格,但是低分辨率的网格仍然应该接近高分辨率的网格。为此Open3d实现了许多网格简化的算法。
9.1 顶点聚类
顶点聚类的方法是将所有落入给定大小的体素的顶点聚集到单个顶点。
函数接口为simplify_vertex_clustering。
使用顶点聚类简化网格 |
顶点内合并的体素大小 聚合顶点信息的方法。Average计算一个简单的平均值,Quadric最小化到相邻平面的距离 |
open3d.geometry.TriangleMesh |
9.2 网格抽取
网格细分的另一种方式是逐步执行的网格抽取。我们选取一个最小化误差指标的三角形移除。重复此过程直到满足指定的三角形数量时停止。Open3d实现了simplify_quadric_decimation接口去最小化误差平方(与相邻平面的距离),参数target_number_of_triangles定义了停止抽取停止的规则。
使用 Garland 和 Heckbert 的二次误差度量抽取简化网格的功能 |
简化网格应具有的三角形数量。不保证会达到这个数字 允许合并顶点的最大误差 应用于保留边界的边缘顶点的权重 |
open3d.geometry.TriangleMesh |
10. 连通分量(Connected components)
想要移除各有由于噪声引起的,重建算法的结果。Open3d实现了一个连通分量算法cluster_connected_triangles,他将每个三角形分配给一个连接的三角集群。他会从集群中返回每一个三角形的索引triangle_cluters,和每一个集群中三角形的数量cluter_n_triangles还有集群的表面积cluster_area。
对三角形进行聚类的函数,即通过边连接的三角形被分配相同的聚类索引。此函数返回一个数组,其中包含每个三角形的簇索引,第二个数组包含每个簇的三角形数量,第三个向量包含每个簇的表面积 |
Tuple[open3d.utility.IntVector,List[int],open3d.utility.DoubleVector] |