基于python的点云降采样
【代码】基于python的点云降采样。
·
import open3d as o3d
import numpy as np
def read_kitti_bin(bin_file):
# 读取Kitti激光雷达点云数据的二进制文件
scan = np.fromfile(bin_file, dtype=np.float32)
scan = scan.reshape((-1, 4)) # 每行包含[x, y, z, intensity]
return scan[:, :3] # 返回点云的前三列,即[x, y, z]
def write_kitti_bin(bin_file, point_cloud):
# 将点云数据保存为Kitti激光雷达点云的二进制文件
point_cloud = np.array(point_cloud, dtype=np.float32)
point_cloud.tofile(bin_file)
if __name__ == "__main__":
input_file = r"E:\rosbag\2011_09_26\2011_09_26_drive_0005_sync\velodyne_points\data\0000000000.bin" # 替换为实际的输入文件路径
output_file = r"E:\rosbag\pointcloud_downsampled.pcd" # 替换为实际的输出文件路径
voxel_size = 0.1 # 替换为您想要的体素大小(降采样程度)
# 读取点云数据
point_cloud = read_kitti_bin(input_file)
# 创建Open3D点云对象
o3d_cloud = o3d.geometry.PointCloud()
o3d_cloud.points = o3d.utility.Vector3dVector(point_cloud)
# 进行降采样
downsampled_cloud = o3d_cloud.voxel_down_sample(voxel_size)
# 获取降采样后的点云数据
downsampled_points = np.asarray(downsampled_cloud.points)
# 可视化降采样前后的点云
o3d.visualization.draw_geometries([o3d_cloud], "Original Point Cloud")
o3d.visualization.draw_geometries([downsampled_cloud], "Downsampled Point Cloud")
# 注释掉保存降采样结果的部分
# write_kitti_bin(output_file, downsampled_points)
import open3d as o3d
import numpy as np
import matplotlib.pyplot as plt
def read_kitti_bin(bin_file):
# 读取Kitti激光雷达点云数据的二进制文件
scan = np.fromfile(bin_file, dtype=np.float32)
scan = scan.reshape((-1, 4)) # 每行包含[x, y, z, intensity]
return scan[:, :3] # 返回点云的前三列,即[x, y, z]
if __name__ == "__main__":
input_file = r"E:\rosbag\2011_09_26\2011_09_26_drive_0005_sync\velodyne_points\data\0000000000.bin" # 替换为实际的输入文件路径
voxel_size = 0.1 # 替换为您想要的体素大小(降采样程度)
# 读取点云数据
point_cloud = read_kitti_bin(input_file)
# 创建Open3D点云对象
o3d_cloud = o3d.geometry.PointCloud()
o3d_cloud.points = o3d.utility.Vector3dVector(point_cloud)
# 进行降采样
downsampled_cloud = o3d_cloud.voxel_down_sample(voxel_size)
# 使用RANSAC算法进行地面点云滤除
plane_model, inliers = downsampled_cloud.segment_plane(distance_threshold=0.2, ransac_n=3, num_iterations=1000)
inlier_cloud = downsampled_cloud.select_by_index(inliers, invert=True)
# 使用DBSCAN算法进行聚类
with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm:
labels = np.array(inlier_cloud.cluster_dbscan(eps=0.5, min_points=10, print_progress=True))
# 获取聚类结果并根据标签着色
max_label = labels.max()
colors = plt.get_cmap("tab20")(labels / (max_label if max_label > 0 else 1))
colors[labels < 0] = 0 # 将噪声点设为黑色
inlier_cloud.colors = o3d.utility.Vector3dVector(colors[:, :3])
# 显示聚类结果
o3d.visualization.draw_geometries([inlier_cloud], "Clustered Point Cloud")

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)