一、简介

在平面模型上构建凸(凹)多边形,首先从点云中提取平面模型,在通过该估计的平面模型系数从滤波后的点云投影一组点集形成点云,最后为投影后的点云计算其对应的二维凸(凹多边形)。

二、代码分析

1)构建直通滤波器,对点云进行滤波处理,提高后续的分割的效果,然后打印相关信息输出到标准输出设备上:

  reader.read ("table_scene_mug_stereo_textured.pcd", *cloud);//读取点云数据// Build a filter to remove spurious NaNspcl::PassThrough<pcl::PointXYZ> pass;pass.setInputCloud (cloud);//设置输入点云pass.setFilterFieldName ("z");//设置分割字段为z坐标pass.setFilterLimits (0, 1.1);//设置分割阈值范围为(0,1.1),将z轴方向超过该范围的点集过滤掉pass.filter (*cloud_filtered);std::cerr << "PointCloud after filtering has: "<< cloud_filtered->points.size () << " data points." << std::endl;

2)创建分割对象并设置一些参数,使用SACMODEL_PLANE模型来分割点云,用来估计出该模型系数的方法是SAC_RANSAC(随机抽样一致性算法),当调用seg.segment(*inliers, *coefficents)时,分割就执行了,将所有的内点存储到inliers成员中、将屏幕估计的平面模型系数(ax + by + cz = d)存储到coefficient成员中:

  pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);pcl::PointIndices::Ptr inliers (new pcl::PointIndices);//inliers指针存储点云分割后的结果// Create the segmentation objectpcl::SACSegmentation<pcl::PointXYZ> seg;//创建分割对象// Optionalseg.setOptimizeCoefficients (true);//设置优化系数,该参数是可选设置// Mandatoryseg.setModelType (pcl::SACMODEL_PLANE);//设置分割模型类型为SACMODEL_PLANE,本例中需要使用平面模型seg.setMethodType (pcl::SAC_RANSAC);//设置采样一致性估计方法模型为SAC_RANSCseg.setDistanceThreshold (0.01);//设置距离阈值为0.01,与孤寂平面模型的距离小于0.01m的点都为内点seg.setInputCloud (cloud_filtered);//设置输入点云为滤波后点云seg.segment (*inliers, *coefficients);//成员inliers、coefficientsstd::cerr << "PointCloud after segmentation has: "<< inliers->indices.size () << " inliers." << std::endl;

3)将上面得到的滤波后的点集投影到平面模型上,并存储投影后的点云数据到cloud_projected对象。创建cloud_projected有两种方法,其中一种方法是直接提取之前得到的内点集合,不过这个例子里我们打算用之前得到的coefficients参数,建立平面模型后按照coefficients参数对该投影对象进行设置,然后将cloud_filtered投射到coefficients参数确定的平面模型上,就可以产生投影后的点云cloud_projected:

  // Project the model inlierspcl::ProjectInliers<pcl::PointXYZ> proj;//点云投影滤波对象proj.setModelType (pcl::SACMODEL_PLANE);//设置投影模型为SACMODEL_PLANEproj.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;

4)执行ConcaveHull对象的创建和重建获取点云对应的凹多边形边界上的点:

  // Create a Concave Hull representation of the projected inlierspcl::PointCloud<pcl::PointXYZ>::Ptr cloud_hull (new pcl::PointCloud<pcl::PointXYZ>);pcl::ConcaveHull<pcl::PointXYZ> chull;//创建多边形提取对象chull.setInputCloud (cloud_projected);//设置输入点云为投影后的点云chull.setAlpha (0.1);//设置alpha的值为0.1chull.reconstruct (*cloud_hull);//重建提取创建凹多边形std::cerr << "Concave hull has: " << cloud_hull->points.size ()<< " data points." << std::endl;

5)整体代码:

#include <pcl/ModelCoefficients.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/filters/passthrough.h>
#include <pcl/filters/project_inliers.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/surface/concave_hull.h>int main(int argc, char** argv)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>), cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>), cloud_projected(new pcl::PointCloud<pcl::PointXYZ>);pcl::PCDReader reader;reader.read("table_scene_mug_stereo_textured.pcd", *cloud);pcl::PassThrough<pcl::PointXYZ> pass;                                      //进行直通滤波pass.setInputCloud(cloud);                                                  //输入滤波点云pass.setFilterFieldName("z");                                             //设置滤波字段pass.setFilterLimits(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);                      //设置内点指针pcl::SACSegmentation<pcl::PointXYZ> seg;                                  //根据模型参数完成滤波seg.setOptimizeCoefficients(true);                                          //设置优化系数,该参数是可选设置seg.setModelType(pcl::SACMODEL_PLANE);                                      //设置分割模型seg.setMethodType(pcl::SAC_RANSAC);                                         //设置分割方法为随机一致性seg.setDistanceThreshold(0.01);                                               //设置距离阈值0.01seg.setInputCloud(cloud_filtered);                                          //设置输入点云为过滤后的点云seg.segment(*inliers, *coefficients);                                        //根据模型参数分割内点std::cerr << "PointCloud after segmentation has " << inliers->indices.size() << " inliers." << std::endl;pcl::ProjectInliers<pcl::PointXYZ> proj;                                  //创建点云投影滤波对象proj.setModelType(pcl::SACMODEL_PLANE);                                     //设置投影模型为平面proj.setInputCloud(cloud_filtered);                                          //设置输入点云为滤波后的点云proj.setModelCoefficients(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);                                                     //设置alpha的值为0.1chull.reconstruct(*cloud_hull);                                              //重建提取创建凹多边形std::cerr << "Concave hull has: " << cloud_hull->points.size() << " data points." << std::endl;pcl::PCDWriter writer;writer.write("table_scene_mug_stereo_textured_hull.pcd", *cloud_hull, false);return(0);
}

三、编译结果

1)原始点云可视化结果:

2)重建后点云可视化结果:

PCL学习笔记(三十三)-- 在平面模型上构建凸(凹)多边形相关推荐

  1. PclSharp--在平面模型上构建凸(凹)多边形

    1.在平面模型上构建凸(凹)多边形,首先从点云中提取平面模型,在通过该估计的平面模型系数从滤波后的点云投影一组点集形成点云,最后为投影后的点云计算其对应的二维凸(凹多边形) 2.源码 using Pc ...

  2. PCL学习笔记01:在Ubuntu上安装PCL

    文章目录 一.PCL官网 二.在Ubuntu上安装PCL 三.PCL官网教程 四.溜达一圈PCL 五.PCL基本结构 (一)有组织的点云 (二)无组织的点云 六.测试PCL是否安装成功 (一)编写程序 ...

  3. ihtml2document能不能根据id获取dom_JavaScript学习笔记(十三)-- DOM(上)

    DOM(上) DOM(Document Object Model): 文档对象模型 其实就是操作 html 中的标签的一些能力 我们可以操作哪些内容 获取一个元素 移除一个元素 创建一个元素 向页面里 ...

  4. HTML5(李炎恢)学习笔记三 ------------- HTML5元素(上)

    一.文本元素 HTML5规范指出:使用元素应该完全从元素的语义出发.但是由于历史遗留及用户至上的原则,这种语义会宽松许多. 1.文本元素总汇 2.文本元素解析 1.<b>表示关键字和产品名 ...

  5. PCL学习笔记(二):PCL官方教程学习

    PCL学习笔记(二):PCL官方教程学习 PCD文件制作 Features 表面法线提取 Keypoints 提取NARF关键点 KdTree Range Image How to create a ...

  6. OpenCV学习笔记(十三):霍夫变换:HoughLines(),HoughLinesP(),HoughCircles( )

    OpenCV学习笔记(十三):霍夫变换:HoughLines(),HoughLinesP(),HoughCircles( ) 1.霍夫线变换HoughLines() OpenCV支持三种不同的霍夫线变 ...

  7. Spring Security技术栈学习笔记(十三)Spring Social集成第三方登录验证开发流程介绍

    开发第三方登录,我们必须首先要了解OAuth协议(本文所讲述的OAuth协议指的是OAuth2协议),本文首先简单介绍OAuth协议,然后基于Spring Social来阐述开发第三方登录需要做哪些准 ...

  8. Python学习笔记(十三):异常处理机制

    Python学习笔记(十三):异常处理机制 关于Python的异常处理机制 Python学习笔记(十三):异常处理机制 一.异常处理机制 常见异常类型 二.异常处理 try...except 异常类的 ...

  9. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

最新文章

  1. golang中的select详解
  2. python messagebox一定要指定父窗体吗,为什么要使用的MessageBox.show一个所有者窗口?...
  3. ORACLE AWR 和 ASH
  4. BCB6.0里没有TCppWebBrowser
  5. 使用代码自动打开ABAP Editor
  6. 漫游飞行_手机“飞行模式”为何没被淘汰?内行人坦言:其实是你不会用!
  7. 根据选择计算Mask值
  8. Linux学习笔记---记一次rootfs根文件系统下载时掉进的大坑
  9. MyBatis 批量插入(ExecutorType.BATCH)
  10. python负数错误异常类型_十七、深入Python异常处理
  11. 【首发】'k4' 宏病毒专杀 原创新型excel宏病毒专杀工具
  12. html怎么设置用户登录界面设计,html怎么做用户登录界面设计步骤,登录界面设计这样做?...
  13. NTL(Number Theory Library)源码剖析(2)__基本运算
  14. python实现图片压缩_python如何实现图片压缩
  15. ReentrantReadWriteLock、StampedLock
  16. Java EE结构理解 与Dao模式 no7.
  17. 工具及方法 - Excel插件XLTools
  18. Ubuntu下解决Make的:cc1plus: warnings being treated as errors
  19. JS上传文件(base64字符串和二进制文件流)
  20. Linux系统调用四、lseek()函数详解

热门文章

  1. ads-b无源定位,伪装目标检测笔记
  2. 5G反开3D-MIMO之负荷均衡优化
  3. Linux安装代理软件proxychains
  4. 【无为则无心Python基础】— 39、Python中函数的说明文档
  5. WEB开发中常见的漏洞
  6. Windows Store apps开发[79]Windows 8 开发31日-第21日-摄像头
  7. 20-微信小程序商城 下单页面的产品列表和留言(微信小程序商城开发、小程序毕业设计、小程序源代码)(黄菊华-微信小程序开发教程)
  8. LWN:从KVM直接进行host系统调用!
  9. nodejs的下载安装及环境配置及常见问题--react学习必备--nodejs重新安装前的必要卸载
  10. how2heap的fastbin_dup_consolidate(包含sleepyholder)