点云pcl库中的异常值删除,高斯分布异常值,使用接口StatisticalOutlierRemoval。
使用效果如下:
使用均值10,标准差1
取反
实现klib平台的插件算子如下:
struct FilterStatisticalOutlierRemoval
{
//FilterIndices
bool extract_removed_indices = false;
bool negative = false;
bool keep_organized = false;
float userFilterValue = std::numeric_limits<float>::quiet_NaN();
//StatisticalOutlierRemoval
int meanK = 10;
double stddevMulThresh = 1.0;
//
template<class PT>
KArbit operator()(const pcl::shared_ptr<PointCloud<PT> >& cloud)
{
pcl::shared_ptr<PointCloud<PT> > res(new PointCloud<PT>);
StatisticalOutlierRemoval<PT> f(extract_removed_indices);
f.setNegative(negative);
f.setKeepOrganized(keep_organized);
f.setUserFilterValue(userFilterValue);
f.setMeanK(meanK);
f.setStddevMulThresh(stddevMulThresh);
f.setInputCloud(cloud);
f.filter(*res);
return res;
}
};
struct KPclFilterRemovalStatisticalOutlier : KPlugBase
{
FilterStatisticalOutlierRemoval p;
KPclFilterRemovalStatisticalOutlier()
{
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("meanK").setType(PropTypeInt32).setValueAddr(&p.meanK);
addProp("stddevMulThresh").setType(PropTypeDouble).setValueAddr(&p.stddevMulThresh);
}
int __exec(const KArbit& src, KArbit& dst) override
{
dst = cld_op(src, p);
return true;
}
};