https://blog.csdn.net/kissgoodbye2012/article/details/124361044
核心代码参考于该CSDN文章
单条直线检测
#include <pcl/sample_consensus/ransac.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
pcl::PointCloud<pcl::PointXYZ>::Ptr line2D(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_f2D(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr ptCloud2D(new pcl::PointCloud<pcl::PointXYZ>);
pcl::ModelCoefficients::Ptr coefficients3(new pcl::ModelCoefficients);
//inliers表示误差能容忍的点 记录点云的序号
pcl::PointIndices::Ptr inliers3(new pcl::PointIndices);
// 创建一个分割器
pcl::SACSegmentation<pcl::PointXYZ> seg;
// Optional
seg.setOptimizeCoefficients(true);
// Mandatory-设置目标几何形状
seg.setModelType(pcl::SACMODEL_LINE);//SACMODEL_LINE SACMODEL_PLANE注:在这里面修改模型名称
//分割方法:随机采样法
seg.setMethodType(pcl::SAC_RANSAC);//SAC_RANSAC
//最大的迭代的次数
seg.setMaxIterations(50);
//设置误差容忍范围
seg.setDistanceThreshold(0.0005);//注:填写具体数值
//输入点云
seg.setInputCloud(small_cloud);//输入点云
//分割点云
seg.segment(*inliers3, *coefficients3);
//获取点和删除点2D
pcl::ExtractIndices<pcl::PointXYZ> extract2;
extract2.setInputCloud(small_cloud);//输入点云
extract2.setIndices(inliers3);
extract2.setNegative(false);
extract2.filter(*line2D);//line2D本次分割出的2D线--
extract2.setNegative(true);
extract2.filter(*cloud_f2D);
*ptCloud2D = *cloud_f2D;//ptCloud2D本次剩余的点云--
pcl::visualization::PCLVisualizer viewer("view_all");
int v1(0);
int v2(1);
int v3(2);
viewer.createViewPort(0.0, 0.5, 1, 1, v1);
viewer.setBackgroundColor(0, 0, 0, v1);
viewer.createViewPort(0.0, 0.0, 0.5, 0.5, v2);
viewer.setBackgroundColor(0.5, 0.5, 0.5, v2);
viewer.createViewPort(0.5, 0.0, 1, 0.5 , v3);
viewer.setBackgroundColor(0, 0, 0, v3);
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZI> fildColor(first_cloud, "intensity");
viewer.addPointCloud(first_cloud, fildColor, "first_cloud", v1);
viewer.addText("first_cloud", 10, 10, "v1 text", v1);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_out_blue(line2D, 0, 0, 255); // 显示蓝色点云
viewer.addPointCloud(line2D, cloud_out_blue, "line2D", v2);
viewer.addText("line2D", 10, 10, "v2 text", v2);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_out_orage(ptCloud2D, 250, 128, 10); //显示橘色点云
viewer.addPointCloud(ptCloud2D, cloud_out_orage, "ptCloud2D", v3);
viewer.addText("ptCloud2D", 10, 10, "v3 text", v3);
该代码存在问题:目前只能检测出最为接近的一条直线
输入点云类型只能为XYZ类型,其余类型的点云都需要进行转换才可以使用。
后续优化方案:1.识别出多条直线