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

目标

在这一章当中,

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

理论

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

作为一种解决方案,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个问题。最后一个是使用非最大抑制来解决的。

机器学习角检测器

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

  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

转载请注明出处!!!

猜你喜欢

转载自my.oschina.net/u/3702502/blog/1815338
今日推荐