PCL学习笔记二

demo 一个完整的实例 (yuque.com)

01common

pcl_common中主要是包含了PCL库常用的公共数据结构和方法,比如PointCloud的类和许多用于表示点,曲面,法向量,特征描述等点的类型,用于计算距离,均值以及协方差,角度转换以及几何变化的函数。

common模块中的头文件

  1. angles.h 定义了标准的C接口的角度计算函数
  2. centriod.h 定义了中心点的估算以及协方差矩阵的计算
  3. commo.h 标准的C以及C++类,是其他common 函数的父类
  4. distance.h 定义标准的C接口用于计算距离
  5. file_io.h 定义了一些文件帮助写或者读方面的功能。
  6. random.h 定义一些随机点云生成的函数
  7. geometry.h 定义一些基本的几何功能的函数
  8. intersection.h 定义线与线相交的函数
  9. norm.h 定义了标准的C方法计算矩阵的正则化
  10. time.h 定义了时间计算的函数
  11. Point_types.h 定义了所有PCL实现的点云的数据结构的类型

common模块中的基本函数

pcl::rad2deg(fllat alpha) 

从弧度到角度

pcl::deg2rad(float aipha)

从角度到弧度

pcl::normAngle(float alpha)

正则化角度在(-PI,PI)之间

pcl::compute3DCentroid (const pcl::PointCloud< PointT > &cloud, Eigen::Matrix< Scalar, 4, 1 > &centroid)

计算给定一群点的3D中心点,并且返回一个三维向量

pcl::computeCovarianceMatrix (const pcl::PointCloud< PointT > &cloud, const Eigen::Matrix< Scalar, 4, 1 > &centroid, Eigen::Matrix< Scalar, 3, 3 > &covariance_matrix)

计算给定的三维点云的协方差矩阵。

pcl::computeMeanAndCovarianceMatrix (const pcl::PointCloud< PointT > &cloud, Eigen::Matrix< Scalar, 3, 3 > &covariance_matrix, Eigen::Matrix< Scalar, 4, 1 > &centroid

计算正则化的3*3的协方差矩阵以及给定点云数据的中心点

pcl::demeanPointCloud (const pcl::PointCloud< PointT > &cloud_in, const Eigen::Matrix< Scalar, 4, 1 > &centroid, pcl::PointCloud< PointT > &cloud_out)

pcl::computeNDCentroid (const pcl::PointCloud< PointT > &cloud, Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > &centroid)

利用一组点的指数对其进行一般的、通用的nD中心估计。

pcl::getAngle3D (const Eigen::Vector4f &v1, const Eigen::Vector4f &v2, const bool in_degree=false)

计算两个向量之间的角度

pcl::getMeanStd (const std::vector< float > &values, double &mean, double &stddev)

同时计算给定点云数据的均值和标准方差

pcl::getPointsInBox (const pcl::PointCloud< PointT > &cloud, Eigen::Vector4f &min_pt, Eigen::Vector4f &max_pt, std::vector< int > &indices)

在给定边界的情况下,获取一组位于框中的点

pcl::getMaxDistance (const pcl::PointCloud< PointT > &cloud, const Eigen::Vector4f &pivot_pt, Eigen::Vector4f &max_pt)

给定点云数据中点与点之间的最大距离的值

pcl::getMinMax3D (const pcl::PointCloud< PointT > &cloud, PointT &min_pt, PointT &max_pt)

获取给定点云中的在XYZ轴上的最大和最小值

pcl::getCircumcircleRadius (const PointT &pa, const PointT &pb, const PointT &pc)

计算由三个点pa、pb和pc构成的三角形的外接圆半径。

pcl::getMinMax (const PointT &histogram, int len, float &min_p, float &max_p)

获取点直方图上的最小值和最大值。

pcl::calculatePolygonArea (const pcl::PointCloud< PointT > &polygon)

根据给定的多边形的点云计算多边形的面积

pcl::copyPoint (const PointInT &point_in, PointOutT &point_out)

从Point_in把字段数据赋值到Point_out

pcl::lineToLineSegment (const Eigen::VectorXf &line_a, const Eigen::VectorXf &line_b, Eigen::Vector4f &pt1_seg, Eigen::Vector4f &pt2_seg)

获取两条三维直线之间的最短三维线段

pcl::sqrPointToLineDistance (const Eigen::Vector4f &pt, const Eigen::Vector4f &line_pt, const Eigen::Vector4f &line_dir)

获取点到线的平方距离(由点和方向表示)

pcl::getMaxSegment (const pcl::PointCloud< PointT > &cloud, PointT &pmin, PointT &pmax)

在给定的一组点中获得最大分段,并返回最小和最大点。

pcl::eigen22 (const Matrix &mat, typename Matrix::Scalar &eigenvalue, Vector &eigenvector)

确定最小特征值及其对应的特征向量

pcl::computeCorrespondingEigenVector (const Matrix &mat, const typename Matrix::Scalar &eigenvalue, Vector &eigenvector)

确定对称半正定输入矩阵给定特征值对应的特征向量

pcl::eigen33 (const Matrix &mat, typename Matrix::Scalar &eigenvalue, Vector &eigenvector)

确定对称半正定输入矩阵最小特征值的特征向量和特征值

pcl::invert2x2 (const Matrix &matrix, Matrix &inverse)

计算2x2矩阵的逆。

pcl::invert3x3SymMatrix (const Matrix &matrix, Matrix &inverse)

计算3x3对称矩阵的逆。

pcl::determinant3x3Matrix (const Matrix &matrix)

计算3x3矩阵的行列式

pcl::getTransFromUnitVectorsZY (const Eigen::Vector3f &z_axis, const Eigen::Vector3f &y_direction, Eigen::Affine3f &transformation)

获得唯一 的3D旋转,将Z轴旋转成(0,0,1)Y轴旋转成(0,1,0)并且两个轴是正交的。

pcl::getTransformationFromTwoUnitVectorsAndOrigin (const Eigen::Vector3f &y_direction, const Eigen::Vector3f &z_axis, const Eigen::Vector3f &origin, Eigen::Affine3f &transformation)

得到将origin转化为(0,0,0)的变换,并将Z轴旋转成(0,0,1)和Y方向(0,1,0)

pcl::getEulerAngles (const Eigen::Transform< Scalar, 3, Eigen::Affine > &t, Scalar &roll, Scalar &pitch, Scalar &yaw)

从给定的变换矩阵中提取欧拉角

pcl::getTranslationAndEulerAngles (const Eigen::Transform< Scalar, 3, Eigen::Affine > &t, Scalar &x, Scalar &y, Scalar &z, Scalar &roll, Scalar &pitch, Scalar &yaw)

给定的转换中,提取XYZ以及欧拉角

pcl::getTransformation (float x, float y, float z, float roll, float pitch, float yaw)

从给定的平移和欧拉角创建转换矩阵

pcl::saveBinary (const Eigen::MatrixBase< Derived > &matrix, std::ostream &file)

保存或者写矩阵到一个输出流中

pcl::loadBinary (Eigen::MatrixBase< Derived > const &matrix, std::istream &file)

从输入流中读取矩阵

pcl::lineWithLineIntersection (const Eigen::VectorXf &line_a, const Eigen::VectorXf &line_b, Eigen::Vector4f &point, double sqr_eps=1e-4)

获取空间中两条三维直线作为三维点的交点。

pcl::getFieldIndex (const pcl::PCLPointCloud2 &cloud, const std::string &field_name)

获取指定字段的索引(即维度/通道)

pcl::getFieldsList (const pcl::PointCloud< PointT > &cloud)

获取给定点云中所有可用字段的列表

pcl::getFieldSize (const int datatype)

获取特定字段数据类型的大小(字节)。

pcl::concatenatePointCloud (const pcl::PCLPointCloud2 &cloud1, const pcl::PCLPointCloud2 &cloud2, pcl::PCLPointCloud2 &cloud_out)

连接 pcl::PCLPointCloud2类型的点云字段

协方差

https://baike.so.com/doc/6755352-6969935.html

协方差就是这样一种用来度量两个随机变量关系的统计量,我们可以仿照方差的定义:

来度量各个维度偏离其均值的程度,协方差可以这样来定义:

 协 方差意义:如果结果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义),也就是说一个人越猥琐越受女孩欢迎。如果结果为 负值, 就说明两者是负相关,越猥琐女孩子越讨厌。如果为0,则两者之间没有关系,猥琐不猥琐和女孩子喜不喜欢之间没有关联,就是统计上说的“相互独立”。

 这个方法在统计学中被称为主成分分析(principal components analysis),在图像处理中称为Karhunen-Loève 变换(KL-变换)。

02KDTree

PCL::KdTree

对于KdTree,其内部主要有以下成员:

  1. input_ 指向目标点云的指针
  2. indices_ 指向indices的指针
  3. epsilon_ 误差精度
  4. min_pts_ 一次可行的结果要返回的最小点的数目
  5. sorted_ 半径查询结果是否有序
  6. point_representation_ 点的表示方法

空构造函数,set,get等工具函数就不介绍了

nearestKSearch()

该函数有3个重载。

版本一接受点云,查询点在点云中的index,k,输出k近邻在点云中的indices,与这些点的平方距离。

版本二接受一个点(不一定在点云中已有)

版本三和一相同(使用默认指定点云)

如果去看代码会发现版本一和版本三不过是对版本二的包装,而版本二仅仅是一个纯虚函数而已。

nearestKSearchT()

允许接受一个类别T不同的PointTDiff,然后传给nearestKSearch的版本二。

radiusSearch()

搜索半径而不是K近邻。和K近邻搜索相同,最终会进入一个纯虚的radiusSearch()函数,只不过指定的参数从k变为radius。

里面多一个参数max_nn,默认0指定函数返回值为搜索到的点的个数。

radiusSearchT()

和上面那个差不多。

由此可见,初始版本的kd-tree只不过是一些参数的设置,最为关键的两个搜索函数是纯虚的。下面来看他的实现版本。

2 PCL::KdTreeFLANN<PointT, Dist>

KdTree的派生类。

略过构造函数。

nearestKSearch()

实际上是层层包装,调用了flann_index_内部的knnSearch函数。flann_index_是一个FLANNIndex,是::flann::Index<Dist>的别名。这么看来,pcl的KdTree搜索只是对FLANN的一层包装。

radiusSearch()同理,是对flann::Index<Dist>->radiusSearch()的封装。

换而言之,整个pcl库中的kd-tree只是对FLANN的封装。。。

3 FLANN

不想再往下走了。。。你可以在这里找到FLANN的源码。总的来说,FLANN被许多开源项目采用,而且支持多种语言,其效率应该不会差

函数重载

https://baike.so.com/doc/1130916-1196379.html

重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。不能只有函数返回值类型不同。

今日目标 - 黑马机器人 | PCL-3D点云 (czxy.com)

点云入门

今日目标

  • 能够说出点云的作用及起源

  • 点云Point Cloud是三维空间中,表达目标空间分布和目标表面特性的点的集合,点云通常可以从深度相机中直接获取,也可以从CAD等软件中生成。点云是用于表示多维点集合的数据结构,通常用于表示三维数据。在3D点云中,这些点通常代表采样表面的X,Y和Z几何坐标。当存在颜色信息时(请参见下图),点云变为4D。
  • 能够进行点云可视化操作

  • 三维图像有以下几种表现形式:深度图(描述物体与相机的距离信息),几何模型(由CAD等软件生成),点云模型(逆向工程设备采集生成)
  • 可视化Visualization

    科学计算可视化(Visualization in Scientific Computing)能够把科学数据(包括测量获得的数值、图像或者计算中设计、产生的数字信息)变为直观的、可以用以图形图像信息表示的、随时间和空间变化的物理现象或物理量。进而呈现在研究者面前,使他们可以方便的观察、模拟和计算。

  • 能够进行点云输入/输出(I/O)

  • 掌握点云分解之KdTree

  • 了解点云分解之Octree

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值