1、RadiusOutlierRemoval滤波处理会滤除那些一定范围内没有足够多近邻的点,创建RadiusOutlierRemoval滤波器对象,设置其参数并将其应用到我们输入的点云数据,设置搜索半径,在此半径内的点必须要有一个近邻,才会保留这个点。
2、代码:
using PclSharp;
using PclSharp.Common;
using PclSharp.Filters;
using PclSharp.Helpers;
using PclSharp.IO;
using PclSharp.SampleConsensus;
using PclSharp.Segmentation;
using PclSharp.Std;
using PclSharp.Struct;
using System;
using System.Numerics;
using System.Text;
namespace PclSharpTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"C#--PclSharp算法库测试:");
//点云对象
var inCloud = new PointCloudOfXYZ();
//生成数据
Random random = new Random();
for (int i = 0; i < 10; i++)
{
float x = 2 * random.Next(5, 10) / 10.0f - 0.5f;
float y = 2 * random.Next(5, 10) / 10.0f - 0.5f;
float z = 1 * random.Next(5, 10) / 10.0f - 0.5f;
inCloud.Add(new Vector3(x, y, z));
}
inCloud.Width = 10;//点云数目
inCloud.Height = 1;//设置无序点云
var cloud_filtered = new PointCloudOfXYZ();//滤波后点云
RadiusOutlierRemovalOfXYZ outrem=new RadiusOutlierRemovalOfXYZ();//初始化一个半径滤波对象
outrem.SetInputCloud(inCloud);//设置输入点云
outrem.RadiusSearch = 0.2; //设置在0.2半径的范围内找邻近点
outrem.MinNeighborsInRadius = 1;//设置查询点的邻近点集数小于1的删除
outrem.filter(cloud_filtered);//执行条件滤波,存储结果到cloud_filtered
//显示点云数据
Console.WriteLine($"滤波前点云:{inCloud.Count}个点");
for (int i = 0; i < inCloud.Count; i++)
{
Console.WriteLine($"{inCloud.Points[i].X} {inCloud.Points[i].Y} {inCloud.Points[i].Z}");
}
Console.WriteLine($"滤波后点云:{cloud_filtered.Count}个点");
for (int i = 0; i < cloud_filtered.Count; i++)
{
Console.WriteLine($"{cloud_filtered.Points[i].X} {cloud_filtered.Points[i].Y} {cloud_filtered.Points[i].Z}");
}
Console.ReadKey();
}
}
}
3、编译结果: