#include\x20 #include\x20<pcl/io/ply_io.h> #include\x20<pcl/point_types.h> #include\x20<pcl/ModelCoefficients.h> #include\x20<pcl/filters/extract_indices.h> #include\x20<pcl/filters/voxel_grid.h> #include\x20<pcl/features/normal_3d.h> #include\x20<pcl/sample_consensus/method_types.h> #include\x20<pcl/sample_consensus/model_types.h> #include\x20<pcl/segmentation/sac_segmentation.h> #include\x20<pcl/visualization/pcl_visualizer.h>

int\x20main() { //\x20读取点云数据 pcl::PointCloudpcl::PointXYZ::Ptr\x20cloud(new\x20pcl::PointCloudpcl::PointXYZ); pcl::PLYReader\x20reader; reader.read("D:\DIANYUNWENJIANJIA\newkruskal2_ply.ply",\x20*cloud);

//\x20创建霍夫变换对象
pcl::ModelCoefficients::Ptr\x20coefficients(new\x20pcl::ModelCoefficients);
pcl::PointIndices::Ptr\x20inliers(new\x20pcl::PointIndices);
pcl::SACSegmentation<pcl::PointXYZ>\x20seg;
seg.setOptimizeCoefficients(true);
seg.setModelType(pcl::SACMODEL_LINE);
seg.setMethodType(pcl::SAC_RANSAC);
seg.setMaxIterations(1000);
seg.setDistanceThreshold(0.04);

//\x20设置垂直于xz平面的方向向量
coefficients->values.resize(6);
coefficients->values[3]\x20=\x200;\x20//\x20x方向
coefficients->values[4]\x20=\x201;\x20//\x20y方向
coefficients->values[5]\x20=\x200;\x20//\x20z方向

//\x20执行霍夫变换
seg.setInputCloud(cloud);
seg.segment(*inliers,\x20*coefficients);

//\x20提取直线内点
pcl::ExtractIndices<pcl::PointXYZ>\x20extract;
extract.setInputCloud(cloud);
extract.setIndices(inliers);
extract.setNegative(false);
pcl::PointCloud<pcl::PointXYZ>::Ptr\x20line(new\x20pcl::PointCloud<pcl::PointXYZ>);
extract.filter(*line);

//\x20可视化结果
pcl::visualization::PCLVisualizer\x20viewer("3D\x20Viewer");
viewer.setBackgroundColor(0,\x200,\x200);
viewer.addPointCloud<pcl::PointXYZ>(cloud,\x20"cloud");
viewer.addPointCloud<pcl::PointXYZ>(line,\x20"line");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,\x201,\x20"cloud");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR,\x201,\x200,\x200,\x20"line");\x20//\x20设置线的颜色为红色
viewer.addCoordinateSystem(1.0);
viewer.initCameraParameters();
viewer.spin();

//\x20保存结果
pcl::PLYWriter\x20writer;
writer.write("D:\\DIANYUNWENJIANJIA\\拟合中心线_ply.ply",\x20*line);

return\x200;

}


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

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