pcl 直线检测 代码实现 -完整代码

该代码示例展示了如何利用PCL库中的RANSAC算法进行单条直线检测。通过SACSegmentation类,设置模型类型为直线,对输入的XYZ点云数据进行分割,找出最接近的直线并将其从原始点云中提取出来。同时,代码还显示了检测到的直线和剩余点云。存在的问题是只能检测一条直线且输入点云需为XYZ类型。优化方案包括识别多条直线。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.识别出多条直线

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值