该函数的功能是将输入点云'cloud'进行骨架化处理,输出结果保存在输出点云'skeleton'中。

具体实现步骤如下:

  1. 创建一个图,其中图的每个节点对应输入点云'cloud'中的一个点,图的每条边对应任意两个点之间的距离。

  2. 对边按照权重(即边的距离)进行排序。

  3. 创建一个并查集,每个节点的父节点初始值为自身。

  4. 依次加入边,构建最小生成树。对于每一条边,找出其两个端点所在的并查集的根节点,如果两个节点的根节点不同,则将这两个节点合并到同一个并查集中,并将这两个节点对应的点加入到输出点云'skeleton'中。

  5. 最终得到的输出点云'skeleton'即为输入点云'cloud'的骨架化结果。

void generateSkeleton(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr skeleton) //参数为输入点云cloud和输出点云skeleton
{
	// 创建一个图
	int n = cloud->size();
	std::vector<Edge> edges;   //创建边容器
	for (int i = 0; i < n; i++)   
	{
		for (int j = i + 1; j < n; j++)
		{
			float distance = pcl::euclideanDistance((*cloud)[i], (*cloud)[j]);
			edges.push_back(Edge(i, j, distance));
		}
	}

	// 对边按权重进行排序
	std::sort(edges.begin(), edges.end(), compareEdges);

	// 创建一个并查集
	std::vector<int> parent(n);
	for (int i = 0; i < n; i++)
	{
		parent[i] = i;
	}

	// 依次加入边,构建最小生成树
	for (int i = 0; i < edges.size(); i++) 
	{
		int src = edges[i].src;
		int dst = edges[i].dst;
		int srcParent = findParent(parent, src);
		int dstParent = findParent(parent, dst);
		if (srcParent != dstParent) 
		{
			parent[srcParent] = dstParent;
			skeleton->push_back((*cloud)[src]);
			skeleton->push_back((*cloud)[dst]);
		}
	}
}
PCL 点云骨架化算法详解:使用最小生成树提取点云骨架

原文地址: https://www.cveoy.top/t/topic/nTw6 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录