利用RANSAC算法稳健估计平面模型参数和圆柱模型参数

原创 2016年05月19日 21:26:25

前言

点云处理中常用到平面模型和圆柱模型分割点云或者精确确定目标点云范围。平面方程可以根据邻域点集使用最小二乘法估计得出,但是圆柱方程使用最小二乘法却没有线性方程参数估计那么简单。使用最小二乘法估计模型参数的抗粗差(噪声数据)能力不强,这也促进了稳健估计方法的研究。当前以有大量的稳健估计方法可供选择使用,如:RANSAC、BaySAC、Hough变换、Random Hough变换、极大似然法、最小中值法等等,本文中将对最简单的RANSAC稳健估计方法进行讲解。RANSAC算法笔者用的较多,具有迭代次数少,抗粗差能力强的特点。算法具体过程很多点云处理方面的论文中都有涉及,再此就不赘述了(等毕业答辩后会花时间整理算法流程,并把C++代码共享)。这篇博客里就基于PCL利用RANSAC算法对平面参数和圆柱参数进行求解。

平面方程参数估计

常用的平面方程是平面的法线式:ax+by+cz=d,其中a^2+b^2+c^2=1,d>0,(a,b,c)为平面法矢,d为原点至平面的距离,这四个参数可以确定一个平面。

  //存放局内点索引
  pcl::PointIndices::Ptr inliers (new pcl::PointIndices);
  //创建分割对象
  pcl::SACSegmentation<pcl::PointXYZ> seg;
  //选择模型系数是否需要优化
  seg.setOptimizeCoefficients (true);
  //设置模型类型
  seg.setModelType (pcl::SACMODEL_PLANE);
  //设置模型估计方法
  seg.setMethodType (pcl::SAC_RANSAC);
  //设置最大迭代次数
  seg.setMaxIterations(10000);
  //距离阈值(离散点到模型表面距离)
  seg.setDistanceThreshold (0.01);
  //输入点云
  seg.setInputCloud (cloud);
  //计算模型参数和得到符合此模型的局内点索引
  seg.segment (*inliers, *coefficients);
  //输出平面模型的四个参数
  std::cerr << "Model coefficients: " << coefficients->values[0] << " " 
                                      << coefficients->values[1] << " "
                                      << coefficients->values[2] << " " 
                                      << coefficients->values[3] << std::endl;

平面模型参数估计结束。

圆柱方程参数估计

圆柱方程可以表示为:(x-x0)^2+(y-y0)^2+(z-z0)^2-r^2=[l(x-x0)+m(y-y0)+n(z-z0)]^2/(l^2+m^2+n^2)。下图为空间圆柱示意图。


这里写图片描述
这里写图片描述
其中,(x0,y0,z0)为圆柱轴线L上一点,(l,m,n)为圆柱轴线L方向向量,r为圆柱的半径,这七个参数可以确定一个圆柱方程。

下面代码的含义和估计平面参数时代码含义基本一致,不介绍了。

  // Create the segmentation object for cylinder segmentation and set all the parameters
    seg.setOptimizeCoefficients(true);
    seg.setModelType(pcl::SACMODEL_CYLINDER);
    seg.setMethodType(pcl::SAC_RANSAC);
    seg.setNormalDistanceWeight(0.1);
    seg.setMaxIterations(10000);
    seg.setDistanceThreshold(0.1);
    seg.setRadiusLimits(0, 0.5);
    seg.setInputCloud(cloud);
    seg.setInputNormals(cloud_normals);

    // Obtain the cylinder inliers and coefficients
    seg.segment(*inliers_cylinder, *coefficients_cylinder);
    std::cerr << "Cylinder coefficients: " << *coefficients_cylinder << std::endl;

    // Write the cylinder inliers to disk
    extract.setInputCloud(cloud);
    extract.setIndices(inliers_cylinder);
    extract.setNegative(false);
    pcl::PointCloud<PointT>::Ptr cloud_cylinder(new pcl::PointCloud<PointT>());
    extract.filter(*cloud_cylinder);
    if (cloud_cylinder->points.empty())
        std::cerr << "Can't find the cylindrical component." << std::endl;
    else
    {
        std::cerr << "PointCloud representing the cylindrical component: " << cloud_cylinder->points.size() << " data points." << std::endl;
        writer.write("table_scene_mug_stereo_textured_cylinder.pcd", *cloud_cylinder, false);
    }

计算效果


这里写图片描述
平面和圆柱(杯子)参数
这里写图片描述
平面和圆柱(杯子)分割结果

版权声明:本文为博主原创文章,未经博主允许不得转载。

RANSAC算法讲解

RANSAC是“RANdom SAmple Consensus(随机抽样一致)”的缩写。它可以从一组包含“局外点”的观测数据集中,通过迭代方式估计数学模型的参数。它是一种不确定的算法——它有一定的概率...
  • fandq1223
  • fandq1223
  • 2016年11月15日 19:51
  • 6982

PCL中RANSAC使用,点云平面检测,显示,存储

#include #include #include #include #include #include #include #include #include #include ...
  • fandq1223
  • fandq1223
  • 2016年11月24日 16:35
  • 3191

ransac平面拟合

pcl::RandomSampleConsensus是RANSAC算法的实现。pcl::SampleConsensusModelPlane实现采样一致计算的三维平面模型分割类。 下面一段代码演示利用...
  • hanshuobest
  • hanshuobest
  • 2017年06月03日 20:27
  • 959

pcl 提取子集(平面)

在点云里提取了一些子集(平面)并显示出来 参考链接 http://www.pclcn.org/study/shownews.php?lang=cn&id=72 http://pointclou...
  • u013351270
  • u013351270
  • 2017年04月01日 20:46
  • 1576

PCL中Sample_consensus模块支持的几何模型

As of PCL 1.0, the following models are supported:
  • sdau20104555
  • sdau20104555
  • 2014年10月31日 09:12
  • 2253

提取点云中的树干,路灯等圆柱体

先将点云投影到二维网格上,每个网格存有该网格对应的所有点的信息,选取密度大于阈值的网格,取其及其邻域内所有点,用pcl中RANSAC算法拟合圆柱体,提取出内点并输出。 代码如下: #include...
  • mthdxc
  • mthdxc
  • 2017年11月27日 11:12
  • 99

采样一致性算法

#include #include #include #include #include #include #include #include #include #include ...
  • sjt091110317
  • sjt091110317
  • 2015年10月14日 20:48
  • 981

RANSAC

RANSAC 分类: 图像处理2012-09-24 10:00 3979人阅读 评论(2) 收藏 举报 算法random测试null工作 大概太久没更新了,压力就越大了,...
  • pi9nc
  • pi9nc
  • 2014年05月22日 15:58
  • 9488

PCL Getting Start.

PCL Getting Start. 此文档对点云库中所包含的库进行了简单介绍,用于查阅与学习。对应的图片,请参照以下原始文档链接。 http://pointclouds.org/document...
  • donglin425
  • donglin425
  • 2012年11月06日 20:47
  • 1046

PCL点云库SACSegmentation用法demo

  • 2014年09月07日 11:41
  • 4.2MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用RANSAC算法稳健估计平面模型参数和圆柱模型参数
举报原因:
原因补充:

(最多只允许输入30个字)