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

pcl源码分析之计算凸包

文章目录

  • 前言
  • 一、应用案例
  • 二、源码分析
    • 1.ConvexHull类
    • 2.reconstruct函数
    • 3.performReconstruction 函数
    • 4.calculateInputDimension 函数
  • 总结


前言

本文分析一下pcl里凸包的源码。什么是凸包以及怎么求解,可以了解一下概念。


一、应用案例

#include <pcl/surface/convex_hull.h>pcl::ConvexHull<pcl::PointXYZ> convex_hull;convex_hull.setInputCloud(cloud_in);//输入点云//convex_hull.setDimension(3);//设置维数,当然不设置,内部算法也会自己计算//pcl::PointCloud<pcl::PointXYZ>::Ptr hull_out(new pcl::PointCloud<pcl::PointXYZ>);convex_hull.reconstruct(*cloud_out);//输出凸包(点)convex_hull.getHullPointIndices(Indices);//输出凸包(点)在输入点云中的id

二、源码分析

1.ConvexHull类

  template<typename PointInT>class ConvexHull : public MeshConstruction<PointInT>{...//构造函数中dimension_(数据的维数) 默认是0//x_axis_ , y_axis_ , z_axis_ 坐标轴三个参数也在这里确定/** \brief Empty constructor. */ConvexHull () : compute_area_ (false), total_area_ (0), total_volume_ (0), dimension_ (0), projection_angle_thresh_ (cos (0.174532925) ), qhull_flags ("qhull "),x_axis_ (1.0, 0.0, 0.0), y_axis_ (0.0, 1.0, 0.0), z_axis_ (0.0, 0.0, 1.0){};...//输出凸包接口/** \brief Compute a convex hull for all points given.* \param[out] points the resultant points lying on the convex hull.*/voidreconstruct (PointCloud &points);...//设置维数接口(这里如果不设置具体的维数,则会维数默认值是构造函数里的值0,并且算法里会自行计算真实的维数)void setDimension (int dimension){if ((dimension == 2) || (dimension == 3))dimension_ = dimension;elsePCL_ERROR ("[pcl::%s::setDimension] Invalid input dimension specified!\n", getClassName ().c_str ());}...//获取凸包点在输入点云中的idvoidgetHullPointIndices (pcl::PointIndices &hull_point_indices) const;...}

2.reconstruct函数

template <typename PointInT> void
pcl::ConvexHull<PointInT>::reconstruct (PointCloud &points)
{points.header = input_->header;//初始化,这里initCompute 实际上是PCLBase这个基类的初始化函数,前文有讲过,这里不再赘述if (!initCompute () || input_->points.empty () || indices_->empty ()){points.points.clear ();return;}// Perform the actual surface reconstruction//这里就是真正的凸包计算接口std::vector<pcl::Vertices> polygons;performReconstruction (points, polygons, false);points.width = static_cast<uint32_t> (points.points.size ());points.height = 1;points.is_dense = true;deinitCompute ();
}

3.performReconstruction 函数

对于Qhull,有兴趣可以了解学习一下:
3.1 什么是Qhull
3.2 怎么下载编译Qhull
3.2 Qhull官网地址

template <typename PointInT> void
pcl::ConvexHull<PointInT>::performReconstruction (PointCloud &hull, std::vector<pcl::Vertices> &polygons,bool fill_polygon_data)
{//如上面所说,如果没有在维度设置接口中设置维度,则默认维度是0,也即会执行calculateInputDimension if (dimension_ == 0)calculateInputDimension ();//后面这两函数就是具体的调用哦个Ahull库来实现凸包的计算//具体怎么实现的,后续有空再研究吧,毕竟又涉及到另一个开源库,need more time~~if (dimension_ == 2)performReconstruction2D (hull, polygons, fill_polygon_data);else if (dimension_ == 3)performReconstruction3D (hull, polygons, fill_polygon_data);elsePCL_ERROR ("[pcl::%s::performReconstruction] Error: invalid input dimension requested: %d\n",getClassName ().c_str (),dimension_);
}

4.calculateInputDimension 函数

template <typename PointInT> void
pcl::ConvexHull<PointInT>::calculateInputDimension ()
{PCL_DEBUG ("[pcl::%s::calculateInputDimension] WARNING: Input dimension not specified.  Automatically determining input dimension.\n", getClassName ().c_str ());//计算输入点云质心Eigen::Vector4d xyz_centroid;compute3DCentroid (*input_, *indices_, xyz_centroid);EIGEN_ALIGN16 Eigen::Matrix3d covariance_matrix;//计算每个点的协方差矩阵//这里原理就是://1.将原始点云坐标减去中心点坐标//2.再对这些数据构造协方差矩阵,协方差矩阵具体构造原理看前文harris3d源码分析,就不再详细分析//3.有一点要说明,这个部分构造协方差矩阵的开源代码,比harris3d里协方差矩阵开源代码要清晰很多computeCovarianceMatrixNormalized (*input_, *indices_, xyz_centroid, covariance_matrix);//求协方差矩阵的特征值//主法向量是协方差矩阵的最小特征值对应的特征向量EIGEN_ALIGN16 Eigen::Vector3d eigen_values;pcl::eigen33 (covariance_matrix, eigen_values);//对于二维的数据,主法向量就是0或者近似于0if (std::abs (eigen_values[0]) < std::numeric_limits<double>::epsilon () || std::abs (eigen_values[0] / eigen_values[2]) < 1.0e-3)dimension_ = 2;elsedimension_ = 3;
}

总结

分析了下pcl里求解凸包的整体流程,有一些收获~~

相关文章:

pcl源码分析之计算凸包

文章目录 前言一、应用案例二、源码分析1.ConvexHull类2.reconstruct函数3.performReconstruction 函数4.calculateInputDimension 函数 总结 前言 本文分析一下pcl里凸包的源码。什么是凸包以及怎么求解&#xff0c;可以了解一下概念。 一、应用案例 #include <pcl/surfa…...

在K8S中,Pod请求另一个Pod偶尔出现超市或延迟,如何排查?

在Kubernetes中&#xff0c;当Pod请求另一个Pod时偶尔出现超时或延迟&#xff0c;可能是由于多种原因造成的。以下是一些建立的排查步骤&#xff1a; 1. 检查网络配置和插件&#xff1a; 确认你的kubernetes集群使用了合适的网络插件&#xff08;如Calico、Flannel等&#xf…...

3blue1brow线代笔记

向量 物理&#xff1a;空间中的箭头&#xff0c;长度和方向决定一个向量。只要两者相同&#xff0c;可以任意移动保持不变 计算机&#xff1a;有序的数字列表 &#xff08;数组&#xff09; 数学&#xff1a;向量可以是任何东西&#xff0c;只要保证两个向量相加以及数字与向量…...

【前端系列】优化axios响应拦截器

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、axios响应拦截器&#xff1a;☀️☀️☀️2.1 为什么前端需要响应拦截器element ui的消息组件 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 回报不在行动之后&#xff0c;回报在行动之中。 这个系列可…...

SQL使用视图

本文将介绍什么是视图&#xff0c;它们怎样工作&#xff0c;何时使用它们。 1. 视图 视图是虚拟的表。与包含数据的表不一样&#xff0c;视图只包含使用时动态检索数据的查询。 说明&#xff1a;SQLite 的视图 SQLite 仅支持只读视图&#xff0c;所以视图可以创建&#xff…...

在Windows计算机上打开 HEIC 文件的 6 种有效方法

如果您是 iPhone 用户&#xff0c;您可能对 HEIC 照片很熟悉。这种新兴格式是一种非常高效的图片编码器&#xff0c;它以小得多的尺寸提供至少类似 JPEG 的质量。这对于存储容量较小的手机尤其有利。但是&#xff0c;如何在Windows上打开 HEIC 文件&#xff1f; 假设您用 iDev…...

开源数据集成平台白皮书重磅发布《Apache SeaTunnel 2024用户案例合集》!

2025年新年临近&#xff0c;Apache SeaTunnel 社区用户案例精选&#x1f4d8;也跟大家见面啦&#xff01;在过去的时间里&#xff0c;SeaTunnel 社区持续成长&#xff0c;吸引了众多开发者的关注与支持。 为了致谢一路同行的伙伴&#xff0c;也为了激励更多人加入技术共创&…...

C# delegate 委托使用教程

什么是委托&#xff1f; 委托是定义方法签名的引用类型数据类型&#xff0c;可以定义委托的变量&#xff0c;就像其他数据类型一样&#xff0c;可以引用与委托具有相同签名的任何方法。 它允许方法作为参数传递&#xff0c;并允许事件驱动编程。它们提供了一种以类型安全的方…...

《机器学习》——数据标准化(0~1标准化,z标准化)

文章目录 数据标准化一、什么是标准化二、常用标准化0~1标准化z标准化 三、注意事项 数据标准化 一、什么是标准化 数据标准化是一种数据预处理技术&#xff0c;用于将数据按照一定的规则进行变换&#xff0c;使得不同特征或变量具有可比性和一致性。作用 消除量纲影响 在实际…...

如何监控和管理API接口的调用频率和并发量?

使用监控工具 APM&#xff08;应用性能管理&#xff09;工具 功能介绍&#xff1a;APM 工具如 New Relic、AppDynamics 等可以深入监控 API 的性能指标&#xff0c;包括调用频率、并发量、响应时间等。它们通过在应用程序中嵌入代理或使用无侵入式的监测方式&#xff0c;收集和…...

springboot+vue使用EasyCaptcha实现简单验证码

一、实现效果 springboot使用EasyCaptcha实现简单验证码&#xff0c;更多api和用法可以去github上查看EasyCaptcha: Java图形验证码&#xff0c;支持gif、中文、算术等类型&#xff0c;可用于Java Web、JavaSE等项目。 二、实现步骤 1、导入依赖 <!-- easy-captcha --&g…...

“善弈者”也需妙手,Oclean欧可林:差异化不是说说而已

作者 | 曾响铃 文 | 响铃说 俗话说&#xff0c;“牙痛不是病&#xff0c;痛起来要人命”。这话意思大家都知道&#xff0c;牙痛虽不是什么大病&#xff0c;可一旦发作却是极难忍受。 前几日&#xff0c;Oclean欧可林举办了一场AirPump A10氧气啵啵冲牙器新品品鉴会&#xff…...

Lianwei 安全周报|2025.1.2

以下是本周「Lianwei周报」&#xff0c;我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件&#xff0c;保证大家不错过本周的每一个重点&#xff01; 政策/标准/指南最新动态 01 国家数据局等五部门印发《关于促进企业数据资源开发利用的意见》 为充分释放企业…...

吐卡机开发——指令合集—未来之窗行业应用跨平台架构

序号指令10A 09 02 01 01 0D DE20A 09 02 02 01 FD DE30A 09 02 03 01 6D DF40A 09 02 04 01 5D DD50A 09 02 05 01 CD DC60A 09 02 06 01 3D DC70A 09 02 07 01 AD DD80A 09 02 08 01 5D D890A 09 02 09 01 CD D9100A 09 02 10 01 5D D2110A 09 02 11 01 CD D3120A 09 02 12 0…...

C# 设计模式(创建型模式):单例模式

C# 设计模式&#xff08;创建型模式&#xff09;&#xff1a;单例模式 1. 引言 在软件开发中&#xff0c;设计模式是解决常见问题的经典方法。单例模式&#xff08;Singleton Pattern&#xff09;是创建型设计模式中的一种&#xff0c;旨在确保某个类只有一个实例&#xff0c…...

使用WebSocket 获取实时数据

回车发送数据&#xff0c;模拟服务器发送数据 效果图&#xff1a; 源码&#xff1a; <template><div><h1>WebSocket 实时数据</h1><input type"text" v-model"ipt" keyup.enter"sendMessage(ipt)"><div v-if…...

阿里云服务器上安装配置Logtail日志收集客户端

在当今的云计算时代,有效的日志管理对于监控、故障排查和性能优化至关重要。作为阿里云用户,您可以利用阿里云强大的日志服务(SLS)来管理您的日志。而Logtail,作为SLS的核心组件之一,在日志收集和传输中扮演着关键角色。本文将为您详细介绍如何在阿里云服务器上安装和配置…...

Java实现下载excel模板,并实现自定义下拉框

GetMapping("excel/download")ApiOperation(value "模板下载")public void getUserRecordTemplate(HttpServletResponse response, HttpServletRequest request) throws IOException {OutputStream outputStream response.getOutputStream();InputStream…...

postgres docker安装

mkdir -p /root/postgresql/data docker pull postgres:14 docker run --privilegedtrue --name postgres -e POSTGRES_PASSWORD123456 -e ALLOW_IP_RANGE0.0.0.0/0 -p 5432:5432 -v /root/postgresql/data:/var/lib/postgresql/data -d postgres:14#地址&#xff1a;192.168.3…...

数据库原理与应用期末复习

目录 第 1 章 概述 第 2 章 关系模型的基本概念 第 3 章 SQL 语言 第 4 章 中级 SQL 第 5 章 高级 SQL 第 6 章 关系代数语言 第 7 章 数据库设计和 ER 模型 第 8 章 关系数据库设计 第 13 章 事务 第 14 章 并发控制与恢复 第 1 章 概述 Database-management system…...

像素剧本圣殿部署指南:Qwen2.5-14B-Instruct在生产环境中稳定运行的GPU显存优化技巧

像素剧本圣殿部署指南&#xff1a;Qwen2.5-14B-Instruct在生产环境中稳定运行的GPU显存优化技巧 1. 项目概述 像素剧本圣殿&#xff08;Pixel Script Temple&#xff09;是一款基于Qwen2.5-14B-Instruct大模型深度微调的专业剧本创作工具。它将先进的AI推理能力与独特的8-Bit…...

错位排序算法

首先&#xff0c;让我们理解什么是错位排列&#xff1a;错位排列是指在排列中&#xff0c;任何一个元素都不在自己原来的位置上。比如&#xff0c;对于序列 {1,2,3}{1,2,3}&#xff0c;一个错位排列可能是 {3,1,2}{3,1,2}&#xff0c;因为 11 不在位置 11 上&#xff0c;22 不在…...

写段代码教会你什么是HOOK技术?HOOK技术能干什么?

起因是我想在搞一些操作windows进程的事情时&#xff0c;老是需要右键以管理员身份运行&#xff0c;感觉很麻烦。就研究了一下怎么提权&#xff0c;顺手瞄了一眼Windows下用户态权限分配&#xff0c;然后也是感谢《深入解析Windows操作系统》这本书给我偷令牌的灵感吧&#xff…...

用STM32和示波器搞定美的/格力空调红外遥控(附完整C代码)

STM32实战&#xff1a;从示波器捕获到空调红外协议逆向全解析 红外遥控技术看似简单&#xff0c;却蕴含着精妙的时序设计和协议逻辑。作为一名长期混迹于硬件开发领域的工程师&#xff0c;我经常遇到需要逆向控制家电的场景。最近在智能家居项目中&#xff0c;就遇到了需要通过…...

避坑指南:nRF52840蓝牙DFU配置中那些官方文档没细说的‘坑’(基于SDK 17.1.0)

nRF52840蓝牙DFU实战避坑手册&#xff1a;从原理到解决方案的深度解析 在嵌入式开发领域&#xff0c;无线固件升级(DFU)功能已成为蓝牙产品的标配需求。nRF52840作为Nordic Semiconductor的旗舰级蓝牙SoC&#xff0c;配合其完善的SDK支持&#xff0c;理论上应该能够轻松实现这一…...

音乐版权侵权避坑指南:明星翻唱踩的红线,这些行为也在踩

短视频/直播/门店公播全场景合规方案 正版商用音乐授权平台推荐央广网北京3月30日消息&#xff08;记者费权&#xff09;近日&#xff0c;歌手单依纯在深圳演唱会上未经授权演唱李荣浩原创作品《李白》&#xff0c;而此前李荣浩方已明确婉拒其版权授权申请&#xff0c;中国音乐…...

3个步骤搞定本地OCR:让隐私保护与效率提升不再矛盾

3个步骤搞定本地OCR&#xff1a;让隐私保护与效率提升不再矛盾 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维码。内置多国语言库…...

大厂面试秘籍:AI岗位必问的10道题解析

在人工智能技术迅猛发展的今天&#xff0c;AI测试开发岗位已成为大厂竞相争夺的热门领域。对于软件测试从业者而言&#xff0c;转型AI岗位不仅是职业跃迁的机遇&#xff0c;更是技术深化的挑战。一、基础概念题&#xff1a;AI、ML、DL的区别及测试意义这道题考察对人工智能生态…...

PROJECT MOGFACE自动化办公助手:集成Python脚本处理Excel与生成报告

PROJECT MOGFACE自动化办公助手&#xff1a;告别重复劳动&#xff0c;让报告自己“写”自己 你是不是也受够了每周、每月那些格式固定的数据报告&#xff1f;从一堆Excel表格里复制粘贴数据&#xff0c;再绞尽脑汁组织语言&#xff0c;最后排版成一份像样的文档。这个过程枯燥…...

AI模型版本控制:Git for ML最佳实践

当软件测试遇上AI模型迭代对于软件测试从业者而言&#xff0c;版本控制是保障软件质量、实现可追溯性的基石。然而&#xff0c;当测试对象从传统的功能模块转变为动态演进的AI模型时&#xff0c;版本管理的复杂性陡然增加。一个推荐模型本周表现优异&#xff0c;下周却因数据漂…...