引言
PCL中可通过RANSAC算法来计算一些规则点云的数学模型,并返回模型的参数,因此RANSAC算法可用来从点云中提取圆形点云并得到圆形点云的圆心、半径及圆所在平面的法向量(适合于3D Circle)。在PCL的RANSAC算法模型中,有2D Circle和3D Circle两种圆形模型,以下分作简要介绍。
2D Circle模型
2D Circle模型是从原点云中提取表达式为 (x-a)²+(y-b)²=r² 的点云圆,因此得到的点云是一个圆柱体的侧面,使用方式如下:
(1) 包含头文件:
#include <pcl/sample_consensus/sac_model_circle.h>
(2) 定义模型:
pcl::SampleConsensusModelCircle2D<pcl::PointXYZ>::Ptr
model_circle2D(new pcl::SampleConsensusModelCircle2D<pcl::PointXYZ>(cloud));
(3) RANSAC提取2D圆形点云:
pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_circle2D);
ransac.setDistanceThreshold(.01);
ransac.computeModel();
ransac.getInliers(inliers);
(4) 得到圆心坐标及半径并输出:
Eigen::VectorXf modelParas;
ransac.getModelCoefficients(modelParas);
std::cout << modelParas<< "\n\n";
用程序自动生成2个点云并测试,运行结果如下:
第一个原始点云如最左边图所示,右边两张图为此点云应用RANSAC得出2D Circle模型的不同角度,可以看出是一个圆柱体的侧面: