阈值α float alpha = 30; 骨架修减和节点分类 pclPointCloudpclPointXYZPtr skeletonnew pclPointCloudpclPointXYZ; stdvectorint labelscloud-size -1; for size_t i = 0; i cloud-size; i++ int neighbor_count = 0; std
可以根据您的要求进行修改。请参考以下修改后的代码:
// 阈值α
float alpha = 3.0;
// 骨架修减和节点分类
pcl::PointCloud<pcl::PointXYZ>::Ptr skeleton(new pcl::PointCloud<pcl::PointXYZ>);
std::vector<int> labels(cloud->size(), -1);
for (size_t i = 0; i < cloud->size(); i++) {
int neighbor_count = 0;
std::vector<int> k_indices(5);
std::vector<float> k_distances(5);
tree->nearestKSearch(cloud->points[i], 5, k_indices, k_distances);
for (int j = 0; j < k_indices.size(); j++) {
int neighbor_index = k_indices[j];
if (cloud->points[i].y < cloud->points[neighbor_index].y) {
neighbor_count++;
}
}
if (neighbor_count < alpha) {
labels[i] = 3; // 将该点标记为丢弃的分支
}
else if (neighbor_count == 1) {
labels[i] = 0; // 叶尖
}
else if (neighbor_count == 2) {
labels[i] = 1; // 内部节点
}
else if (neighbor_count >= 3) {
if (neighbor_count < alpha) {
labels[i] = 3; // 如果分支包含的节点数量少于α,则将其作为分支丢弃
}
else {
labels[i] = 2; // 结点
skeleton->push_back(cloud->points[i]);
}
}
}
// 保存输出点云数据
std::string output_file = "D:\\DIANYUNWENJIANJIA\\gujiaxiujianhejiedianfenlei_ply.ply";
pcl::PointCloud<pcl::PointXYZRGB> colored_cloud;
colored_cloud.width = cloud->size();
colored_cloud.height = 1;
colored_cloud.is_dense = false;
colored_cloud.points.resize(colored_cloud.width * colored_cloud.height);
for (size_t i = 0; i < colored_cloud.points.size(); i++) {
colored_cloud.points[i].x = cloud->points[i].x;
colored_cloud.points[i].y = cloud->points[i].y;
colored_cloud.points[i].z = cloud->points[i].z;
if (labels[i] == 0) {
colored_cloud.points[i].r = 255;
colored_cloud.points[i].g = 0;
colored_cloud.points[i].b = 0;
}
else if (labels[i] == 1) {
colored_cloud.points[i].r = 255;
colored_cloud.points[i].g = 255;
colored_cloud.points[i].b = 255;
}
else if (labels[i] == 2) {
colored_cloud.points[i].r = 0;
colored_cloud.points[i].g = 255;
colored_cloud.points[i].b = 0;
}
else if (labels[i] == 3) {
colored_cloud.points[i].r = 0;
colored_cloud.points[i].g = 0;
colored_cloud.points[i].b = 255;
}
}
pcl::io::savePLYFile(output_file, colored_cloud);
// 可视化点云数据
pcl::visualization::PCLVisualizer viewer("Point Cloud Viewer");
viewer.setBackgroundColor(0, 0, 0);
viewer.addPointCloud<pcl::PointXYZRGB>(colored_cloud.makeShared(), "colored_cloud");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "colored_cloud");
viewer.spin();
// 输出信息
std::cout << "骨架修减和节点分类已完成,结果保存在文件:" << output_file << std::endl;
return 0;
这样修改后的代码会先判断分支中包含的节点数量是否小于阈值α,如果是则将其标记为丢弃的分支。然后再根据节点分类的条件进行分类
原文地址: https://www.cveoy.top/t/topic/hXF3 著作权归作者所有。请勿转载和采集!