PCL 点云骨架提取算法:最小生成树实现
// 生成骨架点云的函数
void generateSkeleton(pcl::PointCloudpcl::PointXYZ::Ptr cloud, pcl::PointCloudpcl::PointXYZ::Ptr skeleton)
{
// 创建一个图
int n = cloud->size(); // 点云中点的数量
std::vector
// 对边按权重进行排序
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]); // 将目标节点加入骨架点云中
}
}
}
原文地址: https://www.cveoy.top/t/topic/nRIn 著作权归作者所有。请勿转载和采集!