PCL 点云数据拟合垂直于 XZ 平面的红色中心线
#include\x20
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 著作权归作者所有。请勿转载和采集!