目录
前言
本博客记录新手处理点云的过程。点云是由三维空间中的离散点构成的数据集,常用于描述物体的三维形状和结构。我将使用开源工具如Open3D、NumPy和Matplotlib来读取、处理和可视化点云数据。
一、点云 是什么?
点云(Point Cloud)是由三维空间中的离散点集合构成的数据形式。它是通过使用激光扫描仪、摄像机或其他传感器采集物体表面上的点的位置信息而生成的。每个点在三维空间中具有X、Y和Z坐标,以及可能的颜色信息和其他属性。点云数据通常用于描述和表示物体的形状、表面细节和几何结构。
二、使用步骤
1.下载库
-
使用pip安装: 打开终端或命令提示符,并运行以下命令来安装库(以Open3D为例):
pip install open3d
-
使用conda安装: 如果您使用Anaconda环境,可以打开终端或Anaconda Prompt,并运行以下命令来安装库(以Open3D为例):
conda install -c open3d-admin open3d
下面还需要numpy库和matplotlib库,和上面操作一样
2.导入相关的库
import open3d as o3d
import numpy as np
import matplotlib.pyplot as plt
3.对点云进行处理和处理数据
完整代码如下
def voxel_filter(input_cloud):
voxel_size = 0.05
output_cloud = input_cloud.voxel_down_sample(voxel_size)
return output_cloud
path = "D:\\huatfsacthings\\1662794062.493068000.pcd"
# Read the original point cloud file
cloud1 = o3d.io.read_point_cloud(path)
print(cloud1)
# Perform point cloud filtering
cloud2 = voxel_filter(cloud1)
print(cloud2)
# Get the point cloud coordinates
points1 = np.asarray(cloud1.points)
points2 = np.asarray(cloud2.points)
# Create a figure window and subplots
fig, axs = plt.subplots(1, 2, figsize=(10, 5), subplot_kw={'projection': '3d'})
# Plot the original point cloud
axs[0].scatter(points1[:, 0], points1[:, 1], points1[:, 2], c='r', marker='o', s=1)
axs[0].set_xlabel('X')
axs[0].set_ylabel('Y')
axs[0].set_zlabel('Z')
axs[0].set_title('Original Point Cloud')
axs[0].text2D(0.05, 0.95, f'Points: {points1.shape[0]}', transform=axs[0].transAxes)
# Plot the processed point cloud
axs[1].scatter(points2[:, 0], points2[:, 1], points2[:, 2], c='b', marker='o', s=1)
axs[1].set_xlabel('X')
axs[1].set_ylabel('Y')
axs[1].set_zlabel('Z')
axs[1].set_title('Processed Point Cloud')
axs[1].text2D(0.05, 0.95, f'Points: {points2.shape[0]}', transform=axs[1].transAxes)
# Adjust the spacing between subplots
plt.tight_layout()
# Display the figure
plt.show()
效果图:

简单进行滤波后的结果,后续会进行地面分割。
还可以控制点云的一些性质
# 绘制原始点云,颜色为蓝色,大小为1,透明度为0.8,形状为圆形
ax.scatter(points1[:, 0], points1[:, 1], points1[:, 2], c='b', marker='o', s=0.1, alpha=0.8)
还可以使用open3d进行可视化
例如:
import open3d as o3d
def voxel_filter(input_cloud):
voxel_size = 0.05
output_cloud = input_cloud.voxel_down_sample(voxel_size)
return output_cloud
cloud1 = o3d.io.read_point_cloud(r"D:\huatfsacthings\1662794062.493068000.pcd")
cloud2 = voxel_filter(cloud1)
#创建第一个可视化窗口,显示原始点云
vis1 = o3d.visualization.Visualizer()
vis1.create_window()
vis1.add_geometry(cloud1)
vis1.get_render_option().point_size = 2.0
vis1.get_view_control().set_lookat([0, 0, 0])
vis1.get_view_control().set_zoom(0.5)
vis1.get_render_option().background_color = [0, 0, 0] # 设置为黑色
print(cloud1)
vis1.run()
vis1.destroy_window()
#创建第二个可视化窗口,显示滤波后的点云
vis2 = o3d.visualization.Visualizer()
vis2.create_window()
vis2.add_geometry(cloud2)
vis2.get_render_option().point_size = 2.0
vis2.get_view_control().set_lookat([0, 0, 0])
vis2.get_view_control().set_zoom(0.5)
vis2.get_render_option().background_color = [0, 0, 0] # 设置为黑色
print(cloud2)
vis2.run()
vis2.destroy_window()
效果感觉,没那么好。
更多的资料请查阅官方说明
总结
希望本篇博客为您提供了入门点云处理的基础知识和启发,并帮助您在点云数据的处理和分析中取得进展。点云处理领域有着广阔的发展前景,期待您在这个领域中取得更多的成就。