目标
在这一章当中,
- 我们将了解FAST算法的基础知识
- 我们将使用OpenCV功能为FAST算法找到角点。
理论
我们看到了几个特征探测器,其中很多都非常棒。但从实时应用角度来看,它们速度不够快。一个最好的例子是SLAM(同时定位和映射)移动机器人,其计算资源有限。
作为一种解决方案,Edward Rosten和Tom Drummond在2006年的论文“用于高速角点检测的机器学习”(稍后在2010年对其进行了修订)中提出了FAST(来自加速段测试的特征)算法。下面介绍该算法的基本概述。有关更多详细信息,请参阅原稿纸张(所有图像均取自原始纸张)。
使用FAST进行功能检测
-
选择要识别为兴趣点的图像中的像素。让它的强度成为。
-
选择适当的阈值。
-
考虑围绕被测像素的16个像素的圆圈。(见下图)
-
现在像素是一个角落,如果在圆圈(16像素)中存在一组连续的像素,这些像素比这些都亮或比它们都暗。(在上图中显示为白色虚线)。被选为12。
-
甲高速测试被建议将排除了大量的非角部。这个测试只检测1个,9个,5个和13个四个像素(首先测试1和9是否太亮或太暗,如果是,则检查5和13)。如果是一个角落,那么至少有三个必须比这个更亮或比它更暗。如果这两种情况都不是这样,那么就不能成为一个角落。然后可以通过检查圆中的所有像素,将全部分段测试标准应用于通过的候选。这种探测器本身表现出高性能,但有几个缺点:
- 它不会拒绝n <12的候选人。
- 像素的选择不是最优的,因为它的效率取决于问题的排序和角落外观的分布。
- 高速测试的结果被抛弃。
- 多个特征被检测为彼此相邻。
机器学习方法解决了前3个问题。最后一个是使用非最大抑制来解决的。
机器学习角检测器
-
选择一组用于训练的图像(最好来自目标应用程序域)
-
在每个图像中运行FAST算法以查找特征点。
-
对于每个特征点,将它周围的16个像素存储为一个向量。为所有图像做特征向量。
-
这16个像素中的每个像素(比如说)可以具有以下三种状态之一:
-
根据这些状态,特征向量被分为3个子集,,,。
-
定义一个新的布尔变量,如果是一个角,则为true,否则为false。
-
使用ID3算法(决策树分类器)使用该变量查询每个子集以获得关于真实类的知识。它选择哪个产生关于候选像素是否是一个角的最多信息,用熵来衡量。
-
这是递归应用于所有的子集,直到它的熵为零。
-
如此创建的决策树用于其他图像中的快速检测。
非最大抑制
在相邻位置检测多个兴趣点是另一个问题。它通过使用非最大抑制来解决。
- 计算所有检测到的特征点的得分函数。是周围像素值和16个周围像素值之间的绝对差值的总和。
- 考虑两个相邻的关键点并计算它们的值。
- 丢弃值较低的那个。
摘要
它比其他现有的角落探测器快几倍。
但是它对高噪声水平并不稳健。它取决于一个门槛。
OpenCV中的FAST特征检测器
它在OpenCV中被称为任何其他特征检测器。如果您愿意,您可以指定阈值,是否应用非最大抑制,要使用的邻域等。
对于邻域,定义了三个标志cv2.FAST_FEATURE_DETECTOR_TYPE_5_8
,cv2.FAST_FEATURE_DETECTOR_TYPE_7_12
和cv2.FAST_FEATURE_DETECTOR_TYPE_9_16
。以下是关于如何检测和绘制FAST特征点的简单代码。
import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread('simple.jpg',0) # Initiate FAST object with default values fast = cv2.FastFeatureDetector() # find and draw the keypoints kp = fast.detect(img,None) img2 = cv2.drawKeypoints(img, kp, color=(255,0,0)) # Print all default params print "Threshold: ", fast.getInt('threshold') print "nonmaxSuppression: ", fast.getBool('nonmaxSuppression') print "neighborhood: ", fast.getInt('type') print "Total Keypoints with nonmaxSuppression: ", len(kp) cv2.imwrite('fast_true.png',img2) # Disable nonmaxSuppression fast.setBool('nonmaxSuppression',0) kp = fast.detect(img,None) print "Total Keypoints without nonmaxSuppression: ", len(kp) img3 = cv2.drawKeypoints(img, kp, color=(255,0,0)) cv2.imwrite('fast_false.png',img3)
查看结果。第一张图片显示了使用nonmaxSuppression的FAST和没有nonmaxSuppression的第二张图片:
其他资源
- Edward Rosten和Tom Drummond在第九届欧洲计算机视觉会议上的“用于高速角部检测的机器学习” 1,2006年,第430-443页。
- Edward Rosten,Reid Porter和Tom Drummond在IEEE Trans。上发表的“更快更好:一种机
- 器学习角点检测方法”。Pattern Analysis and Machine Intelligence,2010,第32卷,第105-119页。
参考:
http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_fast/py_fast.html
转载请注明出处!!!