【点云surface】 凹包重构

2023-11-25 06:01
文章标签 重构 surface 点云 凹包

本文主要是介绍【点云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()){}}

这篇关于【点云surface】 凹包重构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/423233

相关文章

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像

【LVI-SAM】激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节

激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节 1. 特征提取实现过程总结1.0 特征提取过程小结1.1 类 `FeatureExtraction` 的整体结构与作用1.2 详细特征提取的过程1. 平滑度计算(`calculateSmoothness()`)2. 标记遮挡点(`markOccludedPoints()`)3. 特征提取(`extractF

Mybatis Plus快速重构真批量sql入库操作

Mybatis快速重构真批量sql入库操作 基本思路 重构mybatis默认方法saveBatch和saveOrUpdateBatch的实现 基本步骤 真批量保存实现类InsertBatchMethod真批量更新实现类MysqlInsertOrUpdateBath注册InsertBatchMethod和MysqlInsertOrUpdateBath到EasySqlInjector注册Eas

点云数据常见的坐标系有哪些,如何进行转换?

文章目录 一、点云坐标系分类1. 世界坐标系2. 相机坐标系3. 极坐标系4. 笛卡尔坐标系(直角坐标系):5. 传感器坐标系6. 地理坐标系 二、坐标系转换方法1. 地理坐标系与投影坐标系之间的转换2. 投影坐标系与局部坐标系之间的转换3. 局部坐标系与3D模型坐标系之间的转换4. 相机坐标系与其他坐标系之间的转换5. 传感器坐标系与其他坐标系之间的转换 三、坐标系转换工具 一

三维激光扫描点云配准外业棋盘的布设与棋盘坐标测量

文章目录 一、棋盘标定板准备二、棋盘标定板布设三、棋盘标定板坐标测量 一、棋盘标定板准备 三维激光扫描棋盘是用来校准和校正激光扫描仪的重要工具,主要用于提高扫描精度。棋盘标定板通常具有以下特点: 高对比度图案:通常是黑白相间的棋盘格,便于识别。已知尺寸:每个格子的尺寸是已知的,可以用于计算比例和调整。平面标定:帮助校准相机和激光扫描仪之间的位置关系。 使用方法 扫描棋盘:

[机缘参悟-222] - 系统的重构源于被动的痛苦、源于主动的精进、源于进化与演进(软件系统、思维方式、亲密关系、企业系统、商业价值链、中国社会、全球)

目录 前言:系统的重构源于被动的痛苦、源于主动的精进、源于进化与演进 一、软件系统的重构 1、重构的定义与目的 2、重构的时机与方法 3、重构的注意事项 4、重构的案例分析 二、大脑思维的重构 1、大脑思维重构的定义 2、大脑思维重构的方法 3、大脑思维重构的挑战与前景 三、认知的重构 1、定义 2、目的 3、方法 四、实例 五、总结 四、婚姻家庭的重构 1、婚

基于opencv实现双目立体匹配点云距离

双目相机或两个单目相机。 一、相机标定 MATLAB软件,打开双目标定app。 点击add images,弹出加载图像的窗口,分别导入左图和右图,设置黑白格长度(标定板的长度一般为20)。 点击确定,弹出加载好的图像。 在菜单栏勾选2 Coefficients(鱼眼相机勾选3 Coefficients)、Tangential Distinction,点击Calibrate,显示

总结如何成为“好”代码——读《重构:改善既有代码的设计》有感

读后感 说是“读后感”,其实并不是看得很仔细,尤其是各种代码例子,我基本上是跳过的。个人觉得,重构这件事上,关键是要能嗅出坏代码,知道什么是好代码,这样目标明确后,重构的手段其实是水到渠成的,唯一要注意的就是书中强调的:要以小步为单位稳打稳扎进行。 我所理解的“好”代码 核心目标 那么如何才是“好”代码?书中的答案是:“人们是否能轻而易举地修改”,而我觉得抽象层级更高的描述是:易于未来的工

数据结构 - 二叉树(重构 + 遍历)

写在前面 昨天有同学问到我一题关于重构二叉树的问题(link),做了一下,也做个记录吧! 所谓二叉树的重构,就是给你前序和中序,或者中序和后序,让你还原这棵二叉树. 注意:给出前序和后序是不能唯一确定一棵二叉树的,证明请看这儿.   一.给出前序和中序,重构二叉树 一个递归的过程: 当前结点的value:每一轮根据前序的第一个元素确定当前结点值. 左子树的中序遍历

CUDAPCL ROR点云滤波

文章目录 一、简介二、实现代码三、实现效果参考资料 一、简介 该方法的具体原理为输入的点云中每一个点设定一个范围(半径为r的圆),如果在该范围内没有达到某一个设定的点数值,则该数据点将会被删除,重复上述此过程直到最后一个数据点,即完成该滤波过程。 二、实现代码 ROR.cuh #ifndef ROR_GPU_CUH#define ROR_GPU_CU