关于pcl索引的使用
最近开始动手做实验,之前写了一个小实验利用到了PCL库中的索引;
现在在写利用PCL中的RegionGrowing类来分割生成面片,无论是迭代生成还是进行提取都需要用到pcl库中定义的索引,
虽然搞的不是太明白,还是想写下来来记录自己的思路。
先看一下PCL是如何定义PointIndices的结构:
struct PointIndices
{
PointIndices () : header (), indices ()
{} ::pcl::PCLHeader header; std::vector<int> indices; public:
typedef boost::shared_ptr< ::pcl::PointIndices> Ptr;
typedef boost::shared_ptr< ::pcl::PointIndices const> ConstPtr;
}; // struct PointIndices
typedef boost::shared_ptr< ::pcl::PointIndices> PointIndicesPtr;
typedef boost::shared_ptr< ::pcl::PointIndices const> PointIndicesConstPtr;
可以看出在 数据结构 PointIndices 中 定义了点云的header和indices;这里我们不关心header的结构,而indices的结构就是简单的int类型的vector;
所以我们经常见到一些代码直接定义索引的时候直接使用了一下的定义:
std::vector<int > points_indices;//int类型的vector类
或者:
pcl::IndicesPtr indices(new std::vector <int>);//指向int类型的vector类的空智能指针
若要将智能指针指向定义的 points_indices,需要:
pcl::IndicesPtr index_ptr = boost::make_shared<std::vector<int>>(points_indices);
或者:
pcl::IndicesPtr index_ptr(new std::vector<int>(points_indices));
因为在pcl_base.h中有如下定义:
typedef boost::shared_ptr <std::vector<int> > IndicesPtr;
typedef boost::shared_ptr <const std::vector<int> > IndicesConstPtr;
PS:
pcl中大量用到了智能指针 share_ptr,shared_ptr允许多个指针指向同一个对象
智能指针的使用方式与普通指针类似:
1.解引用一个智能指针返回它指向的对象;
2.如果在一个条件判断中使用智能指针,效果就是检测它是否为空.
使用智能指针的初始化:
//一般的初始化方式
shared_ptr<string> pint(new string("normal usage!"));
cout<<*pint<<endl; //推荐的安全的初始化方式
shared_ptr<string> pint1 = make_shared<string>("safe uage!");
cout<<*pint1<<endl;
先把之前利用到的写一些:
1 int j = ;
std::vector<int > indexs;
for (auto i : *normals)
{
if (i.normal_z < 0.05 && i.normal_z > -0.05)
{
normals1->points.push_back(i);
indexs.push_back(j);
}
j++;
}
//打印滤波后将法向量存储在normal1的信息,以及相应的索引
std::cout << *normals1 << std::endl;
std::cout << indexs.size() << std::endl; //索引
boost::shared_ptr<std::vector<int>> index_ptr = boost::make_shared<std::vector<int>>(indexs);
// Create the filtering object
pcl::ExtractIndices<pcl::PointXYZ> extract;
// Extract the inliers
extract.setInputCloud(cloud_0);
extract.setIndices(index_ptr);
extract.setNegative(false);//如果设为true,可以提取指定index之外的点云
extract.filter(*cloud_1);
//法向量滤波后得到的点云信息
std::cout << *cloud_1 << std::endl;
上面第17行代码也可以写为:
pcl::IndicesPtr index_ptr = boost::make_shared<std::vector<int>>(indexs);
那么现在有pcl_base.h下的IndicesPtr,为指向int类型的vector的智能指针的索引;
PointIndices.h下的定义的数据结构 PointIndices ;那么将点云进行索引的指针可用以下:
pcl::PointIndices index_1;
pcl::IndicesPtr index_ptr = boost::make_shared<std::vector<int>>(index_1.indices);
综上所述,索引的使用可以如下所示:
std::vector<int > indexs;
pcl::PointIndices index_1;
pcl::IndicesPtr indices_plane(new std::vector <int>(indexs));
pcl::IndicesPtr index_ptr(new std::vector<int>(index_1.indices));
pcl::IndicesPtr index_ptr = boost::make_shared<std::vector<int>>(index_1.indices);
pcl::IndicesPtr index_ptr = boost::make_shared<std::vector<int>>(indexs);
//pcl::IndicesPtr index_ptr = boost::make_shared<std::vector<int>>(index_1);//这个index_1的索引不可用,因为index_1为PointIndices类,只能用上述第5行那样调用
利用ExtractIndices进行索引点云的提取:
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud(cloud_0);
extract.setIndices(index_ptr);
extract.setNegative(false);//如果设为true,可以提取指定index之外的点云
extract.filter(*cloud_1);
总结一下,这篇文章主要是解决在PCL使用过程中,用于自定义条件的点云提取,将点云的索引进行相应的存储在 vector<int> 数组中,利用
pcl::IndicesPtr index_ptr = boost::make_shared<std::vector<int>>(points_indices);
或者:
pcl::IndicesPtr index_ptr(new std::vector<int>(points_indices));
进行智能指针的转化,以利用ExtractIndices类中的 setIndices()函数进行点云的提取。
举例如下:
//根据想要的点添加到自定义的indices_0的数组中,
//std::vector<int> indices_0;
pcl::PointIndices indices_0; indices_0.indices.push_back();
indices_0.indices.push_back();
indices_0.indices.push_back();
//将自定义的indices_0数组进行智能指针的转化
//pcl::IndicesPtr index_ptr_0 = boost::make_shared<std::vector<int>>(indices_0.indices);
pcl::IndicesPtr index_ptr_0(new std::vector<int>(indices_0.indices)); //利用ExtractIndices根据索引进行点云的提取
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud(cloud_0);
extract.setIndices(index_ptr_0);
extract.setNegative(false);//如果设为true,可以提取指定index之外的点云
extract.filter(*cloud_1); //cloud_1索引0,1,2分别对应与cloud_0索引的0,10,100
std::cout << *cloud_1 << std::endl;
std::cout << cloud_1->at() << std::endl;
std::cout << cloud_1->at() << std::endl;
std::cout << cloud_1->at() << std::endl; std::cout << *cloud_0 << std::endl;
std::cout << cloud_0->at() << std::endl;
std::cout << cloud_0->at() << std::endl;
std::cout << cloud_0->at() << std::endl;
关于pcl索引的使用的更多相关文章
- PCL中的类
1. PCLBase pcl_base.h中定义了PCL中的基类PCLBase,PCL中的大部分算法都使用了其中的方法. PCLBase实现了点云数据及其索引的定义和访问. 两个主要的变量input_ ...
- PCL近邻搜索相关的类
首先PCL定义了搜索的基类pcl::search::Search<PointInT> template<typename PointT> class Search 其子类包括: ...
- PCL中使用FLANN库(2)
接着上一篇的介绍继续 关于在使用readHeader函数读取点云数据头的类型的代码(Read a point cloud data header from a PCD file.) pcl::PCLP ...
- PCL中使用FLANN库(1)
FLANN库全称是Fast Library for Approximate Nearest Neighbors,它是目前最完整的(近似)最近邻开源库.不但实现了一系列查找算法,还包含了一种自动选取最快 ...
- PCL中分割方法的介绍(3)
(3)上两篇介绍了关于欧几里德分割,条件分割,最小分割法等等还有之前就有用RANSAC法的分割方法,这一篇是关于区域生成的分割法, 区 域生长的基本 思想是: 将具有相似性的像素集合起来构成区域.首先 ...
- PCL中分割_欧式分割(1)
基于欧式距离的分割和基于区域生长的分割本质上都是用区分邻里关系远近来完成的.由于点云数据提供了更高维度的数据,故有很多信息可以提取获得.欧几里得算法使用邻居之间距离作为判定标准,而区域生长算法则利用了 ...
- 如何在ROS中使用PCL(2)
记录关于我们运行roslaunch openni_launch openni.launch 命令时生成的话题以及这些话题的数据类型便于后期的处理,只有知道它们的数据结构,才能很好的对数据进行处理,我 ...
- PCL特征点与配准(1)
关于输入一个具体的物体的点云,从场景中找出与该物体点云相匹配的,这种方法可以用来抓取指定的物体等等,具体的代码的解释如下,需要用到的一些基础的知识,在之前的博客中都有提及,其中用到的一些方法可以翻阅前 ...
- 如何在ROS中使用PCL—数据格式(1)
在ROS中点云的数据类型 在ROS中表示点云的数据结构有: sensor_msgs::PointCloud sensor_msgs::PointCloud2 pcl::PointCl ...
随机推荐
- MyBatis 模板
mybatis-config.xml: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE co ...
- WPF中任意Object的XAML代码格式化输出
原文:WPF中任意Object的XAML代码格式化输出 有时候,我们需要将WPF中的控件自身的XAML代码输出成文本,那么,我们可以使用System.Windows.Markup.XamlWriter ...
- 【C#】获取"我的电脑"的名字,如This PC、这台计算机
原文:[C#]获取"我的电脑"的名字,如This PC.这台计算机 注意:这里获取的[我的电脑]的名字,不是机器的名字.如图所示: 要获取的是This PC这个字符串. ----- ...
- How do I duplicate a resource reference in code behind in WPF?如何在WPF后台代码中中复制引用的资源?
原文 https://stackoverflow.com/questions/28240528/how-do-i-duplicate-a-resource-reference-in-code-behi ...
- Win10《芒果TV》商店版更新v3.2.6:修复后台任务故障,优化推送频次
2017湖南卫视大型音乐竞技节目<歌手>,2017年1月21日晚首播第一期,7位歌手惊艳亮嗓,<芒果TV>UWP版迅速更新v3.2.6版,主要是修复后台任务故障,优化推送频次, ...
- android 录屏
录屏,google了一下,记录下来,以免FQ android 4.4 录屏可通过adb:adb shell screenrecord /sdcard/video.mp4 (未测试) android 5 ...
- 中资收购美新半导体,为何能通过CFIUS审查(其实是国内公司,技术水平国内领先,和国际仍有差距)
日前,华灿光电发布公告称,旗下子公司和谐光电收购美国美新半导体终获得CFIUS审查通过.这是中资收购豪威科技.图芯科技等公司之后,再次从美国成功收购半导体企业.而且本次中资收购美新半导体还是在特朗普上 ...
- 微信小程序实战之天气预报
原文:微信小程序实战之天气预报 这个案例是仿UC中天气界面做的中间也有点出入,预留了显示当前城市名字和刷新图标的位置,自己可以写下,也可以添加搜索城市.值得注意的是100%这个设置好像已经不好使了,可 ...
- Linux文件系统操作与磁盘管理
简单文件操作 df---->report file system disk space usage du---->estimate file space usage 2.简单的磁盘管理 d ...
- c# 计算字符串和文件的MD5值的方法
快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中. <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...