点云中根据邻域数量进行异常删除的接口是RadiusOutlierRemoval。
使用的效果如下:
使用 0.05距离的邻居数量30
实现klib可视化平台的插件算子如下:
struct FilterRadiusOutlierRemoval
{
//FilterIndices
bool extract_removed_indices = false;
bool negative = false;
bool keep_organized = false;
float userFilterValue = std::numeric_limits<float>::quiet_NaN();
//RadiusOutlierRemoval
double radiusSearch = 0;
int minNeighborsInRadius = 1;
//
template<class PT>
KArbit operator()(const pcl::shared_ptr<PointCloud<PT> >& cloud)
{
pcl::shared_ptr<PointCloud<PT> > res(new PointCloud<PT>);
RadiusOutlierRemoval<PT> f(extract_removed_indices);
f.setNegative(negative);
f.setKeepOrganized(keep_organized);
f.setUserFilterValue(userFilterValue);
f.setRadiusSearch(radiusSearch);
f.setMinNeighborsInRadius(minNeighborsInRadius);
f.setInputCloud(cloud);
f.filter(*res);
return res;
}
};
struct KPclFilterRemovalRadiusOutlier : KPlugBase
{
FilterRadiusOutlierRemoval p;
KPclFilterRemovalRadiusOutlier()
{
addProp("extract_removed_indices").setType(PropTypeBool).setValueAddr(&p.extract_removed_indices);
addProp("negative").setType(PropTypeBool).setValueAddr(&p.negative);
addProp("keep_organized").setType(PropTypeBool).setValueAddr(&p.keep_organized);
addProp("userFilterValue").setType(PropTypeFloat).setValueAddr(&p.userFilterValue);
addProp("radiusSearch").setType(PropTypeDouble).setValueAddr(&p.radiusSearch);
addProp("minNeighborsInRadius").setType(PropTypeInt32).setValueAddr(&p.minNeighborsInRadius);
}
int __exec(const KArbit& src, KArbit& dst) override
{
dst = cld_op(src, p);
return true;
}
};