【点云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()){}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/215784.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手把手教你安装 Visual Studio 2022 及其简单使用

软件下载 打开 Visual Studio 官网&#xff0c;个人选择免费的Community社区版就够用了。 软件安装 双击运行安装程序&#xff1a; 点击继续 即可&#xff1a; 等待加载完成&#xff1a; 可以看到 Visual Studio 2022 对应不同的开发需求提供了若干工作负载&#xff0c;这里以…

Go 本地搭建playground

搭建go playground 的步骤 1、安装docker 如果你使用的Ubuntu&#xff0c;docker的安装步骤可以参见这里&#xff0c;这是我之前写的在Ubuntu18.04下安装fabric&#xff0c;其中有docker的安装步骤&#xff0c;这里就不再赘述了。 CentOS下安装docker的&#xff0c;可以参见…

Ubuntu下使用protoBuf

一、protobuf简介&#xff1a; 1.1 protobuf的定义&#xff1a; protobuf是用来干嘛的&#xff1f; protobuf是一种用于 对结构数据进行序列化的工具&#xff0c;从而实现 数据存储和交换。 &#xff08;主要用于网络通信中 收发两端进行消息交互。所谓的“结构数据”是指类…

DGL在异构图上的GraphConv模块

回顾同构图GraphConv模块 首先回顾一下同构图中实现GraphConv的主要思路&#xff08;以GraphSAGE为例&#xff09;&#xff1a; 在初始化模块首先是获取源节点和目标节点的输入维度&#xff0c;同时获取输出的特征维度。根据SAGE论文提出的三种聚合操作&#xff0c;需要获取所…

HCIA-RS基础:动态路由协议基础

摘要&#xff1a;本文介绍动态路由协议的基本概念&#xff0c;为后续动态路由协议原理课程提供基础和引入。主要讲解常见的动态路由协议、动态路由协议的分类&#xff0c;以及路由协议的功能和自治系统的概念。文章旨在优化标题吸引力&#xff0c;并通过详细的内容夯实读者对动…

人工智能教程(二):人工智能的历史以及再探矩阵

目录 前言 更多矩阵的知识 Pandas 矩阵的秩 前言 在上一章中&#xff0c;我们讨论了人工智能、机器学习、深度学习、数据科学等领域的关联和区别。我们还就整个系列将使用的编程语言、工具等做出了一些艰难的选择。最后&#xff0c;我们还介绍了一点矩阵的知识。在本文中&am…

蓝桥杯物联网竞赛_STM32L071_4_按键控制

原理图&#xff1a; 当按键S1按下PC14接GND&#xff0c;为低电平 CubMX配置: Keil配置&#xff1a; main函数&#xff1a; while (1){/* USER CODE END WHILE */OLED_ShowString(32, 0, "hello", 16);if(Function_KEY_S1Check() 1){ OLED_ShowString(16, 2, &quo…

shrio----(1)基础

文章目录 前言 一、Shrio1、什么是shiro2、为什么使用shrio 二、主要类2.1、Subject2.2、SecurityManager2.3、Realms 三、认证授权3.1、认证(Authentication)3.2、授权&#xff08;authorization&#xff09;四、入门示例参考文章 前言 简单入门介绍 一、Shrio http://shir…

动态规划 之 钢条切割

自顶向下递归实现(Recursive top-down implementation) 程序CUT-ROD对等式(14.2)进行了实现&#xff0c;伪代码如下&#xff1a; CUT-ROD(p, n)if n 0return 0q -∞for i 1 to nq max{q, p[i] CUT-ROD(p, n - i)}return q上面解决中重复对一个子结构问题重复求解了&#…

java中关键字 volatile 和 synchronized 有什么区别

java中 volatile 和 synchronized 有什么区别&#xff1f;

nodejs微信小程序+python+PHP-青云商场管理系统的设计与实现-安卓-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

微机原理_3

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 在 8086 微机系统中&#xff0c;完成对指令译码操作功能的部件是&#xff08;)。 A. EU B. BIU C. SRAM D. DRAM 使计算机执行某…