这里三维点云重建是指根据三维点云重建目标的表面或轮廓,即表面重建。三维点云是一批离散的点,这样空间中必然回有一些位置是空的,没有数据信息。点云重建是让三维物体的表面都由一个个平面组成,即在表面处成为连续状态。这里仅介绍open3d中几个三维重建函数。
1 Alpha shapes
Alpha shapes 是一种散点外轮廓的提取方法。open3d中对应的函数为create_from_point_cloud_alpha_shape,其关键参数为alpha。alpha是该方法在搜索外轮廓时的半径大小。alpha值越小,网格的细节就越多,分辨率越高。
mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha=2)
2 Ball pivoting
Ball pivoting滚球算法的思路来源于Alpha shapes,是从二维到三维的一种转换。Ball pivoting也是一种用作点云三角化的常用方式。 open3d中对应的函数为create_from_point_cloud_ball_pivoting,其关键参数为radii。radii是滚球的半径,而且可以设置多个值,也就是可以用多个尺寸的滚球来进行三角面构建。注意事项:该方法要求点云必须有法向量,或者在此之前使用法向量计算函数计算出法向量。
mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(pcd, o3d.utility.DoubleVector(radii))
3 Poisson surface reconstruction
泊松曲面重建解决了一个正则化优化问题,以获得光滑曲面。因此,泊松曲面重建比上述方法更可取,因为它们会产生非平滑结果,因为点云的点也是生成的三角形网格的顶点,无需任何修改,参考Open3D 点云重建 – 知乎。 open3d中对应的函数为 create_from_point_cloud_poisson。该函数的一个重要参数是depth,它定义了用于曲面重建的八叉树的深度,因此表示生成的三角形网格的分辨率。depth值越高,网格的细节就越多,分辨率越高。
create_from_point_cloud_poisson除返回重建的表面之外,还会返回各处重建后的点密度,通过设置一个阈值来去除一些低密度处的重建结果。注意事项:该方法要求点云必须有法向量,或者在此之前使用法向量计算函数计算出法向量。
mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd, depth=9)
vertices_to_remove = densities < np.quantile(densities, 0.35)
mesh.remove_vertices_by_mask(vertices_to_remove)
4 voxel grid
通过点云体素化方法来进行重建。open3d中对应的函数为create_from_point_cloud,其关键参数体素尺寸voxel_size=0.05。尺寸越小,网格的细节就越多,分辨率越高。严格上来说,这种方法只是一种下采样的效果。
mesh = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, voxel_size=1)
5 示例程序
pcd文件请参考:pcd格式点云样例文件-深度学习文档类资源-CSDN下载。
# -*- coding: utf-8 -*-
"""
@author: https://blog.csdn.net/suiyingy
"""
import open3d as o3d
import numpy as np
from copy import deepcopy
if __name__ == '__main__':
file_path = 'rabbit.pcd'
pcd = o3d.io.read_point_cloud(file_path)
pcd = pcd.uniform_down_sample(50)#每50个点采样一次
pcd.paint_uniform_color([0.5, 0.5, 0.5])#指定显示为灰色
print(pcd)
pcd1 = deepcopy(pcd)
pcd1.translate((20, 0, 0)) #整体进行x轴方向平移20
mesh1 = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd1, alpha=2)
mesh1.paint_uniform_color([0, 1, 0])#指定显示为绿色
print(mesh1)
pcd2 = deepcopy(pcd)
pcd2.translate((-20, 0, 0)) #整体进行x轴方向平移-20
radius = 0.01 # 搜索半径
max_nn = 10 # 邻域内用于估算法线的最大点数
pcd2.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius, max_nn))
radii = [1, 2]#半径列表
mesh2 = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(pcd2, o3d.utility.DoubleVector(radii))
mesh2.paint_uniform_color([0, 0, 1])
pcd3 = deepcopy(pcd)
pcd3.translate((0, 20, 0)) #整体进行y轴方向平移20
pcd3.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius, max_nn))
mesh3, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd3, depth=9)
vertices_to_remove = densities < np.quantile(densities, 0.35)
mesh3.remove_vertices_by_mask(vertices_to_remove)
mesh3.paint_uniform_color([1, 0, 0])
pcd4 = deepcopy(pcd)
pcd4.translate((0, -20, 0)) #整体进行y轴方向平移-30
pcd4.paint_uniform_color([0, 1, 1])
mesh4 = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd4, voxel_size=1)
o3d.visualization.draw_geometries([pcd, mesh1, mesh2, mesh3, mesh4], #点云列表
window_name="点云重建",
point_show_normal=False,
width=800, # 窗口宽度
height=600,
mesh_show_wireframe=True,
mesh_show_back_face=True,
) # 窗口高度
6 重建效果
灰色为原始点云数据,绿色为alpha shape方法表面重建效果,蓝色为滚球法表面重建结果,红色为泊松曲面重建结果,浅蓝色为体素化结果。
更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_3d点云 python从三维基础知识到深度学习,将按照以下目录持续进行更新。https://blog.csdn.net/suiyingy/article/details/124017716
文章出处登录后可见!