PCL 点云骨架化算法详解:使用最小生成树提取点云骨架
该函数的功能是将输入点云'cloud'进行骨架化处理,输出结果保存在输出点云'skeleton'中。
具体实现步骤如下:
-
创建一个图,其中图的每个节点对应输入点云'cloud'中的一个点,图的每条边对应任意两个点之间的距离。
-
对边按照权重(即边的距离)进行排序。
-
创建一个并查集,每个节点的父节点初始值为自身。
-
依次加入边,构建最小生成树。对于每一条边,找出其两个端点所在的并查集的根节点,如果两个节点的根节点不同,则将这两个节点合并到同一个并查集中,并将这两个节点对应的点加入到输出点云'skeleton'中。
-
最终得到的输出点云'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]);
}
}
}
原文地址: https://www.cveoy.top/t/topic/nTw6 著作权归作者所有。请勿转载和采集!