当前位置: 首页 > 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…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究

摘要&#xff1a;在消费市场竞争日益激烈的当下&#xff0c;传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序&#xff0c;探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式&#xff0c;分析沉浸式体验的优势与价值…...

拟合问题处理

在机器学习中&#xff0c;核心任务通常围绕模型训练和性能提升展开&#xff0c;但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正&#xff1a; 一、机器学习的核心任务框架 机…...