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

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

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

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

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

// 获取索引号为61的点的坐标
pcl::PointXYZ center_point = cloud->points[61];

// 创建红色中心线的点云
pcl::PointCloud<pcl::PointXYZ>::Ptr center_line(new pcl::PointCloud<pcl::PointXYZ>);
center_line->points.resize(2);
center_line->points[0].x = center_point.x;
center_line->points[0].y = center_point.y;
center_line->points[0].z = center_point.z - 1.0; // 垂直方向上的线
center_line->points[1].x = center_point.x;
center_line->points[1].y = center_point.y;
center_line->points[1].z = center_point.z + 1.0; // 垂直方向上的线

// 可视化结果
pcl::visualization::PCLVisualizer viewer("3D Viewer");
viewer.setBackgroundColor(0, 0, 0);
viewer.addPointCloud<pcl::PointXYZ>(cloud, "cloud");
viewer.addPointCloud<pcl::PointXYZ>(line, "line");
viewer.addPointCloud<pcl::PointXYZ>(center_line, "center_line");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cloud");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 1, "line");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0, 0, "center_line");
viewer.addCoordinateSystem(1.0);
viewer.initCameraParameters();
viewer.spin();

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

return 0;

}

PCL 点云处理:拟合中心线并可视化

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

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