PCL—低层次视觉—关键点检测(rangeImage)

  关键点又称为感兴趣的点,是低层次视觉通往高层次视觉的捷径,抑或是高层次感知对低层次处理手段的妥协。

——三维视觉关键点检测

1.关键点,线,面

  关键点=特征点;

  关键线=边缘;

  关键面=foreground;

  上述三个概念在信息学中几乎占据了统治地位。比如1维的函数(信号),有各种手段去得到某个所谓的关键点,有极值点,拐点...二维的图像,特征点提取算法是标定算法的核心(harris),边缘提取算法更是备受瞩目(canny,LOG.....),当然,对二维的图像也有区域所谓的前景分割算法用于提取感兴趣的区域,但那属于较高层次的视觉,本文不讨论。 由此可以推断,三维视觉应该同时具备:关键点,关键线,关键面三种算法。本质上,关键面算法就是我们之前一文中讨论的分割算法(三维点云不是实心的)。关于关键点更多的信息可以参考:特征检测

  ok,在这里我们了解到了,要在n维信息中提取n-1维信息是简单的,但n-2维信息会比n-1维要不稳定或者复杂的多。很容易想象,图像的边缘处理算法所得到的结果一般大同小异,但关键点提取算法的结果可以是千差万别的。主要原因是降维过大后,特征的定义很模糊,很难描述清楚对一幅图像来说,到底怎样的点才是关键点。所以,对3维点云来说,关键点的描述就更难了。点云也有1维边缘检测算法,本文不做讨论。单说说关键点提取。

2.来自点云的降维打击

  图像的Harris角点算子将图像的关键点定义为角点。角点也就是物体边缘的交点,harris算子利用角点在两个方向的灰度协方差矩阵响应都很大,来定义角点。既然关键点在二维图像中已经被成功定义且使用了,看来在三维点云中可以沿用二维图像的定义...不过今天要讲的是另外一种思路,简单粗暴,直接把三维的点云投射成二维的图像不就好了。这种投射方法叫做range_image.

  首先放上一张range_imge和点云图像的合照:

  看起来像个眼睛的那玩意就是range_image. 至于它为什么像个眼睛,就要从它的出生开始说起了。三维点云有多种采集方式,最为著名的是结构光,飞秒相机,双目视觉。简而言之,采集都离不开相机。用相机拍照当然就存在相机的光心坐标原点 Oc 以及主光轴方向 Z. 从这个点,有一种办法可以将三维数据映射到2维平面上。首先,将某点到光心Oc的距离映射成深度图的灰度或颜色(灰度只有256级但颜色却可接近连续变化)。除此之外,再定义一下怎样将点云映射到图像的横纵坐标上就可以了。

  任意一点都要和光心进行连线.....这么听起来很熟悉....好像有点像球坐标的意思。球坐标长下面这张图这样。

  

  深度图中的横,纵坐标实际上是a和phi,如果要保证沿着场景中某条直线移动,a线性变化phi却先增大后减小。这也就造成了深度图像一个眼睛一样。但这并不妨碍什么,phi没有定义的地方可以使用深度无限大来代替。

  将点云转成深度图,只需要确定一个直角坐标系,角分辨率,a范围,phi范围即可。毕竟这只是一个直角坐标转球坐标的工作而已。

  显然,图像中的关键点检测算子就可以被移植到点云特征点求取中来了。

3.基于PCL的点云-深度图转换

  

//rangeImage也是PCL的基本数据结构
pcl::RangeImage rangeImage;
//角分辨率
float angularResolution = (float) (  1.0f * (M_PI/180.0f));  //   1.0 degree in radians
//phi可以取360°
  float maxAngleWidth     = (float) (360.0f * (M_PI/180.0f));  // 360.0 degree in radians
//a取180°
  float maxAngleHeight    = (float) (180.0f * (M_PI/180.0f));  // 180.0 degree in radians
//半圆扫一圈就是整个图像了

//传感器朝向
  Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f, 0.0f);
//除了三维相机模式还可以选结构光模式
  pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;
//noise level表示的是容差率,因为1°X1°的空间内很可能不止一个点,noise level = 0则表示去最远点的距离作为像素值,如果=0.05则表示在5cm范围内求个平均距离
  float noiseLevel=0.00;
//minRange表示深度最小值,如果=0则表示取1°X1°的空间内最远点,近的都忽略
  float minRange = 0.0f;
//bordersieze表示图像周边点
  int borderSize = 1;
//基本数据结构直接打印是ok的
  std::cout << rangeImage << "\n";
时间: 2024-10-25 06:15:10

PCL—低层次视觉—关键点检测(rangeImage)的相关文章

PCL—低层次视觉—关键点检测(iss)

关键点检测往往需要和特征提取联合在一起,关键点检测的一个重要性质就是旋转不变性,也就是说,物体旋转后还能够检测出对应的关键点.不过说实话我觉的这个要求对机器人视觉来说是比较鸡肋的.因为机器人采集到的三维点云并不是一个完整的物体,没哪个相机有透视功能.机器人采集到的点云也只是一层薄薄的蒙皮.所谓的特征点又往往在变化剧烈的曲面区域,那么从不同的视角来看,变化剧烈的曲面区域很难提取到同样的关键点.想象一下一个人的面部,正面的时候鼻尖可以作为关键点,但是侧面的时候呢?会有一部分面部在阴影中,模型和之前可

PCL—低层次视觉—关键点检测(Harris)

除去NARF这种和特征检测联系比较紧密的方法外,一般来说特征检测都会对曲率变化比较剧烈的点更敏感.Harris算法是图像检测识别算法中非常重要的一个算法,其对物体姿态变化鲁棒性好,对旋转不敏感,可以很好的检测出物体的角点.甚至对于标定算法而言,HARRIS角点检测是使之能成功进行的基础. HARRIS算法的思想还是很有意思的.很聪明也很trick. 1.Harris 算法 其思想及数学推导大致如下: 1.在图像中取一个窗 w (矩形窗,高斯窗,XX窗,各种窗,某师姐要改标定算法不就可以从选Har

PCL—低层次视觉—点云分割(超体聚类)

1.超体聚类——一种来自图像的分割方法 超体(supervoxel)是一种集合,集合的元素是“体”.与体素滤波器中的体类似,其本质是一个个的小方块.与之前提到的所有分割手段不同,超体聚类的目的并不是分割出某种特定物体,其对点云实施过分割(over segmentation),将场景点云化成很多小块,并研究每个小块之间的关系.这种将更小单元合并的分割思路已经出现了有些年份了,在图像分割中,像素聚类形成超像素,以超像素关系来理解图像已经广为研究.本质上这种方法是对局部的一种总结,纹理,材质,颜色类似

PCL—低层次视觉—点云分割(RanSaC)

点云分割 点云分割可谓点云处理的精髓,也是三维图像相对二维图像最大优势的体现.不过多插一句,自Niloy J Mitra教授的Global contrast based salient region detection出现,最优分割到底鹿死谁手还不好说.暂且不论他开挂的图像处理算法,先安心做一个PCL吹~ 点云分割的目的提取点云中的不同物体,从而实现分而治之,突出重点,单独处理的目的.而在现实点云数据中,往往对场景中的物体有一定先验知识.比如:桌面墙面多半是大平面,桌上的罐子应该是圆柱体,长方体

paper 27 :图像/视觉显著性检测技术发展情况梳理(Saliency Detection、Visual Attention)

1. 早期C. Koch与S. Ullman的研究工作. 他们提出了非常有影响力的生物启发模型. C. Koch and S. Ullman . Shifts in selective visual attention: Towards the underlying neural circuitry. Human Neurobiology, 4(4):219-227, 1985. C. Koch and T. Poggio. Predicting the Visual World: Silenc

低层次“努力学习”和学习的本质

?什么是"低层次努力"? ?你把握住学习的本质了吗? ?你享受学习过程吗? 声明:本文部分引自 你这么努力,为何还如此焦虑? 1.什么是"低层次努力"? 低层次的努力,其实就是看起来很努力,一般是本身对某个事物没什么想法(方法),但又急于达到目标,所做的一系列费力不讨好.自欺欺人的无用功,是一种假性学习. 那什么是真正的努力呢?引用知乎回答 ------------------------------------------------------引用开始-----

用Face++实现人脸关键点检测

最近看了一篇很有意思的文章 http://matthewearl.github.io/2015/07/28/switching-eds-with-python/ ,本来想自己复现一下,后来发现自己太菜,用了一整天只完成了不到一半,最近要找工作了,看书看的有点烦,本来想写个有趣的代码放松下.哎. 开始正文.原作者用的是dlib的库完成关键点检测,试着装了一下,没装成,那就不用了.本来想用自己的库,后来想了下自己封装的太烂了,还是改用别人的吧,这样程序的大小也会小很多,训练好的文件还是比较大的. 首

『计算机视觉』Mask-RCNN_关键点检测分支(待续)

Github地址:Mask_RCNN 『计算机视觉』Mask-RCNN_论文学习 『计算机视觉』Mask-RCNN_项目文档翻译 『计算机视觉』Mask-RCNN_推断网络其一:总览 『计算机视觉』Mask-RCNN_推断网络其二:基于ReNet101的FPN共享网络 『计算机视觉』Mask-RCNN_推断网络其三:RPN锚框处理和Proposal生成 『计算机视觉』Mask-RCNN_推断网络其四:FPN和ROIAlign的耦合 『计算机视觉』Mask-RCNN_推断网络其五:目标检测结果精炼

三维计算机视觉 — 中层次视觉 — Point Pair Feature

机器人视觉中有一项重要人物就是从场景中提取物体的位置,姿态.图像处理算法借助Deep Learning 的东风已经在图像的物体标记领域耍的飞起了.而从三维场景中提取物体还有待研究.目前已有的思路是先提取关键点,再使用各种局部特征描述子对关键点进行描述,最后与待检测物体进行比对,得到点-点的匹配.个别文章在之后还采取了ICP对匹配结果进行优化. 对于缺乏表面纹理信息,或局部曲率变化很小,或点云本身就非常稀疏的物体,采用局部特征描述子很难有效的提取到匹配对.所以就有了所谓基于Point Pair 的