KDTree索引(K近邻搜索,半径R内近邻搜索)——PCL

K近邻搜索(K Nearest Neighbors)

  • K近邻搜索是一种基于点数量的搜索方法,它会找到指定点附近最接近的K个邻居点。
  • K近邻搜索中的K值是一个参数,您需要指定要搜索的邻居数量。
  • 该方法适用于需要查找固定数量邻居点的情况,例如K最近邻分类器和最近邻插值等。
cpp 复制代码
	/// <summary>
	/// kdtree的k近邻索引
	/// </summary>
	/// <param name="cloud">需要所有的点云</param>
	/// <param name="searchPoint">需要索引的点</param>
	/// <param name="k">索引的个数</param>
	/// <returns>返回索引出点的编号数组</returns>
std::vector<int> PclTool::kdtreeKSearch(const pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, const pcl::PointXYZ searchPoint, const unsigned int k)
{
    // 创建KdTreeFLANN对象,并把创建的点云设置为输入,searchPoint变量作为查询点
    pcl::KdTreeFLANN<pcl::PointXYZ> kdtree; 
    // 设置搜索空间
    kdtree.setInputCloud(cloud);
    std::vector<int> pointIdxNKNSearch(k);          // 存储查询点近邻索引
    std::vector<float> pointNKNSquaredDistance(k);  // 存储近邻点对应距离平方

	  // 打印相关信息
    std::cout << "K nearest neighbor search at (" << searchPoint.x << " " << searchPoint.y << " " << searchPoint.z << ") with K=" << k << std::endl;

	if (kdtree.nearestKSearch(searchPoint, k, pointIdxNKNSearch, pointNKNSquaredDistance) > 0)  // 执行K近邻搜索
    {
        return pointIdxNKNSearch;
		 打印所有近邻坐标
		//for (size_t i = 0; i < pointIdxNKNSearch.size(); ++i)
		//{
		//	std::cout << "    " << cloud->points[pointIdxNKNSearch[i]].x << " " << cloud->points[pointIdxNKNSearch[i]].y << " " << cloud->points[pointIdxNKNSearch[i]].z << " (squared distance: " << pointNKNSquaredDistance[i] << ")" << std::endl;
		//}
    }
	else
	{
        return std::vector<int>();
	}
}

截取出兔子耳朵的部分

半径R内近邻搜索(Radius Neighbors):

  • 半径R内近邻搜索是一种基于距离阈值的搜索方法,它会找到距离指定点在半径R范围内的所有邻居点。
  • R是搜索半径,指定了要搜索的邻居点的最大距离。
  • 该方法适用于需要查找在一定距离范围内的邻居点的情况,例如密度估计和聚类等。
cpp 复制代码
    /// <summary>
    /// kdtree的半径近邻索引
    /// </summary>
    /// <param name="cloud">需要所有的点云</param>
    /// <param name="searchPoint">需要索引的点</param>
    /// <param name="radius">索引半径</param>
    /// <returns>返回索引出点的编号数组</returns>
    static std::vector<int> kdtreeRadiusSearch(const pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, const pcl::PointXYZ searchPoint, const float radius)
    {
    // 创建KdTreeFLANN对象,并把创建的点云设置为输入,searchPoint变量作为查询点
    pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
    kdtree.setInputCloud(cloud);

    std::vector<int> pointIdxRadiusSearch;          // 存储近邻索引
    std::vector<float> pointRadiusSquaredDistance;  // 存储近邻对应距离的平方

    if (kdtree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0)  // 执行半径R内近邻搜索方法
    {
        return pointIdxRadiusSearch;
    }
    else
    {
        return std::vector<int>();
    }
}

截取出兔子上半身

相关推荐
这张生成的图像能检测吗16 天前
(论文速读)IPFP:把图像特征反投影到 3D,用单分支完成多模态训练
人工智能·计算机视觉·点云·多模态融合·3d技术·三维感知·2d相机
feasibility.17 天前
一个生成接口统一计算机视觉:SenseNova-Vision 硬核解剖
人工智能·深度学习·目标检测·计算机视觉·图像分割·点云·cv
这张生成的图像能检测吗18 天前
(论文速读)Cylinder3D:面向室外 LiDAR 分割的柱面划分与非对称 3D 卷积
计算机视觉·点云·3d视觉·三维感知
这张生成的图像能检测吗19 天前
(论文速读)SphereFormer:用径向窗口解决 LiDAR 远距离稀疏点的信息断连
计算机视觉·点云·3d技术·三维感知
冰合试剂科普1 个月前
PCL┃聚己内酯┃Polycaprolactone┃生物可降解聚酯材料┃高分子科研试剂┃冰合试剂分享
pcl
zh路西法2 个月前
【3D SLAM源码解读系列】(二)Small_gicp——5 个积木搭出最优点云配准
c++·pcl·icp·fastgicp·smallgicp·gicp
丶玉面小蛟龙2 个月前
DGCNN网络学习
学习·点云·dgcnn
bryant_meng2 个月前
【Point Cloud】Point Cloud Fundamentals(1)
计算机视觉·点云·点云配准·点云分割·点云检测·点云特征提取
Robot_Nav3 个月前
ROG-Map 技术解析:面向大场景高分辨率激光雷达运动规划的机器人中心占据栅格地图
点云·rog-map·占据栅格地图
暂未成功人士!4 个月前
点云处理的关键技术流程和常用算法
ros·pcl·点云处理·点云去噪滤波