#include iostream#include pclioply_ioh#include pclpoint_typesh#include pclpoint_cloudh#include pclfeaturesnormal_3dh#include pclfiltersvoxel_gridh#include pclsurfacemlsh#include pclfeaturesprincipal_c
#include
int main() { // 获取可用线程数量 int num_threads = pcl::getNumThreads(); std::cout << "Available threads: " << num_threads << std::endl;
// 确保传递给线程数量的参数是一个正数
if (num_threads <= 0) {
num_threads = 1;
}
// 设置线程数量
pcl::setNumThreads(num_threads);
// 加载点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPLYFile<pcl::PointXYZ>("D:\\DIANYUNWENJIANJIA\\qiepianfenge_ply.ply", *cloud);
/* 下采样
pcl::VoxelGrid<pcl::PointXYZ> sor;
sor.setInputCloud(cloud);
sor.setLeafSize(0.01f, 0.01f, 0.01f);
sor.filter(*cloud);
*/
// 计算法线
pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> ne;
ne.setInputCloud(cloud);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
ne.setSearchMethod(tree);
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);
ne.setRadiusSearch(0.03);
ne.compute(*cloud_normals);
// 计算主曲率
pcl::PrincipalCurvaturesEstimation<pcl::PointXYZ, pcl::Normal, pcl::PrincipalCurvatures> pc;
pc.setInputCloud(cloud);
pc.setInputNormals(cloud_normals);
pc.setSearchMethod(tree);
pcl::PointCloud<pcl::PrincipalCurvatures>::Ptr cloud_curvatures(new pcl::PointCloud<pcl::PrincipalCurvatures>);
pc.setRadiusSearch(0.03);
pc.compute(*cloud_curvatures);
// 构建骨架点云
pcl::PointCloud<pcl::PointXYZ>::Ptr skeleton(new pcl::PointCloud<pcl::PointXYZ>);
for (int i = 0; i < cloud->size(); ++i) {
if (cloud_curvatures->points[i].pc1 <= 0.01) {
skeleton->points.push_back(cloud->points[i]);
}
}
skeleton->width = skeleton->size();
skeleton->height = 1;
// 保存骨架点云
pcl::PLYWriter writer;
writer.write<pcl::PointXYZ>("D:\\DIANYUNWENJIANJIA\\chushigujiahua_ply.ply", *skeleton);
return 0;
原文地址: https://www.cveoy.top/t/topic/hON0 著作权归作者所有。请勿转载和采集!