PCL学习:快速领域搜索kd-tree

#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/io/pcd_io.h>
#include <vector>
#include <cmath>
#include <ctime>
int main()
{
	srand(time(NULL));
	pcl::PointCloud<pcl::PointXYZ>::Ptr my_cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::io::loadPCDFile<pcl::PointXYZ> ("E:\\vs_code\\rabbit.pcd", *my_cloud);
	pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
	kdtree.setInputCloud(my_cloud);
	pcl::PointXYZ min;
	pcl::PointXYZ max;
	pcl::PointXYZ searchPoint;
	pcl::getMinMax3D(*my_cloud,min,max);
	searchPoint.x = (min.x +max.x)/2;
	searchPoint.y = (min.y +max.y)/2;
	searchPoint.z = (min.x +max.z)/2;
	//利用getMinMax函数得到点云的边界范围,作为搜寻点
	std::cout<<searchPoint.x<<" "<<searchPoint.y<<" "<<searchPoint.z<<std::endl;
	int K = 10;
	//pointId用于存储点索引
	std::vector<int> pointId(K);
	//pointSquareDistance存储最近点距离的平方
	std::vector<float> pointSquareDistance(K);
	if(kdtree.nearestKSearch(searchPoint,K,pointId,pointSquareDistance)>0)
	{
		for(size_t i=0;i<pointId.size();++i)
			std::cout<<my_cloud->points[ pointId[i]].x
				<<" "<<my_cloud->points[ pointId[i]].y
				<<" "<<my_cloud->points[ pointId[i]].z
				<<" .the SquareDistance is "<<pointSquareDistance[i]<<std::endl;
	}
	//半径范围内搜索
	double r = 0.01;
	if(kdtree.radiusSearch(searchPoint,r,pointId,pointSquareDistance)>0)
	{
		for(size_t i=0;i<pointId.size();++i)
			std::cout<<my_cloud->points[ pointId[i]].x
			<<" "<<my_cloud->points[ pointId[i]].y
			<<" "<<my_cloud->points[ pointId[i]].z
			<<" .the SquareDistance is "<<pointSquareDistance[i]<<std::endl;
	}
	system("pause");
	return 0 ;
}

为了在VS2010上写起来更方便一些,顺手安装了一个VAssist,就不用每个都自己ctrl+j来提示了
最后输出的结果:
在这里插入图片描述
主要是两个函数

kdtree.nearestKSearch(searchPoint,K,pointId,pointSquareDistance
kdtree.radiusSearch(searchPoint,r,pointId,pointSquareDistance)

懒得解释了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值