平面模型上提取凸凹多边形------pcl

发布于:2024-05-05 ⋅ 阅读:(34) ⋅ 点赞:(0)

平面模型上提取凸凹多边形

pcl::PointCloud<pcl::PointXYZ>::Ptr PclTool::ExtractConvexConcavePolygons(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_projected(new pcl::PointCloud<pcl::PointXYZ>);

      // 建立过滤器消除杂散的NaN
    pcl::PassThrough<pcl::PointXYZ> pass;
    pass.setInputCloud(cloud);     // 设置输入点云
    pass.setFilterFieldName("z");  // 设置分割字段为z坐标
    pass.setFilterLimits(0, 1.1);  // 设置分割阀值为(0, 1.1)
    pass.filter(*cloud_filtered);
    std::cerr << "PointCloud after filtering has: " << cloud_filtered->points.size() << " data points." << std::endl;


      // 分割
    pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
    pcl::PointIndices::Ptr inliers(new pcl::PointIndices);  // inliers存储分割后的点云
    // 创建分割对象
    pcl::SACSegmentation<pcl::PointXYZ> seg;
    // 设置优化系数,该参数为可选参数
    seg.setOptimizeCoefficients(true);
    // Mandatory
    seg.setModelType(pcl::SACMODEL_PLANE);
    seg.setMethodType(pcl::SAC_RANSAC);
    seg.setDistanceThreshold(0.01);

    seg.setInputCloud(cloud_filtered);
    seg.segment(*inliers, *coefficients);
    std::cerr << "PointCloud after segmentation has: " << inliers->indices.size() << " inliers." << std::endl;

    // Project the model inliers点云投影滤波模型
    pcl::ProjectInliers<pcl::PointXYZ> proj;  // 点云投影滤波模型
    proj.setModelType(pcl::SACMODEL_PLANE);   // 设置投影模型
    proj.setIndices(inliers);
    proj.setInputCloud(cloud_filtered);
    proj.setModelCoefficients(coefficients);  // 将估计得到的平面coefficients参数设置为投影平面模型系数
    proj.filter(*cloud_projected);            // 得到投影后的点云
    std::cerr << "PointCloud after projection has: " << cloud_projected->points.size() << " data points." << std::endl;

    // 存储提取多边形上的点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_hull(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::ConcaveHull<pcl::PointXYZ> chull;  // 创建多边形提取对象
    chull.setInputCloud(cloud_projected);   // 设置输入点云为提取后点云
    chull.setAlpha(0.1);
    chull.reconstruct(*cloud_hull);  // 创建提取创建凹多边形

    std::cerr << "Concave hull has: " << cloud_hull->points.size() << " data points." << std::endl;
    
    return cloud_hull;
}

传入的原始点云数据
在这里插入图片描述

先对原始点云做一个制动滤波仅保留红色方框中的数据
然后再提取多边形,得到结果
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到