pcl获取点云某点的索引

pcl中,PointXYZ类型已知点云中某个点的坐标,怎么获取它在点云中的索引?

可以使用pcl::search::KdTree类来实现这个功能。具体步骤如下:

1将点云转换为pcl::PointCloudpcl::PointXYZ::Ptr指针类型;
2创建pcl::search::KdTreepcl::PointXYZ对象,将点云传入构造函数中;
3创建pcl::PointXYZ对象,将已知点的坐标传入构造函数中;
4调用KdTree对象的nearestKSearch方法,传入查询点和k值(这里k=1),可以得到最近的点及其索引;
5最后返回最近点的索引即可。
示例代码如下:


#include <pcl/kdtree/kdtree_flann.h>

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
// 假设点云已经被读取到cloud中

pcl::PointXYZ search_point(0.0, 0.0, 0.0); // 已知点的坐标

pcl::search::KdTree<pcl::PointXYZ> kdtree;
kdtree.setInputCloud(cloud);

int K = 1;
std::vector<int> pointIdxNKNSearch(K);
std::vector<float> pointNKNSquaredDistance(K);

// 查询最近的点
if (kdtree.nearestKSearch(search_point, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0) {
    int nearest_idx = pointIdxNKNSearch[0];
    // nearest_idx 即为最近点在点云中的索引
}


需要注意的是,nearestKSearch方法返回的点的索引是以向量(vector)的形式返回的,而且由于这里k=1,所以向量中只有一个元素,即最近点的索引。