在这一章当中,html
咱们看到了几个特征探测器,其中不少都很是棒。但从实时应用角度来看,它们速度不够快。一个最好的例子是SLAM(同时定位和映射)移动机器人,其计算资源有限。python
做为一种解决方案,Edward Rosten和Tom Drummond在2006年的论文“用于高速角点检测的机器学习”(稍后在2010年对其进行了修订)中提出了FAST(来自加速段测试的特征)算法。下面介绍该算法的基本概述。有关更多详细信息,请参阅原稿纸张(全部图像均取自原始纸张)。算法
选择要识别为兴趣点的图像中的像素。让它的强度成为
。机器学习
选择适当的阈值。函数
考虑围绕被测像素的16个像素的圆圈。(见下图)性能
如今像素是一个角落,若是
在圆圈(16像素)中存在一组连续的像素,这些像素比这些都亮
或比它们都暗
。(在上图中显示为白色虚线)。
被选为12。学习
甲高速测试被建议将排除了大量的非角部。这个测试只检测1个,9个,5个和13个四个像素(首先测试1和9是否太亮或太暗,若是是,则检查5和13)。若是是一个角落,那么至少有三个必须比这个更亮
或比它更暗
。若是这两种状况都不是这样,那么
就不能成为一个角落。而后能够经过检查圆中的全部像素,将所有分段测试标准应用于经过的候选。这种探测器自己表现出高性能,但有几个缺点:测试
- 它不会拒绝n <12的候选人。
- 像素的选择不是最优的,由于它的效率取决于问题的排序和角落外观的分布。
- 高速测试的结果被抛弃。
- 多个特征被检测为彼此相邻。
机器学习方法解决了前3个问题。最后一个是使用非最大抑制来解决的。spa
选择一组用于训练的图像(最好来自目标应用程序域)code
在每一个图像中运行FAST算法以查找特征点。
对于每一个特征点,将它周围的16个像素存储为一个向量。为全部图像作特征向量。
这16个像素中的每一个像素(好比说)能够具备如下三种状态之一:
根据这些状态,特征向量被分为3个子集,
,
,
。
定义一个新的布尔变量,若是
是一个角,则为true,不然为false。
使用ID3算法(决策树分类器)使用该变量查询每一个子集以得到关于真实类的知识。它选择
哪一个产生关于候选像素是不是一个角的最多信息,用熵来衡量
。
这是递归应用于全部的子集,直到它的熵为零。
如此建立的决策树用于其余图像中的快速检测。
在相邻位置检测多个兴趣点是另外一个问题。它经过使用非最大抑制来解决。
它比其余现有的角落探测器快几倍。
可是它对高噪声水平并不稳健。它取决于一个门槛。
它在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的第二张图片:
参考:
http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_fast/py_fast.html
转载请注明出处!!!