点云基于模型删除数据

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;
	}
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值