pcl中MomentOfInertiaEstimation解析与实例

news2024/12/23 17:19:22

pcl中features模块又基于惯性矩和偏心率的描述子,也可以求取点云的AABB和OBB包围盒,在计算的过程中法线一些问题,特此记录。
针对惯性矩和偏心率这两个数据的应用场景还不明确,因此暂时不做讨论,主要讨论求取OBB时的代码。

template <typename PointT> void
pcl::MomentOfInertiaEstimation<PointT>::computeOBB ()
{
  obb_min_point_.x = std::numeric_limits <float>::max ();
  obb_min_point_.y = std::numeric_limits <float>::max ();
  obb_min_point_.z = std::numeric_limits <float>::max ();

  obb_max_point_.x = std::numeric_limits <float>::min ();
  obb_max_point_.y = std::numeric_limits <float>::min ();
  obb_max_point_.z = std::numeric_limits <float>::min ();

  unsigned int number_of_points = static_cast <unsigned int> (indices_->size ());
  for (unsigned int i_point = 0; i_point < number_of_points; i_point++)
  {
    float x = (input_->points[(*indices_)[i_point]].x - mean_value_ (0)) * major_axis_ (0) +
              (input_->points[(*indices_)[i_point]].y - mean_value_ (1)) * major_axis_ (1) +
              (input_->points[(*indices_)[i_point]].z - mean_value_ (2)) * major_axis_ (2);
    float y = (input_->points[(*indices_)[i_point]].x - mean_value_ (0)) * middle_axis_ (0) +
              (input_->points[(*indices_)[i_point]].y - mean_value_ (1)) * middle_axis_ (1) +
              (input_->points[(*indices_)[i_point]].z - mean_value_ (2)) * middle_axis_ (2);
    float z = (input_->points[(*indices_)[i_point]].x - mean_value_ (0)) * minor_axis_ (0) +
              (input_->points[(*indices_)[i_point]].y - mean_value_ (1)) * minor_axis_ (1) +
              (input_->points[(*indices_)[i_point]].z - mean_value_ (2)) * minor_axis_ (2);

    if (x <= obb_min_point_.x) obb_min_point_.x = x;
    if (y <= obb_min_point_.y) obb_min_point_.y = y;
    if (z <= obb_min_point_.z) obb_min_point_.z = z;

    if (x >= obb_max_point_.x) obb_max_point_.x = x;
    if (y >= obb_max_point_.y) obb_max_point_.y = y;
    if (z >= obb_max_point_.z) obb_max_point_.z = z;
  }

  obb_rotational_matrix_ << major_axis_ (0), middle_axis_ (0), minor_axis_ (0),
                            major_axis_ (1), middle_axis_ (1), minor_axis_ (1),
                            major_axis_ (2), middle_axis_ (2), minor_axis_ (2);

  Eigen::Vector3f shift (
    (obb_max_point_.x + obb_min_point_.x) / 2.0f,
    (obb_max_point_.y + obb_min_point_.y) / 2.0f,
    (obb_max_point_.z + obb_min_point_.z) / 2.0f);

  obb_min_point_.x -= shift (0);
  obb_min_point_.y -= shift (1);
  obb_min_point_.z -= shift (2);

  obb_max_point_.x -= shift (0);
  obb_max_point_.y -= shift (1);
  obb_max_point_.z -= shift (2);

  obb_position_ = mean_value_ + obb_rotational_matrix_ * shift;
}

如上所示,OBB求取的过程就是将点云转换到以中心为坐标原点,PCA计算的三个特征向量为轴方向的局部坐标系中,然后求取相应的AABB包围盒的过程,但是在文中最后一段

  Eigen::Vector3f shift (
    (obb_max_point_.x + obb_min_point_.x) / 2.0f,
    (obb_max_point_.y + obb_min_point_.y) / 2.0f,
    (obb_max_point_.z + obb_min_point_.z) / 2.0f);

  obb_min_point_.x -= shift (0);
  obb_min_point_.y -= shift (1);
  obb_min_point_.z -= shift (2);

  obb_max_point_.x -= shift (0);
  obb_max_point_.y -= shift (1);
  obb_max_point_.z -= shift (2);
  obb_position_ = mean_value_ + obb_rotational_matrix_ * shift;

第一点:
shift是包围盒的在局部坐标系中的中心坐标,
obb_rotational_matrix_ 是将局部坐标系转为全局坐标的旋转矩阵,平移矩阵就是中心点坐标。
obb_position_ 就是OBB包围盒中心的全局坐标

注意:这里局部坐标系和全局坐标系的转换关系要注意,对点云计算协方差阵,得到的特征向量矩阵是列向量组成的,obb_rotational_matrix_ 就是列向量组成的;
分析:
全局坐标->局部坐标
RP=Pt,此时的R是特征向量作为行向量组成的,这与得到的特征向量矩阵是转置的关系
局部坐标->全局坐标
RtPt=P,此时Rt是R的逆,这才是正确的,但是由于R的转置*R=单位阵,因此使用转置取代求逆操作,也就是说,此时的Rt是特征向量作为列组成的。所以出现
obb_position_ = mean_value_ + obb_rotational_matrix_ * shift;
obb_position_ 就是OBB包围盒中心的全局坐标。

第二点:

  obb_min_point_.x -= shift (0);
  obb_min_point_.y -= shift (1);
  obb_min_point_.z -= shift (2);

  obb_max_point_.x -= shift (0);
  obb_max_point_.y -= shift (1);
  obb_max_point_.z -= shift (2);

obb_min_point_和obb_max_point_减去包围盒中心点坐标是什么意思?
经过测试发现,减去中心点坐标之后,包围盒的坐标是存在问题的
在这里插入图片描述

如上图所示,两个黑色框中的点就是获取的包围盒的最小点和最大点,这里明显可以看出,这两点和显示的OBB包围盒没有关系,是有问题的。
因此绘制正确的OBB包围盒时,采用的是给定包围盒中心的坐标和包围盒的宽度和长度的方法进行绘制。
欢迎留言。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

天宇优配|GDR海外发行热情高 资本市场互联互通提速

圆桌评论&#xff1a;“对话交易所——上海&#xff0c;为中欧互联互通提速” “2022上海全球资产管理高峰论坛”11月29日在上海举办。在题为“对话交易所——上海&#xff0c;为中欧互联互通提速”的圆桌评论环节&#xff0c;来自全球各大证券交易所、证券公司、上市公司的多…

python学习笔记(12)---(内置模块)

目录 第十章 内置模块 1.math模块 2.random模块 3.os模块和os.path模块 4.sys模块 5.UUID模块 6.时间日期模块 7.加密模块hashlib&#xff1a;接受传入内容&#xff0c;计算后得到hash值 第十章 内置模块 1.math模块 &#xff08;1&#xff09;查看方法&#xff1a;…

BERT-of-Theseus

最近了解到一种称为"BERT-of-Theseus"的BERT模型压缩方法&#xff0c;源自论文《BERT-of-Theseus: Compressing BERT by Progressive Module Replacing》。这是一种以"可替换性"为出发点所构建的模型压缩方案&#xff0c;相比常规的剪枝、蒸馏等手段&#…

【特征选择】基于教与学算法实现二进制特征选择问题附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

第二证券|汽车板块现涨停潮!多只地产债再涨到临停

在昨日大幅上涨后&#xff0c;今日上午A股商场持续上行&#xff0c;不过涨势放缓&#xff0c;到上午收盘&#xff0c;上证指数上涨0.21%。 昨日带动大市上行的地产板块今日上午涨势减缓&#xff0c;包含福星股份、世茂股份在内的多只地产股涨停。不过也有极少数地产股逆势跌落&…

容器化应用系统上生产的最佳实践

前言 最近忙的要死, &#x1f47b;&#x1f47b;&#x1f47b;. 上一周来了一次比 996 更猛的 907. 这周二终于有点遭不住了, 调休一天, 稍微歇息一下. 同时手痒的不行, 把筹备了好久的重磅文章发上来哈哈. &#x1f606;&#x1f606;&#x1f606; 不过时间还是有点仓促, …

自动化测试的生命周期是什么?

软件测试发展到今日&#xff0c;已经逐渐标准化且能力更强&#xff0c;其流程每天都在发展。测试人员的技术熟练程度对于整个测试阶段的成功来说至关重要。测试不再意味着仅仅发现错误&#xff1b;它的范围已经扩大&#xff0c;从任何开发项目开始就可以看出它的重要性。 当谈论…

[SpringMVC]第三篇:作用域传参

四大域: PageContext对象(不常用) 作用域范围:当前jsp页面内有效 request对象(经常用) 作用域范围:一次请求内。 作用: 解决了一次请求内的资源的数据共享问题 session对象(登录,会话时会用) 作用域范围:一次会话内有效。 说明:浏览器不关闭,并且后台的session不失效&#xff…

Python OpenCV 单目相机标定、坐标转换相关代码

前言 本文不讲原理&#xff0c;只关注代码&#xff0c;有很多博客是讲原理的&#xff0c;但是代码最多到畸变矫正就结束了&#xff0c;实际上就是到 OpenCV 官方示例涉及的部分。   在官方示例中使用黑白棋盘格求解了相机的内外参和畸变系数&#xff0c;并对图像做了畸变矫正…

【Android App】集成腾讯地图显示位置和地图面板讲解及实战(附源码和演示 超详细必看)

需要源码请点赞关注收藏后评论区留言私信~~~ 一、集成腾讯地图 之所以选用腾讯地图来讲解&#xff0c;是因为它的集成过程相对简单&#xff0c;无须通过App的签名鉴权&#xff0c;腾讯地图的开放平台网址为 腾讯地图 集成腾讯地图分为以下几步 &#xff08;1&#xff09;在…

Linux网络基础------TCP/UDP协议

文章目录TCP和UDP的宏观认识UDP协议TCP协议 &#xff08;绝对的核心重点&#xff09;tcp协议报头各个字段的详解tcp协议的机制超时重传机制连接管理机制3次握手4次挥手滑动窗口流量控制拥塞控制延迟应答捎带应答粘包问题TCP和UDP的宏观认识 首先&#xff0c; TCP/UDP是位于传输…

元宇宙竟然也难逃性骚扰???

当我们还沉浸在元宇宙里种种美妙的虚拟体验之时&#xff0c;竟接连传出 “虚拟性骚扰” &#xff08;virtual assault&#xff09;……去年 12 月&#xff0c;Metaverse Research 的联合创始人 Nina Jane Patel&#xff0c;在自己的 Blog 记录下她参与 Meta 元宇宙游戏《地平线…

学习响应式布局

针对性内容 页面设计在不同设备的显示情况布局只会使用float定位&#xff0c;而不会掌握flex不能很好的使用rem作为设计单位掌握响应式布局、弹性等常见布局 学习内容 css中媒体查询的作用和使用方法flex弹性盒子的用法rem的作用和使用方法目录 针对性内容 学习内容 Media…

第8章 自定义SwaggerIndex页与登录页

“Blog.Core-master”程序没有使用.Net7框架内置的index.html页对api方法进行渲染显示&#xff0c;而是通过对“Swagger”和“SwaggerUI”内置中间件的自定义操作&#xff0c;调用根目录下的自定义index.html页对api方法进行渲染显示。 1、自定义“Swagger”和“SwaggerUI”内…

[附源码]Python计算机毕业设计Django付费自习室管理小程序

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

vue项目使用elementui上传组件 打包后报错t.upload.addEventListener is not a function的解决方案

今天和大家分享一个报错的解决方案 背景 项目打包部署到宝塔上后&#xff0c;打开网页&#xff0c;上传东西时出现了一个报错&#xff0c;但是在本地开发环境是没有问题的。 报错内容&#xff1a; 这个问题是因为mockjs改动了axios里面XMLHttpRequest对象从而导致报错。 解…

Java医院信息管理系统源码带文字安装教程

技术架构 技术框架&#xff1a;springboot shiro layui jquery thymeleaf nginx 运行环境&#xff1a;jdk8 mysql IntelliJ IDEA maven 宝塔面板 文字安装教程 下载源码&#xff0c;创建一个数据库&#xff0c;导入hospitaldata.sql文件至数据库中。 使用IDEA打开hosp…

Kotlin高仿微信-第29篇-朋友圈-发布作品(图片)

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

GmNAC181促进结瘤并提高根瘤的耐盐性

文章信息 题目&#xff1a;GmNAC181 promotes symbiotic nodulation and salt tolerance of nodulation by directly regulating GmNINa expression in soybean 刊名&#xff1a;New Phytologist 作者&#xff1a;Xiaodi Wang&#xff0c;Youning Wang, Xia Li et al. 单位…

2022年NPDP新版教材知识集锦--【第四章节】(5)

《产品经理认证(NPDP)知识体系指南(第2版)》已于2022年4月正式上架发行&#xff0c;新版教材自2022年11月NPDP考试起使用。将新版NPDP教材中的相关知识点进行了整理汇总&#xff0c;包括详细设计与规格阶段相关内容&#xff0c;快来看看吧。 【详细设计与规格阶段】(全部获取文…