当前位置: 首页 > news >正文

【点云surface】 凹包重构

1 处理过程可视化 

原始数据

直通滤波过滤后

pcl::ProjectInliers结果

pcl::ExtractIndices结果

凹包结果

 

凸包结果

2 处理过程分析:

原始点云 ---> 直通滤波 --> pcl::SACSegmentation分割出平面 -->pcl::ProjectInliers投影 --> pcl::ConcaveHull凹包重构

2.1 有一个步骤可以被替换

pcl::ProjectInliers这步骤是将直通滤波过滤得到的结果,全部投影到pcl::SACSegmentation分割到的平面上。这一步可以用pcl::ExtractIndices代替,其直接提取属于平面的点云。替换后不影响后面的凹包重构结果

2.2 凹包与凸包的区别

凹包是最小外接,凸包是最大外接,详情可以看下面这篇博客

PCL计算ConvexHull凸包、ConcaveHull凹包_pcl::concavehull_com1098247427的博客-CSDN博客

3 凹包参数探究

该算法中有许多参数可设置:

  • setAlpha(double alpha):设置凹凸包计算的精细程度。alpha参数控制了计算凹凸包时使用的半径大小。较小的alpha值会产生更精细的凹凸包,而较大的alpha值会产生更粗糙的凹凸包。

  • setDimension(int dim):设置凹凸包计算的维度。dim参数指定了计算凹凸包的维度。默认值为3,表示计算三维凹凸包。如果输入点云是二维的,则可以将dim设置为2。

  • setKeepInformation(bool keep):设置是否保留输入点云的信息。如果将keep参数设置为true,则计算的凹凸包点云将保留输入点云的法线和曲率信息。如果设置为false,则不保留这些信息。

  • setAlphaMultiplier(double multiplier):设置alpha参数的乘数因子。multiplier参数用于调整alpha参数的值。默认值为1.0,表示使用alpha参数的原始值。

通常只需手动设置alpha参数,其控制了计算凹凸包时使用的半径大小。较小的alpha值会产生更精细的凹凸包,而较大的alpha值会产生更粗糙的凹凸包。

将alpha参数设置为0.01,得到:

4 代码

#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>
#include <pcl/visualization/cloud_viewer.h>#include <pcl/surface/convex_hull.h>
#include <pcl/filters/extract_indices.h>int main()
{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("/home/lrj/work/pointCloudData/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->size() << " data points.\n";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);seg.setInputCloud(cloud_filtered);seg.segment(*inliers, *coefficients);std::cerr << "PointCloud after segmentation has: "<< inliers->indices.size() << " inliers.\n";// 将点云投影到拟合的平面上
//    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->size() << " data points.\n" << std::endl;// 直接提取属于平面点云pcl::ExtractIndices<pcl::PointXYZ> extract;extract.setInputCloud(cloud_filtered);extract.setIndices(inliers);extract.setNegative(false);extract.filter(*cloud_projected);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->size()<< " data points.\n" << std::endl;pcl::visualization::CloudViewer vis("cloud visualization");vis.showCloud(cloud_hull);while(!vis.wasStopped()){}}

相关文章:

  • seccomp学习 (3)
  • Navicat 技术指引 | 适用于 GaussDB 的备份与还原功能
  • CDA一级备考思维导图
  • 解密人工智能:线性回归 | 逻辑回归 | SVM
  • Kafka-Consumer
  • hdlbits系列verilog解答(exams/m2014_q4i)-45
  • 大模型训练效率提升至2.6倍,腾讯Angel机器学习框架升级
  • ElasticSearch之配置
  • 怎样提升伦敦银买卖技巧?
  • webshell之内置函数免杀
  • 大数据面试大厂真题【附答案详细解析】
  • 03 图优化
  • C#,《小白学程序》第十一课:双向链表(Linked-List)其二,链表的插入与删除的方法(函数)与代码
  • Drools Rule Language 学习笔记
  • 小程序和Vue写法的区别主要有什么不同
  • 分享的文章《人生如棋》
  • android图片蒙层
  • Java|序列化异常StreamCorruptedException的解决方法
  • JavaScript实现分页效果
  • Just for fun——迅速写完快速排序
  • Vue.js-Day01
  • 区块链共识机制优缺点对比都是什么
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 数据仓库的几种建模方法
  • 思否第一天
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 应用生命周期终极 DevOps 工具包
  • 原生js练习题---第五课
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 06-01 点餐小程序前台界面搭建
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • $.ajax,axios,fetch三种ajax请求的区别
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (四)JPA - JQPL 实现增删改查
  • (未解决)macOS matplotlib 中文是方框
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ./configure,make,make install的作用(转)
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @Conditional注解详解
  • [ C++ ] STL_list 使用及其模拟实现
  • [ IOS ] iOS-控制器View的创建和生命周期
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗