PCL中可通过RANSAC算法来计算一些规则点云的数学模型,并返回模型的参数,因此RANSAC算法可用来从点云中提取圆形点云并得到圆形点云的圆心、半径及圆所在平面的法向量(适合于3D Circle)。在PCL的RANSAC算法模型中,有2D Circle和3D Circle两种圆形模型,以下分作简要介绍。
2D Circle模型是从原点云中提取表达式为 (x-a)²+(y-b)²=r² 的点云圆,因此得到的点云是一个圆柱体的侧面,使用方式如下:
(1) 包含头文件:
#include
(2) 定义模型:
pcl::SampleConsensusModelCircle2D::Ptr
model_circle2D(new pcl::SampleConsensusModelCircle2D(cloud));
(3) RANSAC提取2D圆形点云:
pcl::RandomSampleConsensus 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模型的不同角度,可以看出是一个圆柱体的侧面:
所计算出的圆心坐标及半径如下:
D:\project\ComputeRadiusOfCircleInPCL\bin>ComputeRadiusOfCircleInPCL.exe -c2d
-0.00955594
-0.0318372
0.470568
第二个原始点云如最左边图所示,右边两张图为此点云应用RANSAC得出2D Circle模型的不同角度,可以看出是也一个圆柱体的侧面:
所计算出的圆心坐标及半径如下:
D:\project\ComputeRadiusOfCircleInPCL\bin>ComputeRadiusOfCircleInPCL.exe -c2d
2.54835e-08
-1.30672e-08
0.5
由以上两个点云测试结果可以得出,2D Circle模型虽然求得是2D的圆形点云,但是其最终结果为圆柱体的侧面,模型的参数有圆心坐标(x,y)及圆形点云的半径R。
3D Circle模型得到的是三维空间的圆形点云,其数学模型可由圆心,半径及圆所在平面的法向量表示,具体计算方式如下:
(1) 包含头文件:
#include
(2) 定义模型:
pcl::SampleConsensusModelCircle3D::Ptr
model_circle3D(new pcl::SampleConsensusModelCircle3D(cloud));
(3) RANSAC提取3D圆形点云:
pcl::RandomSampleConsensus ransac(model_circle3D);
ransac.setDistanceThreshold(.01);
ransac.computeModel();
ransac.getInliers(inliers);
(4) 得到模型参数并打印出模型参数:
Eigen::VectorXf modelParas;
ransac.getModelCoefficients(modelParas);
std::cout << modelParas<< "\n\n";
同2D Circle模型一样,使用2个不同点云测试,运行结果如下:
第一个原始点云如最左边图所示,右边两张图为此点云应用RANSAC得出3D Circle模型的不同角度,可以看出得到的是一个圆形的点云:
所计算出的圆心坐标及半径如下,前三个数值为圆心坐标(x, y, z),第四个数值为计算出的圆形点云的半径,最后三个为圆形点云所在平面的法向量:
D:\project\ComputeRadiusOfCircleInPCL\bin>ComputeRadiusOfCircleInPCL.exe -c3d
0.0737959
-0.0336464
0
0.398091
0
0
-1
第二个原始点云如最左边图所示,右边两张图为此点云应用RANSAC得出3D Circle模型的不同角度,可以看出得到的也是一个圆形的点云:
所计算出的圆心坐标及半径如下,同第一个点云,数值意义依次为圆心坐标,半径,及法向量:
D:\project\ComputeRadiusOfCircleInPCL\bin>ComputeRadiusOfCircleInPCL.exe -c3d
2.54835e-08
-1.30672e-08
0
0.5
0
-0
1
由以上两个点云对3D Circle模型的测试结果可以得出,3D Circle模型得到的是3D空间的圆形点云,模型的参数有圆心坐标(x,y,z)、圆形点云的半径R、以及圆形点云所在平面的法向量。
开发环境:VS2015 & PCL1.8.1
工程及代码地址:https://github.com/yazhouzheng/ComputeRadiusofCirclePointcloudsInPCL.git
通过PCL中RANSAC算法可以从原始点云中得到2D/3D Circle两种模型,并提取其中的圆柱体侧面或3D圆形点云,并通过模型参数得到两种圆形点云的圆心坐标、半径,及圆形点云所在平面的法向量。