原文地址:http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_fast/py_fast.html#fast-algorithm-for-corner-detection

目标


  • 理解FAST算法的基本原理
  • 使用OpenCV的FAST函数进行角点(corners)检测



原理


我们已知很多种特征检测的方法,而且它们其中很多效果都非常不错。但是,当从一个实时运行的程序角度出发,它们还不够快。一个最好的例子就是SLAM(Simultaneous Localization and Mapping)移动机器人,它的可计算资源是受限的。

作为上述问题的一个解决方法,FAST(Features from Accelerated Segment Test)算法由Edward Rosten 和 Tom Drummond在他们2006年的论文“Machine
learning for high-speed corner detection”
(在2010年再次被修订)中被提出。下面是该算法的一个基本总结。你可以参见原论文去学习更多的细节(下面所有的图片是从原论文中提取的)。



使用FAST进行特征检测


  1. 从图片中选取一个像素点,下面我们将判断它是否是一个特征点。我们首先把它的密度(即像素值)设为 
  2. 设定一个合适的阙值 
  3. 考虑该像素点周围的16个像素。(见下图)

  4. 现在,如果在这个大小为16个像素的圆上有 个连续的像素点,它们的像素值要么都比大,要么都比 小,那么它就是一个角点。(如上图中白色虚线所示)。 这里被设定为12。
  5. 我们现在应该提出一个高效的测试,来快速排除一大部分是非角点的点。该测试仅仅检查在位置1、9、5和13四个位置的像素(首先检查1和9,看它们是否亮于或暗于阙值。如果是,再检查5和13)。如果是一个角点,那么上述四个像素点中至少有3个应该必须都大于或者小于 (因为若是一个角点,超过四分之三个圆的部分应该满足判断条件,半圆比包含上述某三个点)。如果都不满足,那么不可能是一个角点。完整的分段测试可以被用于接受的所有候选点,通过检测圆上的所有点。这种检测有很好的性能,但是有一些缺点:

    1. 当n < 12时不能拒绝许多候选点。

    2. 检测出来的角点不是最优的,这是因为它的效率是依靠角点外形的排列和分布的。

    3. 

    4. 相邻的多个特征点会被检测到。

前三个问题可以使用机器学习的方法解决。最后一个可以使用non-maximal
suppression。



机器学习


  1. 选择一个图片集合进行学习(最好是来自于目标应用定义域)。
  2. 在每一张图上运行FAST算法,找到特征点。
  3. 对于每个特征点,存储它周围的16个像素点到一个vector中。为所有的图片做同样的事,得到它们所有特征点的vector

  4. 这16个像素中的每一个像素(假设为),可以有下面三种状态中的一种:

  5. 依靠这些状态,特征向量被划分为3个子集,
  6. 定义一个新的布尔变量,。如果 是一个角点,那些为真;否则为假。
  7. 使用ID3算法(决策树分类器)来查询每一个子集。
  8. 递归计算所有的子集直到它的嫡为0。
  9. 被创建的决策树就被用于其他图片的fast检测。


non-maximal suppression


从邻近的位置选取了多个特征点是另一个问题。我们可以使用non-maximal
suppression来解决。

  1. 为每一个检测到的特征点计算它的分数函数(score function), 。 是和它周围16个像素点的绝对偏差的和。
  2. 考虑两个相邻的特征点,并比较它们的值。
  3. 值较低的点将会被剔除。


总结


FAST算法比其他已知的角点检测法要快很多倍。
但是当图片的噪点较多时,它的健壮性并不好。这依靠一个阙值。



OpenCV中的FAST特征检测


和OpenCV中其他特征检测器的调用相同。如果你想,你可以指定一个阙值,或者决定是否使用non-maximal suppression来判断邻近特征点。

对于相邻特征点,OpenCV定义了三个flags:

  • cv2.FAST_FEATURE_DETECTOR_TYPE_5_8
  • cv2.FAST_FEATURE_DETECTOR_TYPE_7_12
  • cv2.FAST_FEATURE_DETECTOR_TYPE_9_16
下面是一个简单的示例代码。
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,右边则没有使用。






【OpenCV文档】用于角点检测的Fast算法的更多相关文章

  1. OpenCV-Python 用于角点检测的FAST算法 | 四十一

    目标 在本章中, 我们将了解FAST算法的基础知识. 我们将使用OpenCV功能对FAST算法进行探索. 理论 我们看到了几个特征检测器,其中很多真的很棒.但是,从实时应用程序的角度来看,它们不够快. ...

  2. opencv笔记6:角点检测

    time:2015年10月09日 星期五 23时11分58秒 # opencv笔记6:角点检测 update:从角点检测,学习图像的特征,这是后续图像跟踪.图像匹配的基础. 角点检测是什么鬼?前面一篇 ...

  3. OpenCV计算机视觉学习(13)——图像特征点检测(Harris角点检测,sift算法)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 前言 ...

  4. cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测

    参考文献----------OpenCV-Python-Toturial-中文版.pdf 参考博客----------http://www.bubuko.com/infodetail-2498014. ...

  5. SLAM: 图像角点检测的Fast算法(OpenCV文档)

    官方链接:http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_fast/py_fast.html#fast-algorithm- ...

  6. 深入学习OpenCV文档扫描及OCR识别(文档扫描,图像矫正,透视变换,OCR识别)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 下面 ...

  7. Opencv学习笔记------Harris角点检测

    image算法测试iteratoralgorithmfeatures 原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/73 ...

  8. 编译OpenCV文档

    概述 使用OpenCV的过程中经常查看文档,每次都去官网查看,不过国内访问速度很慢,有一份本地的文档就好了.本文列出了在Linux(Fedora)系统上从OpenCV源码编译出documentatio ...

  9. OpenCV教程(43) harris角的检测(1)

          计算机视觉中,我们经常要匹配两幅图像.匹配的的方式就是通过比较两幅图像中的公共特征,比如边,角,以及图像块(blob)等,来对两幅图像进行匹配.      相对于边,角更适合描述图像特征, ...

随机推荐

  1. 操作系统内存管理之 内部碎片vs外部碎片

    外部碎片:因为行程持续地被载入与置换,使得可用的记忆体空间被分割成许多不连续的区块.虽然记忆体所剩空间总和足够让新行程执行,却因为空间不连续,导致程式无法载入执行.内部碎片:发生在以固定长度分割区来进 ...

  2. LINUX逻辑卷(LVM)管理与逻辑卷分区

    LINUX之逻辑卷管理与逻辑卷扩展 LVM是逻辑卷管理(Logical Volume Manager)的简称,他是建立在物理存储设备之上的一个抽象层,允许你生成逻辑存储卷,和直接使用物理存储在管理上相 ...

  3. 解决IE6下select显示在弹出框上问题

    利用定位position:absolute;z-index:1;和iframe[z-index:-1]来解决此问题,最好根据需要加上: border='0' frameborder='0' scrol ...

  4. ubuntu 卸载从源码安装的 emacs

    由于配置问题想卸了重装. 解压并进入你的源码所在目录: ./configure sudo make uninstall Done Reference: http://askubuntu.com/que ...

  5. 谈谈Circuit Breaker在.NET Core中的简单应用

    前言 由于微服务的盛行,不少公司都将原来细粒度比较大的服务拆分成多个小的服务,让每个小服务做好自己的事即可. 经过拆分之后,就避免不了服务之间的相互调用问题!如果调用没有处理好,就有可能造成整个系统的 ...

  6. Java程序员的现代RPC指南

    Java程序员的现代RPC指南 1.前言 1.1 RPC框架简介 最早接触RPC还是初学Java时,直接用Socket API传东西好麻烦.于是发现了JDK直接支持的RMI,然后就用得不亦乐乎,各种大 ...

  7. Bootstrap3 栅格系统-实例:响应列重置(Responsive column resets)

    四层的网格你肯定会遇到问题,可用在特定的断点,你的列不清楚作为一个比另一个高完全正确.为了解决这个问题,结合使用.clearfix和响应的实用工具类. <div class="row& ...

  8. 自写JQ控件-树状菜单控件[demo下载]

    一个多月没有写博客了,最近也弄一个基于JQ的树状菜单控件,在此分享给大家.另外呢,通过这个例子分享一下怎么写JQ控件的. 事实上工作中,也是经常遇到的,有些时候自己想实现一些前端效果,用网上一些插件吧 ...

  9. 六星经典CSAPP-笔记(10)系统IO

    六星经典CSAPP-笔记(10)系统I/O 1.Unix I/O 所有语言的运行时系统都提供了高抽象层次的I/O操作函数.例如,ANSI C在标准I/O库中提供了诸如printf和scanf等I/O缓 ...

  10. 【mybatis深度历险系列】深入浅出mybatis中原始dao的开发和mapper代理开发

    使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法.mybatis在进行dao开发的时候,涉及到三姐妹,分别是SqlSessionFactoryBuilder ...