三维点云重建 — open3d python

        这里三维点云重建是指根据三维点云重建目标的表面或轮廓,即表面重建。三维点云是一批离散的点,这样空间中必然回有一些位置是空的,没有数据信息。点云重建是让三维物体的表面都由一个个平面组成,即在表面处成为连续状态。这里仅介绍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方法表面重建效果,蓝色为滚球法表面重建结果,红色为泊松曲面重建结果,浅蓝色为体素化结果。

三维点云重建 — open3d python

更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_3d点云 python从三维基础知识到深度学习,将按照以下目录持续进行更新。三维点云重建 — open3d pythonhttps://blog.csdn.net/suiyingy/article/details/124017716

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年3月9日 下午11:54
下一篇 2023年3月9日 下午11:55

相关推荐