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

原文链接:http://blog.csdn.net/candycat1992/article/details/22285979

本文做了少量修改,并添加了C++代码,若有疑问或者版权问题,请拜读作者或者通知本人。

目标

  • 理解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. 从图片中选取一个像素点Pi,下面我们将判断它是否是一个特征点。我们首先把它的密度(即像素值)设为I_p。
  2. 设定一个合适的阙值T。
  3. 考虑该像素点周围的16个像素。(见下图)
  4. 现在,如果在这个大小为16个像素的圆上有n 个连续的像素点,它们的像素值要么都比I_p+T大,要么都比I_p-T小,那么它就是一个角点。(如上图中白色虚线所示)。n 这里被设定为12。
  5. 我们现在应该提出一个高效的测试,来快速排除一大部分是非角点的点。该测试仅仅检查在位置1、9、5和13四个位置的像素(首先检查1和9,看它们是否亮于或暗于阙值。如果是,再检查5和13)。如果Pi是一个角点,那么上述四个像素点中至少有3个应该必须都大于I_p +T 或者小于I_p- T(因为若是一个角点,超过四分之三个圆的部分应该满足判断条件,半圆比包含上述某三个点)。如果都不满足,那么Pi 不可能是一个角点。完整的分段测试可以被用于接受的所有候选点,通过检测圆上的所有点。这种检测有很好的性能,但是有一些缺点:
    1. 当n < 12时不能拒绝许多候选点。
    2. 检测出来的角点不是最优的,这是因为它的效率是依靠角点外形的排列和分布的。
    3. 
    4. 相邻的多个特征点会被检测到
前三个问题可以使用机器学习的方法解决。最后一个可以使用non-maximal suppression

机器学习

  1. 选择一个图片集合进行学习(最好是来自于目标应用定义域)。
  2. 在每一张图上运行FAST算法,找到特征点。
  3. 对于每个特征点,存储它周围的16个像素点到一个vector中。为所有的图片做同样的事,得到它们所有特征点的vector P。
  4. 这16个像素中的每一个像素(假设为x),可以有下面三种状态中的一种:
  5. 依靠这些状态,特征向量P被划分为3个子集,P_d,P_s,P_b。
  6. 定义一个新的布尔变量,K_p。如果P是一个角点,那些K_p为真;否则为假。
  7. 使用ID3算法(决策树分类器)来查询每一个子集。
  8. 递归计算所有的子集直到它的嫡为0。
  9. 被创建的决策树就被用于其他图片的fast检测。

non-maximal suppression

从邻近的位置选取了多个特征点是另一个问题。我们可以使用non-maximal suppression来解决。
  1. 为每一个检测到的特征点计算它的分数函数(score function),V。V是 P 和它周围16个像素点的绝对偏差的和。
  2. 考虑两个相邻的特征点,并比较它们的v值。
  3. v 值较低的点将会被剔除。

总结

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
下面是一个简单的示例代码(Python)。
    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)  

C++代码段:

int CEkfSlam::fast_corner_detect_9(cv::Mat &im,  double  threshold, std::vector<CvPoint>  &coords)
{//提取快速角点//一次只提取一个角点?//且有时可能会不发现角点,可能一次有多个角点cv::Mat  image(im.rows, im.cols, 1);if (3== im.channels() ){cv::cvtColor (im,image,CV_BGR2GRAY);  }else{image =im.clone();}//快速角点检测  std::vector<cv::KeyPoint>  keypoints;  cv::FAST(image,keypoints,threshold,true);  //默认开启极大值抑制!coords.resize(keypoints.size() );//cv::imshow("kp",image);cv::waitKey(0);for (int i=0;i< keypoints.size();++i){coords[i].x =keypoints[i].pt.x;coords[i].y =keypoints[i].pt.y;}return 1;
}

值得注意的是,下面的写法会出现内存问题:

cv::FastFeatureDetector fast(threshold, true);
fast.detect(image, allKeypoints[0]);</del>

下面是测试结果。左边是使用了nonmaxSuppression的FAST,右边则没有使用。

 

SLAM: 图像角点检测的Fast算法(OpenCV文档)相关推荐

  1. SLAM: 图像角点检测的Fast算法(时间阈值实验)

    作为角点检测的一种快速方法,FastCornerDetect算法比Harris方法.SIft方法都要快一些,应用于实时性要求较高的场合,可以直接应用于SLAM的随机匹配过程.算法来源于2006年的Ed ...

  2. 永磁同步电机的MTPA最大转矩电流比控制算法的仿真模型,有详细的算法设计文档

    永磁同步电机的MTPA最大转矩电流比控制算法的仿真模型,有详细的算法设计文档. 永磁同步电机的数学模型: 永磁同步电机的矢量控制原理: 最大转矩电流比控制: 前馈补偿提高抗负载扰动性能: 弱磁控制: ...

  3. JCJC错别字检测系统API接口使用文档-错别字检测接口说明

    JCJC错别字检测系统API接口使用文档-错别字检测接口说明 用户在使用API接口进行错别字检测时,应该留意以下问题: 一.JCJC错别字检测支持:JSON POST 和 表单 FORM POST 两 ...

  4. JCJC错别字检测系统API接口使用文档-添加黑名单、白名单词汇

    JCJC错别字检测系统API接口使用文档-添加黑名单.白名单词汇 1.地址前缀:http://IP:PORT/spellcheck/ 2.所有的接口调用:请使用 HTTP POST 方法,不支持 GE ...

  5. 震惊!阿里P8爆出学透这份算法面试文档后,任何大厂算法都是小意思

    为什么要学习数据结构和算法? 随着应用程序变得越来越复杂和数据越来越丰富,几百万.几十亿甚至几百亿的数据就会出现,而对这么大对数据进行搜索.插入或者排序等的操作就越来越慢,数据结构就是用来解决这些问题 ...

  6. OpenCV系列之用于角点检测的FAST算法 | 四十一

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

  7. 用于角点检测的FAST算法

    使用FAST进行特征检测 1.选择图像中是否要识别为兴趣点的像素ppp,使其强度为IpI_pIp​ 2.选择适当的阈值ttt 3.考虑被测像素周围有16个像素的圆圈.(见下图) 4.现在,如果圆中存在 ...

  8. 深入学习OpenCV文档扫描OCR识别及答题卡识别判卷(文档扫描,图像矫正,透视变换,OCR识别)

    人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力.FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台.每周免费提供 ...

  9. SLAM学习--视觉slam学习教材推荐(附相关技术文档下载链接)

    (理论上看完前三本,足够掌握视觉slam的所有理论知识,实践部分参考各种开源代码) 一.<视觉slam十四讲>,高翔,清华大学出版社,(目前已出第二版,优先推荐) 以上教材,其实是基于国外 ...

最新文章

  1. 如何使用TensorFlow中的Dataset API
  2. c语言int64编译时错误,错误:编译C程序时未在此作用域中声明uint64_t
  3. regasm注册com组件
  4. 一个4体低位交叉的存储器_GD25Q16CSIG|NRAM存储器的原理及优势是什么?
  5. java运行时异常的特点是什么_Java运行时异常和非运行时异常
  6. 使用directX 7结合C#进行2D游戏编程
  7. 用node-webkit开发多平台的桌面客户端
  8. 编写高质量代码改善C#程序的157个建议——建议9: 习惯重载运算符
  9. XMLHttpRequest.responseType
  10. 威联通 Qnap PK 群晖 Synology 安全篇3
  11. python的复数实部和虚部都是整数_python基本输入输出函数与变量类型
  12. gstreamer gst-launch 记录 原理
  13. Windows10 LTSB/LTSC版安装应用商店与UWP
  14. miui patchrom项目 生成原厂包问题 /卡死现象For MTK CPU
  15. python给成绩表加上姓名列_Python Pandas 基本操作教学之成绩表
  16. 天荒地老修仙功-第七部:Dubbo基本使用与原理详解
  17. pandas数据分析常用的一些方法
  18. 14个程序员常去的外国网站
  19. 计算机逻辑功能测试及应用,逻辑门电路的逻辑功能及测试.doc
  20. python django 个人图片网站

热门文章

  1. Linux常用命令总结之(五)alias
  2. 分享:嵌入式Linux入门学习指导
  3. 统计字符串中单词个数
  4. Struts2学习笔记(五)之异常处理机制
  5. WPF内存泄露:CollectionViewSource.GetDefaultView导致Cache对象
  6. 收藏一些效果炫酷的可视化网站
  7. fatal: remote origin already exists.解决方法
  8. 我的首页收藏链接之07年前的LIST
  9. 数据采集录入填报时如何只更新当前修改行
  10. Linux就业技术指导(一):简历撰写及面试筹备要领