点云库pcl从入门到精通 第十章

第十章

  • 第一节 特征描述与提取的概念及相关算法
    • 3D形状内容描述子
    • 旋转图像
  • 第二节 点云特征描述与提取入门级实例
    • pcl中描述三维特征相关基础
    • 估计一个点云的法向量
      • PCA降维
      • PCA降维与SVD奇异值分解之间的关系
      • 点云法向量估计和PCA之间的关系
      • 出现的问题

https://robotica.unileon.es/index.php?title=PCL/OpenNI_tutorial_4:3D_object_recognition(descriptors)
上述PCL/OpenNI tutorial官方网页,关于这一章的各个特征点的解释写的非常好

第一节 特征描述与提取的概念及相关算法

3D形状内容描述子

比较简单,看书即可~

旋转图像

旋转图像官方解释
https://robotica.unileon.es/index.php?title=PCL/OpenNI_tutorial_4:3D_object_recognition(descriptors)#Spin_image

The Spin Image (SI) is the oldest descriptor we are going to see here. It has been around since 1997, but it still sees some use for certain applications. It was originally designed to describe surfaces made by vertices, edges and polygons, but it has been since adapted for point clouds. The descriptor is unlike all others in that the output resembles an image that can be compared with another with the usual means.
自旋图像(SI)是我们将在这里看到的最古老的描述子。它自1997年就出现了,但在某些应用中仍有一些用途。它最初设计用于描述由顶点、边和多边形构成的曲面,但后来被改编用于点云。这个描述子不同于所有其他描述子,因为这种算法形成的描述子输出类似于一个图像,可以用通常的方法与另一个图像进行比较。
The support structure used is a cylinder, centered at the point, with a given radius and height, and aligned with the normal. This cylinder is divided radially and vertically into volumes. For each one, the number of neighbors lying inside is added up, eventually producing a descriptor. Weighting and interpolation are used to improve the result. The final descriptor can be seen as a grayscale image where dark areas correspond to volumes with higher point density.
使用的支撑结构是一个圆柱体,以点为中心,具有给定的半径和高度,并与法线对齐。这个圆柱体在径向和垂直方向上被分成若干体积。对于每一个,将内部邻居的数量相加,最终生成一个描述符。使用加权和插值来改进结果。最后的描述符可以看作是灰度图像,其中暗区域对应于具有较高点密度的体积

高清大图链接:
https://robotica.unileon.es/index.php?title=File:Spin_images.png
点云库pcl从入门到精通 第十章_第1张图片
这个例子一出其实书上内容很容易理解了,需要特别注意,右边的三幅图像这个不是投影!不是投影!不是投影!,一看这样很容易就把这个错误理解成了在切平面上的投影,其实是两个概念!!!投影的话β其实已经没有了,但是这个坐标轴上是有β的!!!右边spin-image标签的图像其实就是旋转图像描述子了(Spin Image descriptor )

第二节 点云特征描述与提取入门级实例

pcl中描述三维特征相关基础

这一小节书里写的真抽象
首先我们要明确,我们在调用点云进行相应的计算时,有三个函数可供我们选择,分别是setInputCloud(),setIndice(),和setSearchSurface(),分别代表输入的点云集合,点云的索引和点云的搜索平面.因为setInputCloud()是必须的,我们每次都必须输入一个点云集合,所以对待确定的输入进行组合就变成了四种,如下图所示
点云库pcl从入门到精通 第十章_第2张图片
首先我们给定两个点云集合,P和Q,两个集合中的点分别用p1,p2…pn以及q1,q2…qm表示
依次对上述四种情况进行讨论

  • 情况1,索引和搜索平面都不给定
    这是最常见的情况,大部分时候都是只给定一个点云集合,假设给定集合P,首先pcl会给P创建一组索引,这个索引包含P中的所有点,然后依次对索引中的点进行近邻搜索,依次搜索p1邻域,然后p2邻域…直到对P中的所有点都完成邻域搜索
  • 情况2,只给定索引,不给定搜索平面
    这种情况也很常见,比如我们假设给定的索引是集合P中所有点中编号(索引)为奇数的点,p(2k+1),那么索引为偶数的点就不会被执行近邻搜索的操作.
  • 情况3,只给定搜索平面,不给定索引
    我们假设给定的搜索平面是Q,setInputCloud()输入的是P
    这种情况其实就相当于,情况2中集合P的所有点的索引都被给定了,但是是在Q上进行搜索的,不是P了
  • 情况4,给定搜索平面也给定索引
    假设给定搜索平面是Q,输入P,给定的索引是P中的编号为奇数的点
    与情况2是类似的,无非就是把情况2中对P本身的近邻搜索更换成了Q,搜索的索引还是P中编号为奇数的点

采用这四种方法的根本目的是为了节省计算,我们当然可以对吧点云的所有点都执行近邻点搜索计算,但是,在很多时候我们感兴趣的点往往只是点云中的一部分,举个例子,还是两个点集P和Q,P是从Q中筛选出来的关键点,这时候我们就可以对应情况3,把P设置为setinputcloud,Q设置为搜索平面,这样其实就相当于是对一个点云集合中的关键点执行了近邻点搜索的计算,在对关键点进行的后续计算中,大大节省了计算量.

估计一个点云的法向量

参考博客:
3D【24】PCA点云法向量估计
如何直观地理解「协方差矩阵」?
PCA(主成分分析)原理推导

b站的up同济小旭学长视频讲解PCA,SVD奇异值分解的部分也非常值得一看!

用最直观的方式告诉你:什么是主成分分析PCA
【学长小课堂】什么是奇异值分解SVD–SVD如何分解时空矩阵

PCA降维

点云库pcl从入门到精通 第十章_第3张图片

PCA降维与SVD奇异值分解之间的关系

点云库pcl从入门到精通 第十章_第4张图片

点云法向量估计和PCA之间的关系

点云库pcl从入门到精通 第十章_第5张图片

出现的问题

运行法向量估计部分的代码
在运行书中代码时候出现警告:传递给寻找包的句柄的变量名openni,与调用的包的名称pcl不一致

The package name passed to `find_package_handle_standard_args` (openni) does not match the name of the calling package (PCL).

查到的解决办法
Ubuntu18.04编译pcl时警告以及找不到vtk
https://github.com/gnuradio/gnuradio/issues/3581
https://github.com/PointCloudLibrary/pcl/issues/3680

直接忽略掉报的警告,但是这样可执行程序还是无法生成
这个错误太逆天了,竟然是因为忘记make了,实际上make一下就能解决了
下面的代码添加到CMakeLists里面就能消除这些警告了

if(NOT DEFINED CMAKE_SUPPRESS_DEVELOPER_WARNINGS)
    set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS 1 CACHE INTERNAL "No dev warnings")
endif()
if(NOT PKG_CONFIG_FOUND)
    INCLUDE(FindPkgConfig)
endif()

你可能感兴趣的:(点云库pcl从入门到精通,ubuntu,c++)