OpenCV学习之DynamicAdaptedFeatureDetector

DynamicAdaptedFeatureDetector简述

  图像处理领域中,阈值参数一直都是很难解决的问题。主要原因在于针对不同的需求要设置不同的阈值参数来达到比较满意的结果。典型的例如:图像中角点检测阈值的设置。阈值太大或者太小都会导致检测角点数目要么过多或者过少。检测过多的角点肯定存在许多重复的点,过少的点会导致后续的匹配等信息不够等问题。所以,目前来看许多都是已实验结果的经验值来进行设置阈值参数。今天研究OpenCV源码中,发现feature2d.hpp下面的dynamic.cpp文件就是动态特征检测的源码部分,出于好奇进行源码的简单分析与研究。

DynamicAdaptedFeatureDetector源码分析

  打开OpenCV源码dynamic.cpp中含有三种动态特征点检测算子:FAST、SURF、STAR三种。其中FastAdjuster、SurfAdjuster、StarAdjuster类继承抽象类AdjusterAdapter,通过AdjusterAdapter类指针传递方式与DynamicAdapterdFeatureDetector进行交互。当然类AdjusterAdapter与DynamicAdapterdFeatureDetector都继承于特征检测FeatureDetector基类。

首先来看一下DynamicAdapterdFeatureDetector类:

  上图贴出的DynamicAdapterdFeatureDetector可以发现比较简单:构造函数中传递四个参数,其中后三个为缺省参数类型,min_features、max_features为提取特征点最大最小数量, max_iters为迭代次数,adjuster为自适应特征检测的类型指针变量。拷贝构造函数与赋值函数声明私有类型,即外部无法进行拷贝操作。

下面分别看一下FastAdjuster、SurfAdjuster、StarAdjuster特征检测器类:

  FastAdjuster类为FAST角点检测算子的自适应,其中构造函数FastAdjuster()初始化参数分别为初始阈值、非极大值抑制、最大最小阈值进行设定。twoFew()与tooMany()两个函数即对检测到的特征点数进行判别与初始设定的范围,如果超出范围则根据检测的点数来动态改变阈值大小。通过循环迭代来改变阈值再次进行检测判断,这就是动态检测特征的主要原理。

  关于SurfAdjuster、StarAdjuster类中tooFew()、tooMany()函数功能都是修改阈值来适应检测特征点。

以下为SurfAdjuster中检测源码:

  可以看到,检测SURF还是采取FeatureDetector中的SURF算子,只是对于特征点数量通过动态自适应改变阈值来进行控制特征数。同样,我们来看一下StarAdjuster检测代码:

实现采取StarFeatureDetector检测算子,阈值改变与SurfAdjuster一致。

  以上分别介绍三种自适应检测算子,还没有对DynamicAdapterdFeatureDetector类的检测部分源码进行分析,下面贴出其代码:

  上图代码逻辑较为清晰,就不进行分析了。说了这么多,那么该如何进行适应动态特征点检测算子呢,请看下面的具体实战代码……

DynamicAdaptedFeatureDetector实践代码


  将上述代买中输入字符FAST替换为SURF或者STAR就自动切换至SURF动态特征检测或者STAR动态特征检测模式,其函数内部已经为我们定义好了方式调用,只需你输入想要检测算子名称。最后,简单瞄一眼接受动态检测的特征提取方式有如下三种。

实验结果


  简单实践一下FASTX角点与FastAdjuster角点检测结果对比,视觉上来评估可以清晰看出FastAdjuster角点检测效果较FASTX较好,去除大量邻近重复点对。至于进行标准的角点检测评估,等待下回研究其评估角点算子方式。如有错误,还请指正!

参考

https://opencv.org/
http://www.edwardrosten.com/work/fast.html
https://docs.opencv.org/3.1.0/df/dd2/tutorial_py_surf_intro.html
http://www.vision.ee.ethz.ch/~surf/

猜你喜欢

转载自blog.csdn.net/Small_Munich/article/details/80558178
今日推荐