给下列代码添加注释void generateSkeletonpclPointCloudpclPointXYZPtr cloud pclPointCloudpclPointXYZPtr skeleton 参数为输入点云cloud和输出点云skeleton 创建一个图 int n = cloud-size; stdvectorEdge edges; 创建边容器 for int i = 0; i
/**
-
@brief 生成输入点云的最小生成树
-
@param cloud 输入点云
-
@param skeleton 输出点云,为输入点云的最小生成树 */ 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
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); // 查找src点的祖先节点 int dstParent = findParent(parent, dst); // 查找dst点的祖先节点 if (srcParent != dstParent) // 如果src和dst不在同一个连通块中 { parent[srcParent] = dstParent; // 将src的祖先节点的父节点设置为dst的祖先节点 skeleton->push_back((*cloud)[src]); // 将src点加入输出点云 skeleton->push_back((*cloud)[dst]); // 将dst点加入输出点云 } }
原文地址: https://www.cveoy.top/t/topic/eB4c 著作权归作者所有。请勿转载和采集!