原理:
对整个输入迭代一次,对于每个点进行半径R邻域搜索,如果邻域点的个数低于某一阈值,则该点将被视为噪声点并被移除。
实现:
/**
* @description: 半径滤波
* @param cloud 输入点云
* @param cloud_filtered 滤波点云
* @param radius 给定半径
* @param min_pts 最小点数
*/
void radiusremoval(pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud_filtered, double radius, int min_pts)
{
pcl::KdTreeFLANN<pcl::PointXYZ> tree;
tree.setInputCloud(cloud);
for (int i = 0; i < cloud->points.size(); ++i)
{
std::vector<int> id(min_pts);
std::vector<float> dist(min_pts);
tree.nearestKSearch(cloud->points[i], min_pts, id, dist);
if (dist[dist.size() - 1] < radius)
{
cloud_filtered->push_back(cloud->points[i]);
}
}
}