3.半径范围内查询

本文介绍了如何在C++中使用PCL库进行点云数据的半径搜索和K近邻查询,包括构建Kd-tree,执行搜索操作,并通过pcl::visualization::PCLVisualizer进行可视化。
摘要由CSDN通过智能技术生成

目录

1.半径搜索

2.代码

1.半径搜索

         Kd-tree搜索方式有两种基本的方式:一种是范围查询(range searches),另一种是K近邻查询(K-neighbor searches)。 K近邻查询是给定查询点及正整数K,从数据集中找到距离查询点最近的K个数据,当K=1时,就是最近邻查询(nearest neighbor searches)。范围查询就是给定查询点和查询距离的阈值,从数据集中找出所有与查询点距离小于阈值的数据;

2.代码

#include <iostream>
#include <vector>

#include <pcl/io/pcd_io.h> 
#include <pcl/point_types.h> 
#include <pcl/kdtree/kdtree_flann.h>  //kdtree
#include <pcl/visualization/pcl_visualizer.h>//可视化
#include <boost/thread/thread.hpp>
using namespace std;

int main()
{
	//读取点云数据
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
	if (pcl::io::loadPCDFile<pcl::PointXYZRGB>("bunny.pcd", *cloud) == -1)
	{
		PCL_ERROR("Cloudn't load pointCloud file!");
		return -1;
	}

	//建立kd-tree
	pcl::KdTreeFLANN<pcl::PointXYZRGB> kdtree;  //建立kdtree对象
	kdtree.setInputCloud(cloud); //设置输入的点云

	//K近邻搜索
	pcl::PointXYZRGB searchPoint = cloud->points[0]; //设置查找点
	cloud->points[0].r = 0;//查询点着色(蓝色)
	cloud->points[0].g = 0;
	cloud->points[0].b = 255;
	float radius = 0.01;  //设置需要查找半径
	vector<int> pointIdxRadiusSearch;  //近邻点的索引
	vector<float> pointRadiusSquaredDistance; //保存每个近邻点与查找点之间的欧式距离平方


	if (kdtree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0)
	{
		cout << pointIdxRadiusSearch.size() << endl;
		for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i) {
			cloud->points[pointIdxRadiusSearch[i]].r = 255;//近邻点着色为粉红色
			cloud->points[pointIdxRadiusSearch[i]].g = 0;
			cloud->points[pointIdxRadiusSearch[i]].b = 255;
		}
	}
	//可视化
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
	pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
	viewer->addPointCloud<pcl::PointXYZRGB>(cloud, "cloud");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud"); // 设置点云大小
	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(10000));
	}

	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别叭叭儿—好好学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值