以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.结果打印
打印:
结果可视化: