PCL:RANSAC算法拟合直线的两种实现方式
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算法拟合直线的两种实现方式相关推荐
- python使用RANSAC算法拟合直线
nptest1 = np.array(line1_yx) print("nptest1", nptest1)line1 = cv2.fitLine(nptest1, cv2.DIS ...
- Open3D RANSAC算法拟合分割多条直线
Open3D RANSAC算法拟合分割多条直线 Open3D是一个基于Python的可视化和三维数据处理库,它包含了一些现代计算机视觉算法和工具,使得对3D图像和点云数据进行处理变得更加轻松.在Ope ...
- 二分查找算法的两种实现方式:非递归实现和递归实现
二分查找的条件是对一组有序数组的查找,这一点很容易忘记,在使用二分查找的时候先要对数组进行排序. 先说一下二分查找的思路:一个有序数组,想要查找一个数字key的下标,首先算出中间下标mid,利用mid ...
- a - 数据结构实验之串一:kmp简单应用_串的两种模式匹配方式(BF/KMP算法)
串的两种模式匹配方式(BF/KMP算法) 前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最 ...
- RANSAC 算法拟合平面
RANSAC 算法拟合平面 视觉库为VisionPro 1.输入参数 Distance Threshold:对于拟合算法的每次迭代,测量候选平面与每个3D输入点之间的距离.比这个阈值更远的点被认为是离 ...
- 三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS
1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次.图的遍历.遍历过程中得到的顶点序列称为图遍历序列. 2 深度优先搜索 2.1 算法思想 ...
- Windows校验文件哈希hash的两种常用方式
大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...
- lisp遍历表中所有顶点_三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS...
1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则 ...
- 快排的c++实现(两种实现方式)
快速排序算法是现在用的最广的排序算法,也是效率最高的.它有两种实现方式,一种是定轴法,另外一种是挖坑法.这里简单介绍一下两种实现方法的思想,并附上C++实现代码. (一)定轴法: 1.备份对轴(首记录 ...
最新文章
- 编码中统一更该变量的快捷键_流媒体的7种方式使您成为更好的编码器
- 元宇宙大热后将陷低潮, 虚实互联网更准确, 2030前后才可能全面热启
- ASP.NET MVC中你必须知道的13个扩展点
- 服务部署如何做到高可用?这份“三级跳”秘籍送给你
- vc 查看硬盘盘符剩余空间
- ubuntu 如何在任意终端不填加./就可以执行文件类似ls cd cp
- 如果reporting server出现“无法安装打印控件”的处理方法。
- 寒武纪找到了引领中国AI芯片走向世界的路
- mysql慢sql增加读写分离_MySQL主从同步+读写分离
- PHP文件操作的经典案例
- 【BZOJ4561】[JLoi2016]圆的异或并
- 交互设计的职能:交互设计师具体做什么
- [读书笔记]用户画像:方法论与工程化解决方案
- 使用微搭低代码制作每日菜单小程序
- 登录 不输入账号密码 不能到下一个页面 没办法通过网址直接进去
- java中new一个对象时具体都发生了什么?
- 上周技术关注:疯狂的社会性应用开发平台-NING
- USACO--Milking Cows (C语言)挤奶牛
- sequence_loss_by_example()函数在Tensorflow2.x找不到
- 手游SDK-登录界面