关于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 ...
随机推荐
- ASP CRUD
//UserInfoList.html <!DOCTYPE html> <html><head><meta http-equiv="Content- ...
- delphi中获取memo鼠标所在位置的行和列(通过EM_GETRECT消息取得Rect后,自己算一下)
也是看别人写的,但是不容易找到,就转发一篇delphi版本的 function GetLine(X, Y: integer): TPoint;var OldFont : HFont; Hand : ...
- 2013年新年礼物---CrossFPC 终于出来了
2012年12月份,玛雅人的预言没有实现,一个内部进行了7年开发的CrossFPC 终于见光了. 网址:http://www.crossfpc.com/ Welcome to CrossFPC, a ...
- PySide——Python图形化界面入门教程(五)
PySide——Python图形化界面入门教程(五) ——QListWidget 翻译自:http://pythoncentral.io/pyside-pyqt-tutorial-the-qlistw ...
- Java中的逆变与协变 专题
结论先行: PECS总结: 要从泛型类取数据时,用extends: 协变 要往泛型类写数据时,用super: 逆变 既要取又要写,就不用通配符(即extends与super都不用) 不变 List&l ...
- UWP ListView嵌套ListView
要求:加载全部的订单,每个订单里面有一个或者多个产品,在列表中要展现出来, 1. xaml界面 步骤:1.这里使用的是x:bind绑定所以要引入实体类命名空间(OrderList集合中类的命名空间): ...
- UBUNTU 16.04 + CUDA8.0 + CUDNN6.0 + OPENCV3.2 + MKL +CAFFE + tensorflow
首先说一下自己机子的配置 CPU:Intel(R) Core(TM) i5-5600 CUP @3.20GHz *4 GPU : GTX 1060 OS : 64bit Ubuntu16.04LTS ...
- Azure 云助手主要功能
实时查询: 实时查询Azure云服务的用量和账单,还可以将重点服务固定在首页“我的监控”页面,方便快速查看. 随时管控: 随时随地对云服务管理和配置(例如,重启.更改虚拟机). 多个账户: 随心切换多 ...
- Sailfish OS 2.1.0 发布,带来重大的架构变化
Sailfish OS 2.1.0 Iijoki 发布了. Iijoki通过引入Qt 5.6 UI框架.BlueZ 5 蓝牙堆栈和 64 位架构的基本实现,为Sailfish操作系统带来了重大的架构变 ...
- Qt中连接到同一signal的多个slots的执行顺序问题(现在是看连接顺序,以前是无序的)
in the order they have been connected 起源 前些天忘记在哪儿讨论过这个问题,今天在csdn又看到有网友问这个问题,而其他网友却无一例外的给出了“无序”这个答案. ...