《PCL点云库学习&VS2010(X64)》Part 32 计算点云中点的索引

来源:互联网 发布:ipadair2如何卸载软件 编辑:程序博客网 时间:2024/06/06 08:22

《PCL点云库学习&VS2010(X64)》Part 32 计算点云中点的索引

1、返回实际点的索引

       选点后,有时并非是点云上的点,而是与屏幕交互时得到的点,该点可以打印出来,但是在点云中并没有具体的索引。所以在选取点后,我们可以将该点设置一个cloudhandle,同时设置一个RenderingPointCloudProperty,让点改变颜色,同时改变点的大小。

       最后索引出该点的具体位置,具体代码如下:

#include <pcl/search/pcl_search>#include <pcl/search/kdtree>#include <vector>#include <iostream>//返回正确的点索引,不是从屏幕上交互得到的点索引pcl::search::KdTree<pcl::PointXYZ> search;search.setInputCloud(cloud);std::vector<int> indices(1);std::vector<float> distance(1);//由于VTK/OpenGL并没有存储NaN格式的数据,从而导致点无法一一对应//有必要在点云中得到实际点的索引search.nearestKseach(current_point,1,indices,distance);//其中current_point为选中的点int idx;//存储选中点的索引idx = indices[0];cout<<"选中点的实际位置: "<<idx<<endl;

2、获取关键点的索引,并将该索引存储起来

       SIFT、NARF算法中,pcl无法直接提供索引(主要原因是sift点是通过计算出来的,在某些不同参数下,sift点可能并非源数据中的点,而是某些点的近似),若要获取索引,则可利用以下函数:

void getIndices (pointcloud::Ptr cloudin, pointcloud keypoints, pcl::PointIndices::Ptr indices){pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;kdtree.setInputCloud(cloudin);//原始点云std::vector<int> Idx;std::vector<float>Distance; //近邻点集的距离for (size_t i =0; i < keypoints.size();i++) { kdtree.nearestKSearch(keypoints.points[i],1,Idx,Distance);// cout<<"the indieces is:"<<Idx[0]<<endl;// cout<<"the distance is:"<<Distance[0]<<endl; indices->indices.push_back(Idx[0]); }}



        其思想就是:将原始数据插入到flann的kdtree中,寻找keypoints的最近邻,如果距离等于0,则说明是同一点,提取索引即可。


3、将索引点中的点云从原始点云中提取出来IndiceExtraction

其实有两种方法,在第25篇博客中都有给出:

1、CopyPointCloud函数;——第一个例子

2、IndiceExtraction函数。——第七个例子



0 0
原创粉丝点击