特征检测(三):OpenCV中的拐角检测的FAST算法

目标

在这一章当中,html

  • 咱们将了解FAST算法的基础知识
  • 咱们将使用OpenCV功能为FAST算法找到角点。

理论

咱们看到了几个特征探测器,其中不少都很是棒。但从实时应用角度来看,它们速度不够快。一个最好的例子是SLAM(同时定位和映射)移动机器人,其计算资源有限。python

做为一种解决方案,Edward Rosten和Tom Drummond在2006年的论文“用于高速角点检测的机器学习”(稍后在2010年对其进行了修订)中提出了FAST(来自加速段测试的特征)算法。下面介绍该算法的基本概述。有关更多详细信息,请参阅原稿纸张(全部图像均取自原始纸张)。算法

使用FAST进行功能检测

  1. 选择p要识别为兴趣点的图像中的像素。让它的强度成为I_P机器学习

  2. 选择适当的阈值Ť函数

  3. 考虑围绕被测像素的16个像素的圆圈。(见下图)性能

    图像中的一个角落

  4. 如今像素p是一个角落,若是ñ在圆圈(16像素)中存在一组连续的像素,这些像素比这些都亮I_p + t或比它们都暗I_p  -  t。(在上图中显示为白色虚线)。ñ被选为12。学习

  5. 高速测试被建议将排除了大量的非角部。这个测试只检测1个,9个,5个和13个四个像素(首先测试1和9是否太亮或太暗,若是是,则检查5和13)。若是p是一个角落,那么至少有三个必须比这个更亮I_p + t或比它更暗I_p  -  t。若是这两种状况都不是这样,那么p就不能成为一个角落。而后能够经过检查圆中的全部像素,将所有分段测试标准应用于经过的候选。这种探测器自己表现出高性能,但有几个缺点:测试

    • 它不会拒绝n <12的候选人。
    • 像素的选择不是最优的,由于它的效率取决于问题的排序和角落外观的分布。
    • 高速测试的结果被抛弃。
    • 多个特征被检测为彼此相邻。

机器学习方法解决了前3个问题。最后一个是使用非最大抑制来解决的。spa

机器学习角检测器

  1. 选择一组用于训练的图像(最好来自目标应用程序域)code

  2. 在每一个图像中运行FAST算法以查找特征点。

  3. 对于每一个特征点,将它周围的16个像素存储为一个向量。为全部图像作特征向量P

  4. X这16个像素中的每一个像素(好比说)能够具备如下三种状态之一:

    FAST等式

  5. 根据这些状态,特征向量P被分为3个子集,P_DP_SP_B

  6. 定义一个新的布尔变量,K_p若是p是一个角,则为true,不然为false。

  7. 使用ID3算法(决策树分类器)使用该变量查询每一个子集以得到K_p关于真实类的知识。它选择X哪一个产生关于候选像素是不是一个角的最多信息,用熵来衡量K_p

  8. 这是递归应用于全部的子集,直到它的熵为零。

  9. 如此建立的决策树用于其余图像中的快速检测。

非最大抑制

在相邻位置检测多个兴趣点是另外一个问题。它经过使用非最大抑制来解决。

  1. 计算V全部检测到的特征点的得分函数。Vp周围像素值和16个周围像素值之间的绝对差值的总和。
  2. 考虑两个相邻的关键点并计算它们的V值。
  3. 丢弃V值较低的那个。

摘要

它比其余现有的角落探测器快几倍。

可是它对高噪声水平并不稳健。它取决于一个门槛。

OpenCV中的FAST特征检测器

它在OpenCV中被称为任何其余特征检测器。若是您愿意,您能够指定阈值,是否应用非最大抑制,要使用的邻域等。

对于邻域,定义了三个标志cv2.FAST_FEATURE_DETECTOR_TYPE_5_8cv2.FAST_FEATURE_DETECTOR_TYPE_7_12cv2.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的第二张图片:

快速关键点

其余资源

  1. Edward Rosten和Tom Drummond在第九届欧洲计算机视觉会议上的“用于高速角部检测的机器学习” 1,2006年,第430-443页。
  2. Edward Rosten,Reid Porter和Tom Drummond在IEEE Trans。上发表的“更快更好:一种机
  3. 器学习角点检测方法”。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

转载请注明出处!!!

相关文章
相关标签/搜索