【翻译:OpenCV-Python教程】角点检测的快速(FAST)算法

⚠️由于自己的拖延症,3.4.3翻到一半,OpenCV发布了4.0.1了正式版,所以接下来是按照4.0.1翻译的。

⚠️除了版本之外,其他还是照旧,FAST Algorithm for Corner Detection,附原文。

目标

在本章,

  • 我们将了解快速(FAST)算法的基础知识
  • 我们将使用OpenCV的快速算法函数找到的角点。

理论

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

作为一个解决方案,在2006年 (后来在2010年修订) Edward Rosten 和 Tom Drummond 在他们的论文"Machine learning for high-speed corner detection"里推荐FAST (Features from Accelerated Segment Test) 算法。下面给出了该算法的基本概述。详情请参阅原论文(所有图片均取自原论文)。

使用FAST算法做特征检测

  1. 在图像中选择要识别为兴趣点,或不识别为兴趣点的像素p。设其强度为Ip。
  2. 选择合适的阈值t。
  3. 想象在测试的像素周围有一个16像素的圆。(见下图)

    【翻译:OpenCV-Python教程】角点检测的快速(FAST)算法_第1张图片

  4. 现在,如果圆中存在一组n个连续像素(在这16个像素中),都比Ip+t亮,或者都比Ip-t暗(如上图中白色虚线所示),那么像素p就被认为是一个角点。n被选为12。
  5. 一个 高速检测(角点)的方案 被提出,用于排除大量的非角点。这项检测只检查1、9、5和13的4个像素(首先测试1和9,如果1和9太亮或太暗,那么再检查5和13)。如果p是一个角点,那么至少有三个角必须比Ip+t亮或者比Ip-t暗,如果不是这样的情况,那么p就肯定不会是角点。然后,通过检查圆形中的所有像素,可以将完整的片段测试标准应用于通过测试的候选对象。(译者注:先用4点检测排除大量非角点,再用16点检测筛选出角点。)这种检测器本身具有很高的性能,但也存在一些缺点:
    • n < 12的时候,大量的点会被错误的判定为角点。
    • 像素的选择不是最优的,因为它的效率取决于问题的排序和角的外观分布。
    • 高速检测(4点检测)的结果被丢弃。
    • 检测到多个相邻的特征。

前三点是用机器学习方法处理的。最后一个问题使用非极大抑制来解决。

机器学习的角点检测

  1. 选择一组用于训练的图像(最好来自目标应用域)
  2. 对每一张图像都运行 FAST 算法来找出特征点。
  3. 对每一个特征点,以向量形式保存其周围一圈的16像素点。对所有图像都做此操作,来获取特征向量P。
  4. 这16个像素中的每个像素(比方说x)可以有以下三种状态之一:

    【翻译:OpenCV-Python教程】角点检测的快速(FAST)算法_第2张图片

     

  5. 根据这些状态,特征向量P被细分为3个子集,Pd,Ps,Pb。
  6. 定义一个新的布尔值,Kp,如果p是角点,则为真,否则为假。
  7. 使用 ID3 算法 (决策树算法),来查询每一个子集,用Kp的值来作为分类标签。以Kp的熵来衡量,它选出特征x,x最能产生关于候选像素点是否是角点的信息。(译者注:也就说算出特征x,x是所有特征中最能决定该点是不是角点的特征。按决策树的说法就是按x切分能产生最大的信息增益。详情请了解ID3决策树。)
  8. 这个方案递归地应用到所有的(按特征x切分后)子集,直到它的熵为零。(译者注:这些都是ID3的一部分。)
  9. 这样创建的决策树用于其他图像的快速检测。

非极大抑制

(只按当前的方式,)会检测到相邻位置的多个兴趣点是另外一个问题。采用非最大抑制法来解决。

  1. 对所有检测到的特征点,计算一个积分函数V,V是p点与周围16个像素值的绝对差之和。
  2. 考虑两个相邻的关键点,并且计算它们的V值。
  3. 丢弃V值较小的那一个。

摘要

这个算法比现在存在的角点检测算法快好几倍。

但如果有高级的噪音干扰,它就没那么健壮了。它依赖一个合适的阈值。

OpenCV里的FAST特征检测算法

它在OpenCV中被称为“任何其他特征”检测器。如果需要,可以指定阈值、是否应用非最大抑制、使用的邻域等。

对于邻域,定义了三个标识。cv.FAST_FEATURE_DETECTOR_TYPE_5_8,cv.FAST_FEATURE_DETECTOR_TYPE_7_12 以及 cv.FAST_FEATURE_DETECTOR_TYPE_9_16。下面是一段关于如何检测和绘制快速特征点的简单的代码。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('simple.jpg',0)
# Initiate FAST object with default values
fast = cv.FastFeatureDetector_create()
# find and draw the keypoints
kp = fast.detect(img,None)
img2 = cv.drawKeypoints(img, kp, None, color=(255,0,0))
# Print all default params
print( "Threshold: {}".format(fast.getThreshold()) )
print( "nonmaxSuppression:{}".format(fast.getNonmaxSuppression()) )
print( "neighborhood: {}".format(fast.getType()) )
print( "Total Keypoints with nonmaxSuppression: {}".format(len(kp)) )
cv.imwrite('fast_true.png',img2)
# Disable nonmaxSuppression
fast.setNonmaxSuppression(0)
kp = fast.detect(img,None)
print( "Total Keypoints without nonmaxSuppression: {}".format(len(kp)) )
img3 = cv.drawKeypoints(img, kp, None, color=(255,0,0))
cv.imwrite('fast_false.png',img3)

看结果。第一张图像显示了带非极大值抑制的FAST算法,而第二张图不带非极大值抑制。

【翻译:OpenCV-Python教程】角点检测的快速(FAST)算法_第3张图片

额外资源

  1. Edward Rosten 和 Tom Drummond, “Machine learning for high speed corner detection”第九届欧洲计算机视觉大会,2006年第1卷,第430-443页。
  2. Edward Rosten,Reid Porter,和 Tom Drummond,"Faster and better: a machine learning approach to corner detection" in IEEE Trans. 模式分析和机器智能,2010年,32章,105-119页。

练习


上篇:【翻译:OpenCV-Python教程】SURF (Speeded-Up Robust Features) 介绍

下篇:【翻译:OpenCV-Python教程】二元健壮独立基础特征

你可能感兴趣的:(OpenCV,翻译,计算机视觉,人工智能,4.0.1,中文文档,OpenCV)