目标
在这一章当中,
- 我们将了解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
转载请注明出处!!!



所有评论(0)