// 生成骨架点云的函数 void generateSkeleton(pcl::PointCloudpcl::PointXYZ::Ptr cloud, pcl::PointCloudpcl::PointXYZ::Ptr skeleton) { // 创建一个图 int n = cloud->size(); // 点云中点的数量 std::vector 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); // 创建一个大小为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/nRIn 著作权归作者所有。请勿转载和采集!

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