最近开始动手做实验,之前写了一个小实验利用到了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索引的使用的更多相关文章

  1. PCL中的类

    1. PCLBase pcl_base.h中定义了PCL中的基类PCLBase,PCL中的大部分算法都使用了其中的方法. PCLBase实现了点云数据及其索引的定义和访问. 两个主要的变量input_ ...

  2. PCL近邻搜索相关的类

    首先PCL定义了搜索的基类pcl::search::Search<PointInT> template<typename PointT> class Search 其子类包括: ...

  3. PCL中使用FLANN库(2)

    接着上一篇的介绍继续 关于在使用readHeader函数读取点云数据头的类型的代码(Read a point cloud data header from a PCD file.) pcl::PCLP ...

  4. PCL中使用FLANN库(1)

    FLANN库全称是Fast Library for Approximate Nearest Neighbors,它是目前最完整的(近似)最近邻开源库.不但实现了一系列查找算法,还包含了一种自动选取最快 ...

  5. PCL中分割方法的介绍(3)

    (3)上两篇介绍了关于欧几里德分割,条件分割,最小分割法等等还有之前就有用RANSAC法的分割方法,这一篇是关于区域生成的分割法, 区 域生长的基本 思想是: 将具有相似性的像素集合起来构成区域.首先 ...

  6. PCL中分割_欧式分割(1)

    基于欧式距离的分割和基于区域生长的分割本质上都是用区分邻里关系远近来完成的.由于点云数据提供了更高维度的数据,故有很多信息可以提取获得.欧几里得算法使用邻居之间距离作为判定标准,而区域生长算法则利用了 ...

  7. 如何在ROS中使用PCL(2)

    记录关于我们运行roslaunch openni_launch openni.launch  命令时生成的话题以及这些话题的数据类型便于后期的处理,只有知道它们的数据结构,才能很好的对数据进行处理,我 ...

  8. PCL特征点与配准(1)

    关于输入一个具体的物体的点云,从场景中找出与该物体点云相匹配的,这种方法可以用来抓取指定的物体等等,具体的代码的解释如下,需要用到的一些基础的知识,在之前的博客中都有提及,其中用到的一些方法可以翻阅前 ...

  9. 如何在ROS中使用PCL—数据格式(1)

    在ROS中点云的数据类型 在ROS中表示点云的数据结构有: sensor_msgs::PointCloud      sensor_msgs::PointCloud2     pcl::PointCl ...

随机推荐

  1. 反编译 war 包成传统项目的方法

    需求 项目老大让外包做了官网,不甚满意,想自己搞搞,遂叫我反编译他们发过来的 war 包. 方法 第一步:解压 war 包其实就是 zip 压缩包,用 zip 解压. 第二步:反编译 查看 war 包 ...

  2. MyBatis 问题 & 解决

    # 问题 Invalid bound statement (not found) # 解决 <mappers> 标签的包括的是 SQL 语句存在的地方,此外 <mapper> ...

  3. MVC 组件之间的关系

    View和Controller都可以直接请求Model 但是Model不依赖View和controller lController可以直接请求View来显示具体页面 View不依赖Controller ...

  4. redis SERVER INSTALL WINDOWS SERVICE

    以管理 员身份 运行 CMD 命令,进入redis所在目录,并运行下 脚本redis-server --service-install redis.windows-service.conf --log ...

  5. XAML的命名空间 - CSDN博客

    原文:XAML的命名空间 - CSDN博客 一个最简单的XAML例子 <Window x:Class="WpfApplication1.MainWindow" xmlns=& ...

  6. 【转】 C#后台调用前台javascript的五种方法

    第一种,OnClientClick    (vs2003不支持这个方法)<asp:ButtonID="Button1" runat="server" Te ...

  7. C#数字图像处理时注意图像的未用区域

    原文:C#数字图像处理时注意图像的未用区域 图1. 被锁定图像像素数组基本布局         如图1所示,数组的宽度并不一定等于图像像素数组的宽度,还有一部分未用区域.这是为了提高效率,系统要确定每 ...

  8. MongoDB centos安装问题 error while loading shared libraries: libnetsnmpmibs.so.31

    安装mongodb-linux-x86_64-enterprise-rhel70-4.0.5 cd  /usr/mongodb tar -zxvf mongodb-linux-x86_64-enter ...

  9. 修改GitHub上项目语言显示

    问题 最近将自己以Scala为主语言写的博客放到github上了.由于使用了富文本编辑器.jQuery.Bootstrap等第三方插件,导致js.css等代码远远超过你自己写的代码. 于是也就成这样了 ...

  10. QT中Dialog的使用(使用QStackedWidget维护页面切换)

    先看看效果图: pages.h #ifndef PAGES_H #define PAGES_H #include <QWidget> class ConfigurationPage : p ...