pcl库中根据模型投影的算法是ProjectInliers,可以将3D模型降维到 模型指定的空间。
使用效果如下:
使用x-o-y平面投影
使用 参数: 0,1,1,0 投影
使用 1,1,1,0参数投影
编写的klib平台插件代码如下:
struct FilterProjectInliers
{
//ProjectInliers
bool copy_all_data = false;
int model_type = pcl::SACMODEL_PLANE;
ModelCoefficients::Ptr coeff = make_shared<ModelCoefficients>();
FilterProjectInliers()
{
coeff->values.assign({0,0,1,0});
}
template<class PT>
KArbit operator()(const pcl::shared_ptr<PointCloud<PT> >& cloud)
{
pcl::shared_ptr<PointCloud<PT> > res(new PointCloud<PT>);
ProjectInliers<PT> f;
f.setCopyAllData(copy_all_data);
f.setModelType(model_type);
f.setModelCoefficients(coeff);
f.setInputCloud(cloud);
f.filter(*res);
return res;
}
};
struct KPclFilterProjectInliers : KPlugBase
{
FilterProjectInliers p;
KPclFilterProjectInliers()
{
addProp("model").setType(PropTypeShapeModel).setEmptyIndex(1);
addProp("copy_all_data").setType(PropTypeBool).setValueAddr(&p.copy_all_data);
}
int __exec(const KArbit& src, KArbit& dst) override
{
auto& aL = a2list(src);
CastType(shapeMode, KShapeModel, aL[1]);
p.model_type = shapeMode.type;
con_cvt(shapeMode.coeffs, p.coeff->values);
dst = cld_op(aL[0], p);
return true;
}
};