基于惯性矩与偏心率的描述子提取包围盒

文章目录

  • 基于惯性矩与偏心率的描述子提取包围盒
    • 1、概述
    • 2、OBB的实现原理
    • 3、代码
    • 4、效果展示

1、概述

pcl::MomentOfInertiaEstimation 类的作用:
(1)获取基于惯性矩(moment of inertia)与偏心率(eccentricity)的描述子;
(2)提取有向包围盒OBB(Oriented Bounding Box)或者和坐标轴对齐包围盒AABB(Axis-Aligned Bounding Box);提取包围盒的作用常用来在游戏场景中做碰撞检测,或者可以做测量,本文中使用OBB的方法对物体进行长宽高的测量。

2、OBB的实现原理

(1)OBB包围盒
根据物体表面的顶点,通过PCA(主成分分析)获得特征向量。PCA是通过正交变换将一组可能相关的变量集合变换成一组不想关的变量集合,即主成分。
(2)PCA算法具体过程
1)将原始数据进行中心化;
2)求原始数据的协方差矩阵;
3)求协方差矩阵的特征值以及对应的特征向量;
4)特征向量组成的坐标系即为OBB包围盒的坐标系。
(题外话:PCA常用来做数据的降维操作,而降维操作只是选取特征值的前K个特征值对应的特征向量来作为主方向的。)

3、代码

实现流程:

  • 加载点云—>计算惯性矩和偏心率—>计算特征值以及对应的特征向量(主方向);
  • 通过pcl::MomentOfInertiaEstimation 类中的成员函数getOBB()得到在质心为坐标系原点的坐标的点云的边界值(min_point_OBB,max_point_OBB),最后添加包围盒并可视化。
#include <pcl/features/moment_of_inertia_estimation.h>
#include <vector>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
#include <boost/thread/thread.hpp>int main(int argc, char** argv)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());if (pcl::io::loadPCDFile("Boundpoints2.pcd", *cloud) == -1)return (-1);//pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_pass(new pcl::PointCloud<pcl::PointXYZ>());//if (pcl::io::loadPCDFile("cloud_filtered.pcd",*cloud_pass)==-1)//  return (-1);pcl::MomentOfInertiaEstimation <pcl::PointXYZ> feature_extractor;//实例化一个对象feature_extractor.setInputCloud(cloud);//设置输入点云feature_extractor.compute();//开始特征计算std::vector <float> moment_of_inertia;//存放惯性距的特征向量std::vector <float> eccentricity;//存放偏心率的特征向量pcl::PointXYZ min_point_OBB;pcl::PointXYZ max_point_OBB;pcl::PointXYZ position_OBB;Eigen::Matrix3f rotational_matrix_OBB;float major_value, middle_value, minor_value;Eigen::Vector3f major_vector, middle_vector, minor_vector;Eigen::Vector3f mass_center;feature_extractor.getMomentOfInertia(moment_of_inertia);//计算出的惯性矩feature_extractor.getEccentricity(eccentricity);//计算出的偏心率feature_extractor.getOBB(min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB);//OBB对应的相关参数feature_extractor.getEigenValues(major_value, middle_value, minor_value);//三个特征值feature_extractor.getEigenVectors(major_vector, middle_vector, minor_vector);//三个特征向量feature_extractor.getMassCenter(mass_center);//计算质心boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("rect")); viewer->setBackgroundColor(1, 1, 1);viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();viewer->addPointCloud<pcl::PointXYZ>(cloud, pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>(cloud, 0, 255, 0), "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "sample cloud");Eigen::Vector3f position(position_OBB.x, position_OBB.y, position_OBB.z);std::cout << "position_OBB: " << position_OBB << endl;std::cout << "mass_center: " << mass_center << endl;//中心坐标Eigen::Quaternionf quat(rotational_matrix_OBB);viewer->addCube(position, quat, max_point_OBB.x - min_point_OBB.x, max_point_OBB.y - min_point_OBB.y, max_point_OBB.z - min_point_OBB.z, "OBB");viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 1, "OBB");viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, 0.1, "OBB");viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_LINE_WIDTH, 4, "OBB");viewer->setRepresentationToWireframeForAllActors();//将所有actor的可视化表示更改为线框表示pcl::PointXYZ center(mass_center(0), mass_center(1), mass_center(2));pcl::PointXYZ x_axis(major_vector(0) + mass_center(0), major_vector(1) + mass_center(1), major_vector(2) + mass_center(2));pcl::PointXYZ y_axis(middle_vector(0) + mass_center(0), middle_vector(1) + mass_center(1), middle_vector(2) + mass_center(2));pcl::PointXYZ z_axis(minor_vector(0) + mass_center(0), minor_vector(1) + mass_center(1), minor_vector(2) + mass_center(2));viewer->addLine(center, x_axis, 1.0f, 0.0f, 0.0f, "major eigen vector");viewer->addLine(center, y_axis, 0.0f, 1.0f, 0.0f, "middle eigen vector");viewer->addLine(center, z_axis, 0.0f, 0.0f, 1.0f, "minor eigen vector");std::cout << "size of cloud :" << cloud->points.size() << endl;std::cout << "moment_of_inertia :" << moment_of_inertia.size() << endl;std::cout << "eccentricity :" << eccentricity.size() << endl;float height = max_point_OBB.z - min_point_OBB.z;float width = max_point_OBB.y - min_point_OBB.y;float depth = max_point_OBB.x - min_point_OBB.x;cout << "长:" << depth << endl;cout << "宽:" << width << endl;cout << "高:" << height << endl;while (!viewer->wasStopped()){viewer->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}system("pause");return (0);
}

4、效果展示


最终测出长宽高

PCL——基于惯性矩与偏心率的描述子进行包围盒提取相关推荐

  1. PCL 基于惯性矩与偏心率的描述子进行包围盒提取

    1.概述 本例程利用pcl::MomentOfInertiaEstimation类获取基于惯性矩(moment of inertia)与偏心率(eccentricity)的描述子,该类的另一功能是提取 ...

  2. PCL 惯性矩和偏心率

    一.MomentOfInertiaEstimation惯性矩估计 PCL--基于惯性矩与偏心率的描述子进行包围盒提取_emm@aaaM的博客-CSDN博客1 (1)获取基于惯性矩(moment of ...

  3. PCL中3D点云特征描述与提取(三)

    PCL中3D点云特征描述与提取(三) 1 如何从一个深度图像中提取NARF特征 2 RoPs特征 2.1 理论基础 2.1.1 生物视觉认知学启示 2.1.2 局部参考坐标框架构建 2.1.3 RoP ...

  4. A performance evaluation of local descriptors——局部描述子评估译文(1,2,...)

    现有局部描述子的性能评估 Krystian Mikolajczyk                  Cordelia Schmid   计算机科学系               法国国立计算机与自动 ...

  5. A performance evaluation of local descriptors——局部描述子评估译文

    A performance evaluation of local descriptors--局部描述子评估译文(1,2,...) 现有局部描述子的性能评估 Krystian Mikolajczyk  ...

  6. PCL:点云特征描述子3D_object_recognition_(descriptors)

    PCL官网:https://pointclouds.org/ 翻译自该网站:http://robotica.unileon.es/index.php/PCL/OpenNI_tutorial_4:_3D ...

  7. 基于点云描述子的立体视觉里程计快速鲁棒的位置识别方法

    点云PCL免费知识星球,点云论文速读. 文章:A Fast and Robust Place Recognition Approach for Stereo Visual Odometry Using ...

  8. PCL中3D特征描述子Shot详解

    上周点云公众号开始分享群友们的反馈分享,由博主分配任务,半个月甚至一个月参与学习小伙伴的反馈给群主,并在微信交流群中进行学术交流,加强大家的阅读文献能力,并提高公众号的分享效果.已经有一些开始陆续反馈 ...

  9. 基于形状图像检索的曲率尺度空间描述符与傅立叶描述子的比较研究——18.07.14

    论文信息:<A comparative study of curvature scale space and Fourier descriptors for shape-based image ...

最新文章

  1. PCB为什么要做无盘设计及其在Allegro中的具体操作
  2. 早期计算机音乐创作的歌曲,14.计算机音乐创作(专业组)
  3. currenthashmap扩容原理_高并发编程系列:深入探讨ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)...
  4. 一位面试者提到直接调用vuex中mutations方法
  5. html二叉树遍历,二叉树的遍历(前序、中序、后序、层次)
  6. Web端打开文件选择和保存对话框
  7. zabbix监控的配置
  8. 如何用VB开发游戏外挂
  9. 桌面应用软件开发语言调查(转)
  10. UPC Haywire(模拟退火 || 随机数法)
  11. 三星32英寸智能电视试用 功用全部对得起高价
  12. 蓝桥 卷“兔”来袭编程竞赛专场-07明码加密 题解
  13. 完美的alert美化
  14. getLocation需要在app.json中声明permission字段
  15. 用什么软件能测试dbm信号强度,怎么查看手机信号强度?多少dbm属于正常范围
  16. 防止跨站攻击,安全过滤
  17. 2016五大白马和黑马fund经理
  18. 华科C++大一MOOC
  19. k米评分容易得高分的歌_悠达客厅K歌系统高调上市丨出色表现,先睹为快
  20. 时钟系统:CPU为啥需要时钟;此时钟非彼时钟,时钟到底是啥玩意

热门文章

  1. 最小卡片迷你服务器 Quantum Mini Linux Development Kit
  2. jap_spring
  3. 十分钟教你配置frp实现内网穿透
  4. 如何能够让自己的博客被百度等搜索引擎搜索到
  5. 软件SPI ADS8684/ADS8688驱动程序
  6. Mask rcnn 代码复现
  7. 关于数组合并的方法总结
  8. 笔记本外接显示器显示很模糊解决办法
  9. Android开发资源(一)
  10. 菜鸟教程 php表单验证码,PHP完整表单实例 | 菜鸟教程