比较OpenCV的特征检测算法

关于OpenCV的学习,敬请关注专栏: 一步步学习OpenCV2


=================分割线=================


原文发布时间:2011年1月4日

原文地址:https://computer-vision-talks.com/post/2011-01-04-comparison-of-the-opencv-feature-detection-algorithms/

=================以下是对原文翻译部分=================

介绍

“在计算机视觉和图像处理中,特征检测的概念指的是旨在计算图像信息的抽象并在每个图像点进行局部判定的方法,无论此时是否存在给定类型的图像特征。所得到的特征将是图像域的子集,通常以孤立点,连续曲线或连接区域的形式出现。

维基百科

更新:这是更新后添加新的检测器(ORB和SIFT)。  

概观

OpenCV是一个免费的开源库,用于图像处理,计算机视觉和机器学习领域。它有大量不同的算法,但在这个话题中,我将比较他们现有的特征检测器。此时OpenCV有稳定的2.2版本和以下类型的描述符:FastGoodFeaturesToTrackMserStarSiftSurf几乎没有适配器超过探测器:GridAdapted,PyramidAdapted,DynamicAdapted。在这篇文章中,上面提到的探测器将通过速度,质量和重复性在不同的照明和尺度上进行比较。

测试图像

   

所有图像是512x512大小。处理是在灰度图像上完成的。

=========================分割线=================================

标准

速度 - 实时图像处理的最重要标准。要实现平滑的实时处理,您的代码必须在不到30毫秒内处理单帧!对于酷睿i7处理器的四核来说,这已经足够了,但是想象一下,你的代码将会运行在移动设备上,运算能力要低十倍。我们将测试我们的探测器在笔记本电脑CPU和移动处理器上的速度。

测试案例:检测给定图像上的特征点并测量花费的时间。

质量检测功能通常用于进一步跟踪或匹配(SLAM,全景拼接,对象检测等)。所以“功能消费者”希望检测到的功能足够好。将使用SIFT和SURF描述符检测探测器的光学流KLT跟踪和两帧匹配。对于跟踪测试,我将对原始图像应用一些仿射变换,并在之前的关键点上进行检测。利用变换的图像和变换的关键点,我们可以估计跟踪的质量。

这里是截图展示转换的图像和功能的轨迹。

   

**照明和比例不变 - **特征检测器可以检测一个物体的大或小图像上的相同特征。对于照明也是如此 - 轻微的亮度和对比度波动不应该显着影响特征检测器。几乎所有现代相机都具有自动增益控制功能,可以自动调整曝光,以避免图像中曝光过度或曝光不足的区域。强大的检测对于进一步处理至关重要。

这里是解释截图:

 

正如你所看到的,每一对的第二张照片稍微亮一些。该测试模拟许多现代网络摄像机的自动摄像机增益选项。

=========================分割线=================================

估计标记

每帧速度 - 以单位毫秒为单位检测单帧的绝对总时间。

每个关键点的速度 - 单个关键点的检测时间。评估为总时间除以检测到的关键点的数量。帮助我们估计实际检测的便宜程度。

跟踪功能的百分比 - 从原始图像到已转换图像的成功跟踪功能的百分比在理想的情况下,这个标记的价值应该接近100%。

平均跟踪误差 - 这是跟踪特征位置与其在变换帧上的计算位置之间的平均距离。该标记指示特征检测的准确性。较大的值表示帧之间大量的误报跟踪或特征点“漂移”。

特征计数偏差 - 参考帧上的关键点数与经过转换的帧上检测到的关键点数之差除以参考帧上的关键点数。帮助估计轻微的曝光变化如何影响特征检测。

平均检测误差 - 原始和变换帧上最近的关键点之间的平均距离。

=========================分割线=================================

测试硬件配置

我们将测试两种配置的特征检测器 - 笔记本电脑和移动设备在相同的数据集上,以比较性能,并确保两个平台的检测结果相同。 

  MacBook Pro iPhone 3GS

CPU Model Core 2 Duo T7400 ARM Cortex A8

CPU Clock 2160 MHz 600 MHz

CPU Cores number 2 1

===========================分割线=================================

结果

我们从检测到的特征点的数量开始我们的分析。在下面的图表中,我们看到FAST检测器找到了数千个关键点,而其他检测器只能找到数百个关键点。与其他检测器不同,FAST检测到的关键点可能包含太多的“噪音”特征 - 这不适合进一步追踪。


将使用两个标准来检查特征检测的速度 - 按整个帧检测关键点的总时间和每个关键点的总时间除以检测到的关键点的时间。正如预期的那样,FAST检测器可以提供最佳的检测时间。


最后,最后的性能测试 - 移动设备上的特征检测器有多快?这里是四个图表(四个不同的图像),将回答这个问题:





从上图可以看出,在移动平台上,所有功能探测器的工作速度比台式机慢3-5倍。所以没有对具体处理器的体系结构进行优化,不能实现实时性能(见结论)。

现在进行质量评估。以下图表显示了参考帧之间的平均跟踪误差(以像素为单位)并进行了轻微的变换 使用金字塔KLT跟踪器(cvCalcOpticalFlowPyrLK)。STAR(也称为CenSurE)探测器找到了比其他探测器更好的跟踪关键点。


下面的图表为我们提供了关于成功跟踪了多少功能的信息。除MSER探测器外,所有探测器都提供了非常好的特征点,对于所有测试图像来说,其分数都小于其他探测器。


最后一张图表显示了特征检测器如何随亮度变化而变化。STAR和MSER检测器对亮度变化非常敏感,而其他检测器则不是。


=========================分割线============================

结论

特征检测器的选择非常依赖于一个问题。例如,如果您使用单眼SLAM,FAST探测器是首选武器,因为它速度快,可以检测到很多特征。对于图像拼接,模式识别和其他特征描述符相关的任务,比例尺和旋转不变探测器是最好的。

对于桌面应用程序,几乎所有的功能检测器都能保证实时(25 fps +)的性能。但是对于移动设备,最快的检测器(FAST)只能工作在〜10fps。为什么有这么大的差别 首先,笔记本电脑的CPU功能更强大。而且,缓存大小和处理器体系结构也很重要。OpenCV支持SSE / SSE2 / SSE3内部指令,由于指令向量化,可以处理10倍的加速。不幸的是,OpenCV仅支持x86体系结构的内部指令。有ARM NEON SIMD引擎,理论上可以帮助我们显着提高移动平台上的特征检测性能。但这需要很多经验和CPU架构的低级知识。我将在后面的文章中展示NEON固有的好处。

本文仅重点介绍特征检测问题的一些性能和质量方面。我强烈建议您阅读文章“ 局部不变特征检测器:一项调查 ”,以获得更多有关不同特征检测器如何工作的知识。

=====================================END==================================

猜你喜欢

转载自blog.csdn.net/sinat_36264666/article/details/78869283