Open3D 删除点云中重叠的点
一、算法原理
如图所示,蓝色为点云的重叠区域。
若某一点在某一距离阈值领域内不止其本身一个点,则认为其有重复点。
二、代码实现
python
import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud("bin\_0.pcd")
point = np.asarray(pcd.points)
point_size = point.shape[0]
print("原始点云中点的个数为:", point_size)
tree = o3d.geometry.KDTreeFlann(pcd) # 建立KD树索引
radius = 0.000001 # 定义搜索半径
total_idx = []
for i in range(point_size):
[k, idx, _] = tree.search_radius_vector_3d(pcd.points[i], radius) # 半径搜索
if k != 0:
total_idx.append(np.array(idx[0]))
true_idx = np.unique(total_idx) # 去除重复点的索引
repe_cloud = pcd.select_by_index(true_idx, invert=True) # 获取重复的点
true_cloud = pcd.select_by_index(true_idx) # 获取去重之后的点
print("删除重复点:", repe_cloud)
print("去重之后:", true_cloud)
o3d.io.write_point_cloud("重复点.pcd", repe_cloud)
o3d.io.write_point_cloud("去重后.pcd", true_cloud)
三、结果展示
白色为重叠的点
红色为删除重叠之后的点