pcl点云库的直通滤波使用的函数 PassThrough。
执行的效果如下:
设置 z值范围 0.8~2
设置x值为 0-1之间
叠加前面2个操作
实现klib的插件算子如下:
struct FilterPassThrough
{
//FilterIndices
bool extract_removed_indices = false;
bool negative = false;
bool keep_organized = false;
float userFilterValue = std::numeric_limits<float>::quiet_NaN();
//PassThrough
float limit_max = (std::numeric_limits<int>::max)();
float limit_min = -limit_max;
string field_name = "z";
template<class PT> inline
pcl::shared_ptr<PointCloud<PT>> operator()(const pcl::shared_ptr<PointCloud<PT> >& cloud)
{
auto res = pcl::make_shared<PointCloud<PT>>();
PassThrough<PT> f(extract_removed_indices);
f.setNegative(negative);
f.setKeepOrganized(keep_organized);
f.setUserFilterValue(userFilterValue);
f.setFilterLimits(limit_min, limit_max);
f.setFilterFieldName(field_name);
f.setInputCloud(cloud);
f.filter(*res);
return res;
}
};
struct KPclFilterPassThrough : KPlugBase
{
FilterPassThrough p;
KPclFilterPassThrough()
{
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("limit_min").setType(PropTypeFloat).setValueAddr(&p.limit_min);
addProp("limit_max").setType(PropTypeFloat).setValueAddr(&p.limit_max);
addProp("field_name").setType(PropTypeString).setValueAddr(&p.field_name);
}
int __exec(const KArbit& src, KArbit& dst) override
{
dst = cld_op(src, p);
return true;
}
};