admin管理员组

文章数量:1660167

Open3D边缘检测技术从3D数据中精准识别并提取边界,对于场景解析、物体轮廓提取等任务至关重要。Open3D提供多种算法,帮助用户高效实现边缘检测,促进3D数据的深度分析和应用。

一、安装

pip install open3d    # 即可

二、使用

首先,导入open3d库,并读取点云数据

import open3d as o3d
cloud = o3d.t.io.read_point_cloud("your_cloud_path")

其次,从点云中移除统计异常值(即噪点或离群点)

# estimate_normals估计点云数据中每个点的法线向量。法线信息对于后续的处理如表面重建、形状分析等都非常有用。
cloud.estimate_normals(radius=0.02, max_nn=30)
# 从点云中移除统计异常值(即噪点或离群点)
cl, ind = cloud.remove_statistical_outliers(nb_neighbors=20, std_ratio=2.0)
# 原始点云cloud被更新为只包含过滤后的点,且这些点的位置信息已经被更新
cloud.point['positions'] = cl.point['positions']

estimate_normals 参数详解

  • radius=0.02 参数指定了搜索每个点周围邻近点的半径范围。在这个半径内的点将被用来计算该点的法线向量。
  • max_nn=30 参数限制了用于计算法线的最大邻近点数。即使在指定的半径内有更多的点,也只会使用最近的30个点进行计算。

remove_statistical_outliers 参数详解

  • nb_neighbors=20 参数指定了用于计算每个点平均距离的邻近点数。
  • std_ratio=2.0 参数是标准差倍数,用于确定哪些点被认为是异常值。如果一个点的平均距离大于全局平均距离加上这个倍数的标准差,那么该点就被认为是异常值

 remove_statistical_outliers 方法返回两个对象:过滤后的点云cl和一个索引数组ind,后者包含了原始点云中保留点的索引。

然后,检测图像边界点

boundary, mask = cloudpute_boundary_points(0.5, 60)

'''0.5 是指定的搜索半径(以米为单位,具体取决于你的点云数据的尺度)。在这个半径内搜索每个点的邻近点。
60 是邻近点的数量阈值。如果一个点在指定的搜索半径内找到的邻近点数量少于这个阈值,那么该点就被认为是边界点。
compute_boundary_points 方法返回两个对象:

boundary 是一个点云对象,它只包含原始点云中被识别为边界点的那些点。
mask 是一个布尔数组,其长度与原始点云中点的数量相同。对于原始点云中的每个点,如果它是边界点,则mask中对应位置的值为True;否则为False'''

最后,通过设置不同颜色进行区分,将图像展示出来

cloud = cloud.paint_uniform_color([0.6, 0.6, 0.6])  # 灰色
boundary = boundary.paint_uniform_color([1.0, 0.0, 0.0])  # 红色,rgb

o3d.visualization.draw_geometries([boundary.to_legacy(), cloud.to_legacy()])

完整代码

import open3d as o3d

cloud = o3d.t.io.read_point_cloud(r"D:\gitlab\abnormal_part_inspection\ms7193.ply")

cloud.estimate_normals(radius=0.5, max_nn=60)
cl, ind = cloud.remove_statistical_outliers(nb_neighbors=20, std_ratio=5.0)
cloud.point['positions'] = cl.point['positions']
cloud.estimate_normals(radius=0.5, max_nn=60)

boundary, mask = cloudpute_boundary_points(0.5, 60)
cloud = cloud.paint_uniform_color([0.6, 0.6, 0.6])
boundary = boundary.paint_uniform_color([1.0, 0.0, 0.0])

o3d.visualization.draw_geometries([boundary.to_legacy(), cloud.to_legacy()])

本文标签: 带你边缘open3d