1、创建了一个PclSharp.Filters.StatisticalOutlierRemovalOfXYZ的滤波器,对每个点的临近点个数设为50,并将标准差倍数设为1,这意味着如果一个点的距离吵够平均距离的一个标准差以上,这个点就被标记为离群点,并将被移除。计算后的输出结果储存在cloud_filtered中。
2、代码
using PclSharp;
using PclSharp.IO;
using System;
namespace PclSharpTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"C#--PclSharp算法库测试:");
//读取点云文件
var src_cloud = new PointCloudOfXYZ();
using (var reader = new PCDReader())
reader.Read(AppDomain.CurrentDomain.BaseDirectory + $"//pcd//table.pcd", src_cloud);
// 创建滤波器,对每个点分析的临近点的个数设置为50 ,并将标准差的倍数设置为1 这意味着如果一
//个点的距离超出了平均距离一个标准差以上,则该点被标记为离群点,并将它移除,存储起来
PointCloudOfXYZ cloudFiltered = new PointCloudOfXYZ();//滤波后的点云
PointCloudOfXYZ cloudFilteredOut = new PointCloudOfXYZ();//外点
var sor = new PclSharp.Filters.StatisticalOutlierRemovalOfXYZ();
sor.SetInputCloud(src_cloud);
sor.MeanK = 50; //设置在进行统计时考虑查询点临近点数
sor.StdDevMulThresh = 1; //设置判断是否为离群点的阀值
sor.filter(cloudFiltered);//滤波户内点
sor.Negative = true;//取外点
sor.filter(cloudFilteredOut);
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(cloudFilteredOut, "v1", v1);
visualizer.AddPointCloud(cloudFiltered, "v2", v2);
//visualizer.SetPointCloudColor(1, 1, 0.5, "src_v1");//点云附色
//visualizer.SetPointCloudColor(1, 0.5, 1, "filtered_v2");//点云附色
while (!visualizer.WasStopped)
visualizer.SpinOnce(100);
}
Console.ReadKey();
}
}
}
3、滤波后点云内点和外点可视化显示