pcl利用ransac实现直线拟合的方法

  • pcl::SampleConsensusModelLine
  • pcl::SACSegmentation

pcl::SampleConsensusModelLine

#include <pcl/io/pcd_io.h>
#include <pcl/sample_consensus/ransac.h>
#include <pcl/sample_consensus/sac_model_line.h>
#include <pcl/visualization/pcl_visualizer.h>using namespace std;//------------------------------- 加载点云 -------------------------------
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile("straightLine.pcd", *cloud) < 0)
{PCL_ERROR("\a点云文件不存在!\n");system("pause");return -1;
}
cout << "->加载点云个数:" << cloud->points.size() << endl;
//========================================================================//----------------------------- 空间直线拟合 -----------------------------
pcl::SampleConsensusModelLine<pcl::PointXYZ>::Ptr model_line(new pcl::SampleConsensusModelLine<pcl::PointXYZ>(cloud));  //指定拟合点云与几何模型
pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_line); //创建随机采样一致性对象
ransac.setDistanceThreshold(0.01);  //内点到模型的最大距离
ransac.setMaxIterations(1000);      //最大迭代次数
ransac.computeModel();              //执行RANSAC空间直线拟合vector<int> inliers;              //存储内点索引的向量
ransac.getInliers(inliers);         //提取内点对应的索引/// 根据索引提取内点
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_line(new pcl::PointCloud<pcl::PointXYZ>);
pcl::copyPointCloud<pcl::PointXYZ>(*cloud, inliers, *cloud_line);/// 模型参数
Eigen::VectorXf coefficient;
ransac.getModelCoefficients(coefficient);
cout << "直线点向式方程为:\n"<< "   (x - " << coefficient[0] << ") / " << coefficient[3]<< " = (y - " << coefficient[1] << ") / " << coefficient[4]<< " = (z - " << coefficient[2] << ") / " << coefficient[5];
//========================================================================

pcl::SACSegmentation

 1#include <iostream>2#include <pcl/ModelCoefficients.h>3#include <pcl/io/pcd_io.h>4#include <pcl/point_types.h>5#include <pcl/sample_consensus/method_types.h>6#include <pcl/sample_consensus/model_types.h>7#include <pcl/segmentation/sac_segmentation.h>89int
10 main ()
11{12  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
13
14  // Fill in the cloud data
15  cloud->width  = 15;
16  cloud->height = 1;
17  cloud->points.resize (cloud->width * cloud->height);
18
19  // Generate the data
20  for (auto& point: *cloud)
21  {22    point.x = 1024 * rand () / (RAND_MAX + 1.0f);
23    point.y = 1024 * rand () / (RAND_MAX + 1.0f);
24    point.z = 1.0;
25  }
26
27  // Set a few outliers
28  (*cloud)[0].z = 2.0;
29  (*cloud)[3].z = -2.0;
30  (*cloud)[6].z = 4.0;
31
32  std::cerr << "Point cloud data: " << cloud->size () << " points" << std::endl;
33  for (const auto& point: *cloud)
34    std::cerr << "    " << point.x << " "
35                        << point.y << " "
36                        << point.z << std::endl;
37
38  pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);
39  pcl::PointIndices::Ptr inliers (new pcl::PointIndices);
40  // Create the segmentation object
41  pcl::SACSegmentation<pcl::PointXYZ> seg;
42  // Optional
43  seg.setOptimizeCoefficients (true);
44  // Mandatory
45  seg.setModelType (pcl::SACMODEL_LINE);
46  seg.setMethodType (pcl::SAC_RANSAC);
47  seg.setDistanceThreshold (0.01);
48
49  seg.setInputCloud (cloud);
50  seg.segment (*inliers, *coefficients);
51
52  if (inliers->indices.size () == 0)
53  {54    PCL_ERROR ("Could not estimate a line model for the given dataset.\n");
55    return (-1);
56  }
57
58 return (0);
59}

PCL:RANSAC算法拟合直线的两种实现方式相关推荐

  1. python使用RANSAC算法拟合直线

    nptest1 = np.array(line1_yx) print("nptest1", nptest1)line1 = cv2.fitLine(nptest1, cv2.DIS ...

  2. Open3D RANSAC算法拟合分割多条直线

    Open3D RANSAC算法拟合分割多条直线 Open3D是一个基于Python的可视化和三维数据处理库,它包含了一些现代计算机视觉算法和工具,使得对3D图像和点云数据进行处理变得更加轻松.在Ope ...

  3. 二分查找算法的两种实现方式:非递归实现和递归实现

    二分查找的条件是对一组有序数组的查找,这一点很容易忘记,在使用二分查找的时候先要对数组进行排序. 先说一下二分查找的思路:一个有序数组,想要查找一个数字key的下标,首先算出中间下标mid,利用mid ...

  4. a - 数据结构实验之串一:kmp简单应用_串的两种模式匹配方式(BF/KMP算法)

    串的两种模式匹配方式(BF/KMP算法) 前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最 ...

  5. RANSAC 算法拟合平面

    RANSAC 算法拟合平面 视觉库为VisionPro 1.输入参数 Distance Threshold:对于拟合算法的每次迭代,测量候选平面与每个3D输入点之间的距离.比这个阈值更远的点被认为是离 ...

  6. 三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS

    1 引言   遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次.图的遍历.遍历过程中得到的顶点序列称为图遍历序列. 2 深度优先搜索 2.1 算法思想 ...

  7. Windows校验文件哈希hash的两种常用方式

    大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...

  8. lisp遍历表中所有顶点_三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS...

    1 引言   遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次.   在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则 ...

  9. 快排的c++实现(两种实现方式)

    快速排序算法是现在用的最广的排序算法,也是效率最高的.它有两种实现方式,一种是定轴法,另外一种是挖坑法.这里简单介绍一下两种实现方法的思想,并附上C++实现代码. (一)定轴法: 1.备份对轴(首记录 ...

最新文章

  1. 编码中统一更该变量的快捷键_流媒体的7种方式使您成为更好的编码器
  2. 元宇宙大热后将陷低潮, 虚实互联网更准确, 2030前后才可能全面热启
  3. ASP.NET MVC中你必须知道的13个扩展点
  4. 服务部署如何做到高可用?这份“三级跳”秘籍送给你
  5. vc 查看硬盘盘符剩余空间
  6. ubuntu 如何在任意终端不填加./就可以执行文件类似ls cd cp
  7. 如果reporting server出现“无法安装打印控件”的处理方法。
  8. 寒武纪找到了引领中国AI芯片走向世界的路
  9. mysql慢sql增加读写分离_MySQL主从同步+读写分离
  10. PHP文件操作的经典案例
  11. 【BZOJ4561】[JLoi2016]圆的异或并
  12. 交互设计的职能:交互设计师具体做什么
  13. [读书笔记]用户画像:方法论与工程化解决方案
  14. 使用微搭低代码制作每日菜单小程序
  15. 登录 不输入账号密码 不能到下一个页面 没办法通过网址直接进去
  16. java中new一个对象时具体都发生了什么?
  17. 上周技术关注:疯狂的社会性应用开发平台-NING
  18. USACO--Milking Cows (C语言)挤奶牛
  19. sequence_loss_by_example()函数在Tensorflow2.x找不到
  20. 手游SDK-登录界面

热门文章

  1. 购物车详情 图片切换
  2. 从来不敷面膜的人_女人不敷面膜的危害
  3. vscode去掉markdown转pdf时的页眉和页脚
  4. STM32CUBEMX开发GD32F303(12)----输出PWM及修改PWM频率与占空比
  5. python读取excel文件,把指定行表红
  6. 如何才能成功的创业,创业成功的本质是什么
  7. 【Python】天气预报及雨量预警到企业微信群的代码实现
  8. linux下的权限粘滞位
  9. Mongrel2服务器配置及控制
  10. excel 两组数据交点_如何在百万级的数据里找到别人正在赚钱的项目?【实操长文】...