1、使用体素化网格方式实现下采样,即减少点的数量,减少点云数据,并同时保持点云的形状特征,在提高配准、曲面重建、形状识别等算法速度中非常实用。PCL实现的VoxelGrid类通过输入的点云数据创建一个三维体素栅格(可把体素栅格想象为微小的空间三维立方体的集合),然后在每个体素(即三维立方体)内,用体素中所有点的重心来近似显示体素中的其他点,这样体素内所有点就用一个重心点最终表示。对于所有体素处理后得到过滤的点云,这种方法比用体素中心来逼近的方法更慢,但它对于采样点对应曲面的表示更为准确。
2、代码:
using PclSharp;
using PclSharp.IO;
using PclSharp.Struct;
using System;
namespace PclSharpTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"C#--PclSharp算法库测试:");
//读取点云文件
var inCloud = new PointCloudOfXYZ();
using (var reader = new PCDReader())
reader.Read(AppDomain.CurrentDomain.BaseDirectory + $"//pcd//table.pcd", inCloud);
PointCloudOfXYZ cloudFiltered = new PointCloudOfXYZ();//滤波后的点云
//设置三维栅格的大小,数值越大,栅格越大,采样后的点云数据越小
PointXYZ voxelpointXYZ = new PointXYZ { X = 0.01f, Y = 0.01f, Z = 0.01f };
using (var sor = new PclSharp.Filters.VoxelGridOfXYZ())
{
sor.SetInputCloud(inCloud);
sor.LeafSize = voxelpointXYZ;//体素点的大小
sor.filter(cloudFiltered);
}
using (var visualizer = new PclSharp.Vis.Visualizer(" visual window"))
{
//创建两个观察视点
int v1 = 0;
int v2 = 1;
visualizer.CreateViewPort(0.0, 0.0, 0.5, 1.0, v1);
visualizer.CreateViewPort(0.5, 0.0, 1.0, 1.0, v2);
//设置背景色
visualizer.SetBackgroundColor_ViewPort(0f,0f,0f,v1);
visualizer.SetBackgroundColor_ViewPort(0.05f, 0f, 0f,v2);
visualizer.AddPointCloud(cloudFiltered, "v1", v1);
visualizer.AddPointCloud(inCloud, "v2", v2);
visualizer.SetPointCloudColor(1, 1, 0.5, "v1");//点云附色
visualizer.SetPointCloudColor(1, 0.5, 1, "v2");//点云附色
while (!visualizer.WasStopped)
visualizer.SpinOnce(100);
}
Console.ReadKey();
}
}
}
3、体素滤波后,点数量明显减少