PCL 拟合圆锥(以RANSAC为例)(SampleConsensus_Cone)

   PCL专栏目录及须知

以RANSAC为例。如果要用其他采样一致性算法,就只需要变换代码块中的这部分代码就可以。

可使用的其他采样一致性算法类型使用方法及算法的原理解释

1.参数介绍

球体的Eigen::VectorXf参数为7。分别是:

圆锥体顶点的x坐标;圆锥体顶点的y坐标;圆锥体顶点的z坐标;

圆锥体轴方向的x坐标;圆锥体轴方向的y坐标;圆锥体轴方向的z坐标;

圆锥体的张开角度;

2.完整代码

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/search/kdtree.h>
#include <pcl/features/normal_3d.h>  
#include <pcl/sample_consensus/ransac.h>
#include <pcl/sample_consensus/sac_model_cone.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>

int main()
{
	/****************拟合圆锥********************/
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);			// 源点云
	pcl::io::loadPCDFile("D:/code/csdn/data/rabbit.pcd", *cloud);
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloudInliers(new pcl::PointCloud<pcl::PointXYZ>);			// 拟合出的内点

	/****************拟合圆锥********************/
	// 计算法线
	pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
	pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
	pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
	n.setInputCloud(cloud);
	n.setSearchMethod(tree);
	n.setKSearch(50);		// K近邻搜索个数
	n.compute(*normals);

	pcl::SampleConsensusModelCone<pcl::PointXYZ, pcl::Normal >::Ptr model(new pcl::SampleConsensusModelCone<pcl::PointXYZ, pcl::Normal >(cloud));
	model->setInputNormals(normals);
	pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model);	// 定义RANSAC算法对象
	ransac.setDistanceThreshold(0.01);							// 设置距离阈值
	ransac.setMaxIterations(500);								// 设置最大迭代次数
	ransac.computeModel();
	Eigen::VectorXf coeff;
	ransac.getModelCoefficients(coeff);							// 参数
	std::vector<int> ranSacInliers;                                                 // 获取属于拟合出的内点
	ransac.getInliers(ranSacInliers);
	pcl::copyPointCloud(*cloud, ranSacInliers, *cloudInliers);

	std::cout << "圆锥体顶点的x坐标为:" << coeff[0] << "\n圆锥体顶点的y坐标为:" << coeff[1] << "\n圆锥体顶点的z坐标为:" << coeff[2]
		<< "\n圆锥体轴方向的x坐标为:" << coeff[3] << "\n圆锥体轴方向的y坐标为:" << coeff[4] << "\n圆锥体轴方向的z坐标为:" << coeff[5]
		<< "\n圆锥体的张开角度:" << coeff[6]
		<< std::endl;

	/****************展示********************/
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("ransac"));
	viewer->addPointCloud<pcl::PointXYZ>(cloud, "cloud");
	viewer->addPointCloud<pcl::PointXYZ>(cloudInliers, pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>(cloudInliers, 255, 0, 0), "cloudInliers");

	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}

	return (0);
}

3.结果代码

打印:

结果可视化:

RANSACRandom Sample Consensus的简称,是一种随机采样一致性算法,用于拟合点云数据中的平面。在点云数据中,经常需要从大量点中提取出平面模型的参数,例如平面的法向量和平面与原点的距离。RANSAC算法正是能够稳健地提取这些参数的一种方法。 RANSAC算法的基本思想是随机选取一组数据点,然后通过这些数据点拟合出一个平面模型。之后,遍历所有数据点,并计算每个数据点到该模型的距离。若某个点到模型的距离小于一个预设的阈值,则将其划为内点;否则,将其划为外点。对于在内点集合内的点,重新拟合出一个更精确的模型。最后,选择拟合出的模型能够包括尽可能多的内点并且拟合误差最小的那个模型作为最终的结果。 RANSAC算法的优点在于它的鲁棒性。由于数据可能包含异常值(例如噪声、局外点等),这些异常值可能会对拟合结果产生很大的影响。通过随机采样和内点外点判断的方式,RANSAC算法能够有效地过滤掉这些异常值,从而得到更准确的拟合结果。 然而,RANSAC算法也存在一些缺点。首先,随机采样的方式会导致计算结果的不稳定性,不同的随机采样可能得到不同的拟合结果。此外,在拟合过程中需要预先设置一些参数,如采样数量、迭代次数和距离阈值,这些参数的选择可能会对最终结果产生一定的影响。 总而言之,RANSAC算法是一种常用的点云拟合算法,能够稳健地提取平面模型的参数。然而,使用时需要注意参数的设置,以及对于不同数据集可能需要进行合理调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值