一、半径滤波
原理:对整个输入迭代一次,对于每个点进行半径R邻域搜索,如果邻域点的个数低于某一阈值,则该点将被视为噪声点并被移除。
二、代码部分
注:测试代码均使用PclSharp1.12.0库
/// <summary>
/// 点云半径滤波,实现删除离群点的简单的滤波功能
/// </summary>
/// <param name="inCloud"></param>
/// <param name="radiusSearch">设置查询点的半径范围</param>
/// <param name="meanK">如果一个点在给定半径内临近点数量小于给定阈值K,则判定为离群点并删除</param>
/// <returns></returns>
public static PointCloudOfXYZ RadiusOutlierRemoval(PointCloudOfXYZ inCloud, double radiusSearch = 0.1 ,int meanK = 5)
{
try
{
PointCloudOfXYZ cloudFiltered = new PointCloudOfXYZ();//滤波后的点云
using (var filter = new PclSharp.Filters.RadiusOutlierRemovalOfXYZ())
{
filter.SetInputCloud(inCloud);
filter.RadiusSearch = radiusSearch; //设置在半径的范围内查询点邻近点
filter.MinNeighborsInRadius = meanK; //设置判断是否为离群点的阈值,即半径内至少包括的点数
filter.filter(cloudFiltered);
}
return cloudFiltered;//返回滤波后的点云
}
catch (Exception)
{
return inCloud;//返回滤波前的点云
}
}
三、结果显示