在PCL 1.8.1中,pcl::Normal没有neighbors成员。pcl::Normal结构体只包含normal_xnormal_ynormal_z三个成员,用于存储法线向量的三个分量。

如果你想获取点的邻居索引,可以使用 pcl::search::KdTree 类来构建一个KD树,并使用其 nearestKSearch 函数来获取最近的K个点的索引。下面是修改后的代码:

#include <iostream>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/surface/mls.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/search/kdtree.h>

int main() {
    // 输入文件路径
    std::string input_file = "D:\\DIANYUNWENJIANJIA\\kruskal_ply.ply";
    // 输出文件路径
    std::string output_file = "D:\\DIANYUNWENJIANJIA\\gujiaxiujianhejiedianfenlei_ply.ply";

    // 加载点云数据
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPLYFile(input_file, *cloud) == -1) {
        std::cerr << "Failed to load input file!" << std::endl;
        return -1;
    }

    // 使用MLS平滑估计法计算法线
    pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
    pcl::MovingLeastSquares<pcl::PointXYZ, pcl::Normal> mls;
    mls.setComputeNormals(true);
    mls.setInputCloud(cloud);
    mls.setPolynomialFit(true);
    mls.setSearchMethod(tree);
    mls.setSearchRadius(0.03);
    mls.process(*normals);

    // 骨架修建和节点分类
    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;
        std::vector<float> k_distances;
        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 (normals->points[i].curvature < normals->points[neighbor_index].curvature) {
                neighbor_count++;
            }
        }

        if (neighbor_count >= alpha) {
            labels[i] = 2;  // 结点
            skeleton->push_back(cloud->points[i]);
        }
        else if (neighbor_count == 1) {
            labels[i] = 0;  // 叶尖
        }
        else if (neighbor_count == 2) {
            labels[i] = 1;  // 内部节点
        }
    }

    // 保存输出点云数据
    pcl::PLYWriter writer;
    writer.write(output_file, *skeleton);

    return 0;
}

这样修改后,代码应该可以正确编译和运行

#include iostream#include pclioply_ioh#include pclpoint_typesh#include pclfeaturesnormal_3dh#include pclsurfacemlsh#include pclvisualizationpcl_visualizerhint main 	 输入文件路径	stdstring input_file = DDIA

原文地址: https://www.cveoy.top/t/topic/hWeV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录