C++ 点云处理:遍历生成树边,查找特定点并构建新点云
for (const auto& edge : result) // 遍历所有生成树的边
{
pcl::PointXYZ p0 = cloud1->points[edge.src]; // 在点云cloud里面找到该索引对应的点值
pcl::PointXYZ p00 = cloud1->points[edge.tgt];
// 判断叶尖点与找到边两点是否相同,若相同则将该边加入yr点云指针,将该边加入容器yr1
if ((point56.x == p0.x) && (point56.y == p0.y) && (point56.z == p0.z)) // 如果p0点相同表示p0为叶尖点,将两点加入yr后,再找与叶尖相连的p00点的相连点,会重复加入点
{
yr->push_back(p00);
point56 = p00;
cout << 'p00(' << p00 << ')' << endl;
}
else if ((point56.x == p00.x) && (point56.y == p00.y) && (point56.z == p00.z)) // 如果p00点相同,将两点加入yr后,再找p0点的
{
yr->push_back(p0);
point56 = p0;
cout << 'p0(' << p0 << ')' << endl;
}
bool yes = true;
for (const auto& point9 : jie->points)
{
float x1 = point9.x;
float y1 = point9.y;
float z1 = point9.z;
//cout << point9 << endl;
if (x1 == point56.x && y1 == point56.y && z1 == point56.z)
{
std::cout << '点p与点云文件内的点相同' << std::endl;
yes = false;
break; // 停止比较
}
}
if (yes == false) // 注意:这里应该是比较运算符'=='而不是赋值运算符'='
{
cout << '触发' << endl;
break;
}
}
代码功能解析:
这段代码的功能是遍历一个表示生成树的边集 result。对于每条边,代码执行以下操作:
- 获取边的两个顶点: 从点云
cloud1中检索边的源点 (edge.src) 和目标点 (edge.tgt) 的坐标。 - 查找特定点: 检查边的顶点是否与
point56相匹配。如果匹配,则将匹配的顶点添加到名为yr的点云中,并将point56更新为匹配的顶点。 - 检查重复点: 遍历另一个点云
jie,检查point56是否已存在于该点云中。如果找到重复项,则停止遍历jie并设置一个标志 (yes)。 - 条件退出循环: 如果找到重复点 (
yes为false),则退出遍历边集result的循环。
需要注意的是:
- 代码中使用了 PCL 库来处理点云数据。
- 在判断
yes的值时,应该使用比较运算符==而不是赋值运算符=。
总而言之,这段代码展示了如何使用 C++ 和 PCL 库处理点云数据,包括遍历图的边、访问点坐标、比较点以及管理点云。
原文地址: https://www.cveoy.top/t/topic/fAI6 著作权归作者所有。请勿转载和采集!