PCL中使用RANSAC算法计算点云圆心坐标及半径

引言

       PCL中可通过RANSAC算法来计算一些规则点云的数学模型,并返回模型的参数,因此RANSAC算法可用来从点云中提取圆形点云并得到圆形点云的圆心、半径及圆所在平面的法向量(适合于3D Circle)。在PCL的RANSAC算法模型中,有2D Circle和3D Circle两种圆形模型,以下分作简要介绍。

 2D 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模型的不同角度,可以看出是一个圆柱体的侧面:

PCL中使用RANSAC算法计算点云圆心坐标及半径_第1张图片PCL中使用RANSAC算法计算点云圆心坐标及半径_第2张图片PCL中使用RANSAC算法计算点云圆心坐标及半径_第3张图片

所计算出的圆心坐标及半径如下:

D:\project\ComputeRadiusOfCircleInPCL\bin>ComputeRadiusOfCircleInPCL.exe -c2d
-0.00955594
 -0.0318372
   0.470568

第二个原始点云如最左边图所示,右边两张图为此点云应用RANSAC得出2D Circle模型的不同角度,可以看出是也一个圆柱体的侧面:

PCL中使用RANSAC算法计算点云圆心坐标及半径_第4张图片PCL中使用RANSAC算法计算点云圆心坐标及半径_第5张图片PCL中使用RANSAC算法计算点云圆心坐标及半径_第6张图片

所计算出的圆心坐标及半径如下:

D:\project\ComputeRadiusOfCircleInPCL\bin>ComputeRadiusOfCircleInPCL.exe -c2d
 2.54835e-08
-1.30672e-08
         0.5

由以上两个点云测试结果可以得出,2D Circle模型虽然求得是2D的圆形点云,但是其最终结果为圆柱体的侧面,模型的参数有圆心坐标(x,y)及圆形点云的半径R。

3D Circle模型

        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模型的不同角度,可以看出得到的是一个圆形的点云:

PCL中使用RANSAC算法计算点云圆心坐标及半径_第7张图片PCL中使用RANSAC算法计算点云圆心坐标及半径_第8张图片PCL中使用RANSAC算法计算点云圆心坐标及半径_第9张图片

所计算出的圆心坐标及半径如下,前三个数值为圆心坐标(x, y, z),第四个数值为计算出的圆形点云的半径,最后三个为圆形点云所在平面的法向量:

D:\project\ComputeRadiusOfCircleInPCL\bin>ComputeRadiusOfCircleInPCL.exe -c3d
 0.0737959
-0.0336464
         0
  0.398091
         0
         0
        -1

第二个原始点云如最左边图所示,右边两张图为此点云应用RANSAC得出3D Circle模型的不同角度,可以看出得到的也是一个圆形的点云:

PCL中使用RANSAC算法计算点云圆心坐标及半径_第10张图片PCL中使用RANSAC算法计算点云圆心坐标及半径_第11张图片PCL中使用RANSAC算法计算点云圆心坐标及半径_第12张图片

所计算出的圆心坐标及半径如下,同第一个点云,数值意义依次为圆心坐标,半径,及法向量:

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圆形点云,并通过模型参数得到两种圆形点云的圆心坐标、半径,及圆形点云所在平面的法向量。

 

 

 

你可能感兴趣的:(PCL)