RANSAC - 随机采样一致性算法

11 篇文章 2 订阅

转载:http://blog.csdn.net/shoreman/article/details/11018191

RANSAC范例的正式描述如下:

首先,要给定:

         1一个模型,该模型需要最少n个数据点去实例化它的自由参数;

         2一组数据点P,P中包含数据点的数量#(P)大于n。

然后

从P中随机地选择n个点(组成P的一个子集S1)并实例化这个模型(构造成M1)。

接下来

         利用实例化的模型M1去测定P中点的某个子集S1*,这些点相对于M1的错误被限制在一个给定的阈值下,其中S1*被称作S1的一致性集合。

         或者:

         利用实例化的模型M1去逐个测定P中的其它点,舍掉那些偏离M1较大的点,保留那些偏离M1较小的点并组成一个集合S1*,该集合被称作S1的一致性集合。

接下来的步骤要对S1*中点的数量#(S1*)进行条件判定:

         if( #(S1*) >= t )         // t是一个阈值,是P中离群点(相对于M1)数量的估计函数

         {

                   利用S1*(+S1)去计算一个新的模型M1*;// 例如用最小二乘法

         }

         if( #(S1*) < t )

         {

                   随机地选择一个新的子集S2,并重复以上过程;

                   如果

在几次预定义的实验次数之后,找到的一致性集合含有点的数量总是小于t;

                   那么

要么使用已经找到的最大的一致性集合去解决这个模型;

                              要么以失败来终结掉这个算法

}


代码

#include <iostream>
#include <pcl/ModelCoefficients.h>  //模型系数
#include <pcl/io/pcd_io.h>                  //输入输出
#include <pcl/point_types.h>                //点云(类型)
#include <pcl/sample_consensus/method_types.h>  //随机样本一致性算法 方法类型
#include <pcl/sample_consensus/model_types.h>       //随机样本一致性算法 模型类型
#include <pcl/segmentation/sac_segmentation.h>  //随机样本一致性算法 分割方法

int
main (int argc, char** argv)
{
  pcl::PointCloud<pcl::PointXYZ> cloud; //创建点云对象,用于存储点云数据
    //填充点云数据
    cloud.width  = 15;
  cloud.height = 1;
  cloud.points.resize (cloud.width * cloud.height);

    //生成随机数据
    for (size_t i = 0; i < cloud.points.size (); ++i)
  {
    cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
    cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
    cloud.points[i].z = 1.0;
  }

    //设置几个局外点
    cloud.points[0].z = 2.0;
    cloud.points[3].z = -2.0;
    cloud.points[6].z = 4.0;
    //显示点云数量和坐标信息
  std::cerr << "Point cloud data: " << cloud.points.size () <<" points" << std::endl;
    for (size_t i = 0; i < cloud.points.size (); ++i)
        std::cerr << "    " << cloud.points[i].x << " " 
                            << cloud.points[i].y << " " 
                            << cloud.points[i].z << std::endl;

    pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients); //存储输出的模型的系数
    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.setDistanceThreshold (0.01);
  seg.setInputCloud (cloud.makeShared ());
  seg.segment (*inliers, *coefficients);    //分割操作

    if (inliers->indices.size () == 0)//根据内点数量,判断是否成功
    {

    PCL_ERROR ("Could not estimate a planar model for the given dataset.");
        return (-1);
  }
    //显示模型的系数
  std::cerr << "Model coefficients: " << coefficients->values[0] << " " 
                        <<coefficients->values[1] << " "
                        <<coefficients->values[2] << " " 
                        <<coefficients->values[3] <<std::endl;
    //显示估计平面模型过程中使用的内点
  std::cerr << "Model inliers: " << inliers->indices.size () << std::endl;
    for (size_t i = 0; i < inliers->indices.size (); ++i)
            std::cerr << inliers->indices[i] << "    " <<cloud.points[inliers->indices[i]].x << " "
                                <<cloud.points[inliers->indices[i]].y << " "
                                <<cloud.points[inliers->indices[i]].z << std::endl;
    return (0);
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

运行结果

这里写图片描述


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值