CloudCompare——平面点云边界提取与凸包计算

1.概述

  CloudCompare中的'Tools -> Fit -> 2D Polygon (facet)'功能是用来对点云进行多边形轮廓边界提取以及凸包计算的。算法的实现流程:

  1. 首先对点云进行平面拟合;
  2. 将点云投影到拟合平面上;
  3. 对投影后的点云进行2D凸包提取,或者使用alpha-shape算法进行边界提取。

2.操作流程

1、加载点云
在这里插入图片描述

2、选中点云,如下图所示,出现黄色包围框则表示点云已选中
在这里插入图片描述

3、找到'Tools > Fit > 2D Polygon (facet)'功能

在这里插入图片描述

4、参数设置
在这里插入图片描述
设置轮廓的最大边长,如果设置为0,则提取点云的凸包;否则,最大边长越小,提取的边界轮廓越紧密。
5、点云边界
在这里插入图片描述

6、点云凸包
在这里插入图片描述

7、控制台输出信息
在这里插入图片描述

8、其他信息
在这里插入图片描述

  • 基础’Facet’实体包含一些元数据(多边形表面,中心和法线以及拟合RMS)
  • Contour points:轮廓点
  • 这个轮廓点云有两个子类

contour(轮廓连成的轮廓线)
polygon(作为网格的多边形)

3.完整操作

在这里插入图片描述

4.相关代码

[1] PCL 平面点云的凸多边形边界提取
[2] PCL alpha shapes平面点云边界特征提取
[3] PCL alpha shapes平面点云边界特征提取(C++详细过程版)
[4] Open3D(C++)平面点云凸多边形边界提取
[5] Open3D(C++) AlphaShape 平面点云边界提取
[6] Open3D(C++) 计算点云凸包
[7] pclpy——alpha shapes平面点云边界特征提取
[8] Open3D——平面点云凸多边形轮廓提取
[9] Open3D 计算点云凸包
[10] matlab 计算点云凸包

  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
如果不使用凸包,也可以通过计算每个点的法向量,判断其是否为边界点。具体步骤如下: 1. 计算点云法向量 可以使用 `o3d.geometry.estimate_normals()` 函数来计算点云的法向量。该函数会根据点云中每个点的邻域点计算其法向量,并将法向量信息存储在点云的 `normal` 属性中。 示例代码: ```python import open3d as o3d # 读取点云数据 pcd = o3d.io.read_point_cloud("your_point_cloud.pcd") # 估计点云法向量 pcd.estimate_normals() ``` 2. 判断点是否为边界点 对于每个点,可以通过计算其与邻域点的法向量夹角来判断其是否为边界点。如果夹角大于某个阈值,则认为该点为边界点。 示例代码: ```python import open3d as o3d import numpy as np # 读取点云数据 pcd = o3d.io.read_point_cloud("your_point_cloud.pcd") # 估计点云法向量 pcd.estimate_normals() # 计算点是否为边界点 boundary_points = [] for i in range(len(pcd.points)): normal = np.asarray(pcd.normals[i]) indices, distances = pcd.tree.query_radius([pcd.points[i]], r=0.1, return_distance=True) is_boundary_point = True for j in range(indices.shape[0]): if j == 0: continue neighbor_normal = np.asarray(pcd.normals[indices[j]]) angle = np.arccos(np.dot(normal, neighbor_normal)) if angle < np.pi / 2: is_boundary_point = False break if is_boundary_point: boundary_points.append(pcd.points[i]) boundary_points = o3d.geometry.PointCloud() boundary_points.points = o3d.utility.Vector3dVector(np.asarray(boundary_points)) boundary_points.paint_uniform_color([0, 1.0, 0]) # 可视化 o3d.visualization.draw_geometries([pcd, boundary_points]) ``` 在上面的代码中,首先使用 `estimate_normals()` 函数计算点云的法向量。然后,对于每个点,计算其与邻域点的法向量夹角,如果夹角都大于90度,则认为该点是边界点。最后,将边界点可视化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值