PCL 拟合圆柱(以RANSAC为例)(SampleConsensus_Cylinder)

   以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_cylinder.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::SampleConsensusModelCylinder<pcl::PointXYZ, pcl::Normal >::Ptr model(new pcl::SampleConsensusModelCylinder<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.结果打印

打印:

结果可视化:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值