K近邻搜索(K Nearest Neighbors)
- K近邻搜索是一种基于点数量的搜索方法,它会找到指定点附近最接近的K个邻居点。
- K近邻搜索中的K值是一个参数,您需要指定要搜索的邻居数量。
- 该方法适用于需要查找固定数量邻居点的情况,例如K最近邻分类器和最近邻插值等。
/// <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是搜索半径,指定了要搜索的邻居点的最大距离。
- 该方法适用于需要查找在一定距离范围内的邻居点的情况,例如密度估计和聚类等。
/// <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>();}
}
截取出兔子上半身