GridAdaptedFeatureDetector简述

  博客有两周没有进行更新,最近换了工作新环境需要适应工作会比较忙。端午三天假期,第一天约见之前的朋友聊了一下。希望自己写博客计划能够一直坚持下去,ok话不多说。今天上午打开电脑,该学习一下OpenCV源码中的知识点。主要学习了OpenCV函数源码中FeatureDetector中里面有一个GridAdaptedFeatureDetector类,很简单就如同英文直译过来一样:网格化自适应特征点检测。其原理比较简单:通过对输入图像进行网格划分为多个小块,然后分别对每个小块采取特征检测方式。划分块数与特征点数默认分别为:gridRows=4,gridCols=4块与maxKeyPoints=1000。(注: 此部分代码在验证阶段OpenCV-2.x可以,验证OpenCV-3.x没有发现,可能更换了代码路径)

GridAdaptedFeatureDetector源码

首先简单看一下GridAdaptedFeatureDetector类声明:
opencv识别网格交叉点 opencv网格化_其他
  从上面GridAdaptedFeatureDetector类声明构造函数可以看到:默认行列数为4即将图像均匀划分为16个小块区域,检测最大特征点数为1000。另一个detectImpl()即为Grid网格自适应主函数,具体源码如下:
opencv识别网格交叉点 opencv网格化_特征点检测_02
  从detectImpl()函数里面分析:首先对输入图像和最大特征点数入参进行判断,然后对每个子区域maxPerCell进行特征点数分布计算,最后调用内置类GridAdaptedFeatureDetectorInvoker()进行特征点检测。
opencv识别网格交叉点 opencv网格化_特征点_03
  上图为GridAdaptedFeatureDetectorInvoker类进行网格化特征点检测函数,对每个子区域检测特征点数,然后通过keepStrongest()函数获取最优的特征点数(通过每个特征点的响应值来进行排序)。最后,将每个子区域的特征点数保存输出。其代码如下:
opencv识别网格交叉点 opencv网格化_特征点检测_04

GridAdaptedFeatureDetector检测实战

下面简单看一下实验代码:
opencv识别网格交叉点 opencv网格化_特征点检测_05
  代码相对比较简单:只需要对输入字符串进行Grid+Type类型(例如: GridSIFT、GridSURF、GridFAST等)程序里面将会自动调用Grid自适应特征检测类进行特征点检测。如果你想改变Grid检测的阈值参数,那么必须直接调用GridAdaptedFeatureDetector类进行初始化来设定阈值参数。

实验结果与总结

先来看一下实验不同检测算子对比示意图:

opencv识别网格交叉点 opencv网格化_特征点检测_06

  从上述实验结果对比可以看到,采取Grid自适应划分区块检测算子的特征点分布较为均匀。实验对比最明显的如SURF检测算子是否采取Grid策略前后对比,从Grid-SURF检测可以明显看出该方法将输入图像划分16个子区域进行特征点检测。那么,可能你会疑惑为什么要进行Grid划分策略呢?

  下面来阐述一下个人的理解:其一图像进行特征点提取主要是体现该图像的主要信息,全局特征均匀分布尤其重要。如果我们只是简单的对特征点总数设定一个阈值,或许在输入图像某一块子区域会产生很多的特征,其余子区域特征很少,这样对体现全局特征分布不是很准确。其二从图像匹配的角度来看,两幅不同视差的图像进行匹配,匹配的特征点对分布越是均匀对于其估计同质矩阵越精准,同时为后续精配准也是很好的铺垫工作。

如有错误,还请指正!

参考

https://opencv.org/