一、计算点云之间的距离

Open3D提供了compute_point_cloud_distance方法,用于计算源点云到目标点云的距离。也就是说,它会计算源点云中每个点到目标点云中最近点的距离。

在下面的示例中,我们使用该方法来计算两个点云之间的差异。请注意,这个方法也可以用来计算两个点云之间的Chamfer距离。

1.1 生成直线点云(有对比点云跳过)
# 获得直线
x = np.linspace(-3, 3, 1500)  # 获得-3-3的1500个数
mesh_x, mesh_y = np.meshgrid(x, x)
xyz = np.zeros((np.size(mesh_x), 3))
xyz[:, 0] = np.reshape(mesh_x, -1)     # x轴
xyz[:, 1] = 0.1                        # y
xyz[:, 2] = -0.0025                    # z

project_cloud = o3d.geometry.PointCloud()  # 使用numpy生成点云
project_cloud.points = o3d.utility.Vector3dVector(xyz)  # points numpy数组
o3d.visualization.draw_geometries([project_cloud])

原理

这段代码首先使用np.linspace函数生成一个从-3到3的包含1500个数的数组x。然后,利用np.meshgrid函数生成了一个二维网格坐标系,其中mesh_xmesh_y分别表示xy坐标轴上的坐标值网格。

接着,创建了一个形状为(n*m, 3)的零数组xyz,其中nm分别是mesh_xmesh_y的形状。然后,通过np.reshape函数将mesh_x数组展平为一维数组,并将其赋值给xyz数组的第一列,以表示x坐标轴上的坐标值。将0.1赋值给xyz数组的第二列,以表示y坐标轴上的坐标值。将-0.0025赋值给xyz数组的第三列,以表示z坐标轴上的坐标值。

最终,xyz数组中的每一行都表示了三维空间中一个网格点的坐标。

效果

在这里插入图片描述
在这里插入图片描述

1.2 计算点云之间距离
dists = pcd.compute_point_cloud_distance(project_cloud)
dists = np.asarray(dists)
ind = np.where(dists < 0.01)[0]   # 获得点云之前小于0.01的距离的点云
pcd_without_chair = pcd.select_by_index(ind)   # 获得处理后的点云
pcd_without_chair.paint_uniform_color([1, 0, 0])   # 渲染颜色

原理

  1. 使用compute_point_cloud_distance方法计算点云pcdproject_cloud之间的距离。
  2. 将计算得到的距离转换为NumPy数组。
  3. 使用np.where函数找到距离小于0.01的点的索引。
  4. 使用select_by_index方法基于索引选择距离小于0.01的点云部分,得到处理后的点云pcd_without_chair
  5. 将处理后的点云渲染为红色。

效果

在这里插入图片描述

二、全码测试直接使用

# 获得直线
pcd = o3d.io.read_point_cloud('res/bunny.pcd')
pcd.paint_uniform_color([0.5, 0.5, 0.5])
points = np.asarray(pcd.points)

# 获得直线
x = np.linspace(-1, 1, 1500)  # 获得-3-3的1500个数
mesh_x, mesh_y = np.meshgrid(x, x)
xyz = np.zeros((np.size(mesh_x), 3))
xyz[:, 0] = np.reshape(mesh_x, -1)     # x轴
xyz[:, 1] = 0.1                        # y
xyz[:, 2] = -0.0025                    # z

project_cloud = o3d.geometry.PointCloud()  # 使用numpy生成点云
project_cloud.points = o3d.utility.Vector3dVector(xyz)  # points numpy数组
# o3d.visualization.draw_geometries([project_cloud, pcd])

dists = pcd.compute_point_cloud_distance(project_cloud)
dists = np.asarray(dists)
ind = np.where(dists < 0.01)[0]   # 获得点云之前小于0.01的距离的点云
pcd_without_chair = pcd.select_by_index(ind)   # 获得处理后的点云
pcd_without_chair.paint_uniform_color([1, 0, 0])   # 渲染颜色

o3d.visualization.draw_geometries([pcd_without_chair, project_cloud])

三、相关数据

numpy和点云的更多操作:numpy中的点云操作-CSDN博客

百度网盘数据集:

包括 obj,pcd,las,png,ply

百度网盘链接:https://pan.baidu.com/s/1JFxKUk_xMcEmpfBHtuC-Pg
提取码:cpev

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐