#include iostream#include pclioply_ioh#include pclpoint_typesh#include pclfeaturesnormal_3dh#include pclsurfacemlsh#include pclvisualizationpcl_visualizerhint main 输入文件路径 stdstring input_file = DDIA
在PCL 1.8.1中,pcl::Normal没有neighbors成员。pcl::Normal结构体只包含normal_x、normal_y和normal_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;
}
这样修改后,代码应该可以正确编译和运行
原文地址: https://www.cveoy.top/t/topic/hWeV 著作权归作者所有。请勿转载和采集!