1、算法原理
2、完整代码
from pclpy import pcl
def point_cloud_viewer(cloud, cloud_filtered):
# Open 3D viewer and add point cloud and normals
viewer = pcl.visualization.PCLVisualizer("cloud_viewer")
v0 = 1
viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v0)
viewer.setBackgroundColor(0.0, 0.0, 0.0, v0)
single_color = pcl.visualization.PointCloudColorHandlerCustom.PointXYZ(cloud, 0.0, 255.0, 0.0)
viewer.addPointCloud(cloud, single_color, "sample cloud1", v0)
v1 = 2
viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v1)
viewer.setBackgroundColor(0.0, 0.0, 0.0, v1)
single_color = pcl.visualization.PointCloudColorHandlerCustom.PointXYZ(cloud_filtered, 255.0, 0.0, 0.0)
viewer.addPointCloud(cloud_filtered, single_color, "sample cloud2", v1)
viewer.setPointCloudRenderingProperties(0, 1, "sample cloud1", v0)
viewer.setPointCloudRenderingProperties(0, 1, "sample cloud2", v1)
# viewer.addCoordinateSystem(1.0)
while not viewer.wasStopped():
viewer.spinOnce(10)
if __name__ == '__main__':
# 读取点云数据
cloud = pcl.PointCloud.PointXYZ()
cloud_filtered = pcl.PointCloud.PointXYZ()
reader = pcl.io.PCDReader()
reader.read('bunny.pcd', cloud)
print("PointCloud before filtering: ",
cloud.width * cloud.height, " data points ")
# 创建体素滤波器
vox = pcl.filters.VoxelGrid.PointXYZ()
vox.setInputCloud(cloud) # 输入点云
vox.setLeafSize(0.01, 0.01, 0.01) # 设置体素的大小
vox.filter(cloud_filtered)
print("PointCloud before filtering: ",
cloud_filtered.width * cloud_filtered.height, " data points ")
writer = pcl.io.PCDWriter()
writer.write("table_scene_lms400_downsampled.pcd", cloud_filtered)
# 可视化结果
point_cloud_viewer(cloud, cloud_filtered)