PCL中kdtree心得

40 篇文章 0 订阅
25 篇文章 17 订阅

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;
	}
	

在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值