Open3D 三维重建-Alpha Shapes (α-形状)

目录

一、概述

1.1原理

1.2实现步骤

二、代码实现

2.1关键函数

2.1.1函数

2.1.2参数详解

2.2完整代码

三、实现效果

3.1原始点云

3.2处理后点云


Open3D点云算法汇总及实战案例汇总的目录地址:

Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客


一、概述

        Alpha Shapes(α-形状)是一种用于点云边界重建的算法通过调节α参数,可以生成不同分辨率的边界形状。α-形状是通过将点云中的点连成三角形,并移除长于α的边,从而生成符合数据特征的形状。

1.1原理

α-形状算法的基本原理是

  1. 构建点云的Delaunay三角剖分。
  2. 移除所有边长大于α的边。
  3. 剩下的边和三角形构成了α-形状。

1.2实现步骤

  1. 加载点云数据:读取点云数据文件。
  2. 计算α-形状:使用α-形状算法重建边界。
  3. 可视化和保存结果:可视化生成的形状,并将其保存到文件中。

二、代码实现

2.1关键函数

2.1.1函数

def create_from_point_cloud_alpha_shape(self, alpha, alpha_1, tetra_mesh, pt_map):

2.1.2参数详解

1.alpha (float):
        控制形状细节的参数α。较小的α值会生成较细致的形状,而较大的α值会生成较粗略的形状。α值决定了要移除的边的最大长度。
2.alpha_1 (float):
        备用的α参数,用于生成备选的α-形状。当alpha参数生成的形状不理想时,可以使用alpha_1参数进行调整。
3.tetra_mesh (open3d.geometry.TetraMesh):
        四面体网格对象,表示通过 Delaunay 三角剖分生成的四面体网格。这个参数是用来辅助计算α-形状的中间数据。
4.pt_map (open3d.utility.Vector3iVector):
        点映射,用于记录点云中的点在四面体网格中的映射关系。这个参数是用来辅助计算α-形状的中间数据。

2.2完整代码

import open3d as o3d
import numpy as np


pcd = o3d.io.read_point_cloud("bunny.pcd")
o3d.visualization.draw_geometries([pcd], width=800, height=800,
                                  window_name="原始点云",
                                  mesh_show_back_face=False)  # 可视化点云
alpha = 0.03
print(f"alpha={alpha:.3f}")
mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha)  # 执行单一alpah阈值
mesh.compute_vertex_normals()  # 计算mesh的法线
o3d.visualization.draw_geometries([mesh], window_name="单一alpah阈值的结果",
                                  width=800, height=800,
                                  mesh_show_back_face=True)

# 从给定点云中计算多个a-shape
tetra_mesh, pt_map = o3d.geometry.TetraMesh.create_from_point_cloud(pcd)  # 从点云创建四面体网格
for alpha in np.logspace(np.log10(0.5), np.log10(0.01), num=4):
    print(f"alpha={alpha:.3f}")
    mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(
        pcd, alpha, tetra_mesh, pt_map)
    mesh.compute_vertex_normals()
    o3d.visualization.draw_geometries([mesh], mesh_show_back_face=True)

三、实现效果

3.1原始点云

3.2处理后点云

alpha=0.030

alpha=0.500
 

alpha=0.136

alpha=0.037

alpha=0.010

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Alpha Shapes算法是一种用于确定一组无序空间点的边界的算法。它的原理如下: 1. 设置一个判别半径R,该半径决定了边界的精细程度,较小的R会得到更精细的边界。 2. 假设数据集有n个无序点,对于任意两点P1和P2,绘制一个半径为R的圆。如果这个圆内没有其他数据点,那么认为P1和P2是边界点,它们之间的连线P1P2就是边界线段。 3. 对于数据集中的每对点,共有(n*(n-1))/2条线段,逐条进行判断求解。 通过调节判别半径R的大小,可以使边界更加精细或粗糙。 需要注意的是,边界点的判定条件是两个圆中至少有一个满足大于R的要求。有些点对两个圆都不满足大于R的要求,这样就找不到边界点。 Alpha Shapes算法可以根据给定的无序空间点集,生成一个边界,该边界不一定是凸的,也不一定是连通的,但是它在一定程度上表示了这组离散点的轮廓。通过调节参数R,可以控制边界的精细程度。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [散点轮廓算法——Alpha Shapes](https://blog.csdn.net/Quason/article/details/104336524)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [平面点云的轮廓线计算-alpha shapes算法原理和实现](https://blog.csdn.net/zjjsd195/article/details/122390210)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值