pcl中有一个基于模型删除点云异常数据的接口ModelOutlierRemoval。
主要功能就是是设置模型的参数,然后使用模型取删除 点云。
输入点云数据:
0.352222,-0.151883,-0.106395
-0.397406,-0.473106,0.292602
-0.731898,0.667105,0.441304
-0.734766,0.854581,-0.0361733
-0.4607,-0.277468,-0.916762
-0.82,-0.341666,0.4592
-0.728589,0.667873,0.152
-0.3134,-0.873043,-0.3736
0.62553,0.590779,0.5096
-0.54048,0.823588,-0.172
-0.707627,0.424576,0.5648
-0.83153,0.523556,0.1856
-0.513903,-0.719464,0.4672
0.291534,0.692393,0.66
0.258758,0.654505,-0.7104
读取输入的点云,然后进行模型删除异常点
扩展的插件代码如下:
struct FilterModelOutlierRemoval
{
//FilterIndices
bool extract_removed_indices = false;
bool negative = false;
bool keep_organized = false;
float userFilterValue = std::numeric_limits<float>::quiet_NaN();
//ModelOutlierRemoval
float thresh = 0;
double normals_distance_weight = 0;
int model_type = pcl::SACMODEL_PLANE;
ModelCoefficients coeff;
template<class PT> inline
KArbit operator()(const pcl::shared_ptr<PointCloud<PT> >& cloud)
{
pcl::shared_ptr<PointCloud<PT> > res(new PointCloud<PT>);
ModelOutlierRemoval<PT> f(extract_removed_indices);
f.setNegative(negative);
f.setKeepOrganized(keep_organized);
f.setUserFilterValue(userFilterValue);
f.setModelCoefficients(coeff);
f.setThreshold(thresh);
f.setNormalDistanceWeight(normals_distance_weight);
f.setModelType((pcl::SacModel)model_type);
f.setInputCloud(cloud);
f.filter(*res);
return res;
}
};
struct KPclFilterRemovalModelOutlier : KPlugBase
{
FilterModelOutlierRemoval p;
KPclFilterRemovalModelOutlier()
{
addProp("shapeModel").setType(PropTypeShapeModel).setEmptyIndex(1);
addProp("thresh").setType(PropTypeFloat).setValueAddr(&p.thresh);
addProp("normals_distance_weight").setType(PropTypeFloat).setValueAddr(&p.normals_distance_weight);
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);
}
int __exec(const KArbit& src, KArbit& dst) override
{
auto& aL = a2list(src);
CastType(sm, KShapeModel, aL[1]);
p.model_type = sm.type;
con_cvt(sm.coeffs, p.coeff.values);
dst = cld_op(aL[0], p);
return true;
}
};