1pclkdtree搜索的两种方式
//第一种方式
pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
//第二种方式,指针必须初始化
pcl::search::KdTree<pcl::PointXYZ> ::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
2两种方式近邻搜索结果相同:
近邻搜索结果都包含查询点,近邻索引号是按照距离从小到大排序好的,距离也是。
#include "pch.h"
#include <iostream>
#include<pcl/io/pcd_io.h>
#include<pcl/kdtree/kdtree_flann.h>
#include<pcl/search/search.h>
#include<pcl/search/kdtree.h>
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile<pcl::PointXYZ>("结果216.pcd", *cloud);
pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
kdtree.setInputCloud(cloud);
std::vector<int> index;
std::vector<float> distance;
int k=10;
double r = 0.5;
kdtree.nearestKSearch(cloud->points[1], k, index, distance);
//kdtree.radiusSearch(cloud->points[1], r, index, distance);
if (k == index.size())
std::cerr << "k==index.size()" << std::endl;
std::cerr << ":KdTreeFLANN k近邻搜索结果:" << std::endl << "索引号: 查询点和近邻点距离的平方:" << std::endl;
for (int i = 0; i < k; ++i)
{
std::cerr << index[i]<<" "<<distance[i]<<std::endl;
}
//计算查询点和第二个点之间的距离的平方
double dis = /*std::sqrt*/(std::pow((cloud->points[1].x - cloud->points[2].x), 2) + std::pow((cloud->points[1].y - cloud->points[2].y), 2)
+ std::pow((cloud->points[1].z- cloud->points[2].z), 2));
std::cout << "dis1-2的平方:"<<dis<<std::endl; //可以发现,这里的dis和上面distance[1]结果一样,说明索引是按照距离排序的
//std::cerr << cloud->points.size() << std::endl;
pcl::search::KdTree<pcl::PointXYZ> ::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
tree->setInputCloud(cloud);
tree->nearestKSearch(cloud->points[1], k, index, distance);
tree->getSortedResults();
if (k == index.size())
std::cerr << "k==index.size()" << std::endl;
else
{
std::cerr << "k!=index.size()" << std::endl;
return -1;
}
std::cerr << "search::KdTree k近邻搜索结果:" << std::endl << "索引号: 查询点和近邻点距离的平方:" << std::endl;
for (int i = 0; i < k; ++i)
{
std::cerr << index[i] << " " << distance[i] << std::endl;
}