目标

在本章中,

  • 我们将了解FAST算法的基础知识。
  • 我们将使用OpenCV功能对FAST算法进行探索。

理论

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

作为对此的解决方案,Edward Rosten和Tom Drummond在2006年的论文“用于高速拐角检测的机器学习”中提出了FAST(加速分段测试的特征)算法(后来在2010年对其进行了修订)。该算法的基本内容如下。有关更多详细信息,请参阅原始论文(所有图像均取自原始论文)。

使用FAST进行特征检测

  1. 选择图像中是否要识别为兴趣点的像素ppp,使其强度为IpI_pIp​

  2. 选择适当的阈值ttt

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

  4. 现在,如果圆中存在一组(共16个像素)nnn个连续的像素,它们均比Ip+tI_p + tIp​+t亮,或者比Ip−tI_p-tIp​−t都暗,则像素ppp是一个角。(在上图中显示为白色虚线)。n被选为12。

  5. 建议使用高速测试以排除大量的非角区域。此测试仅检查1、9、5和13处的四个像素(如果第一个1和9太亮或太暗,则对其进行测试。如果是,则检查5和13)。如果p是一个角,则其中至少三个必须全部比Ip+tI_p + tIp​+t亮或比Ip−tI_p-tIp​−t暗。如果以上两种情况都不是,则ppp不能为角。然后,可以通过检查圆中的所有像素,将完整的分段测试标准应用于通过的候选项。该检测器本身具有很高的性能,但有几个缺点:

    • 它不会拒绝n < 12的候选对象。
    • 像素的选择不是最佳的,因为其效率取决于问题的顺序和角落外观的分布。
    • 高速测试的结果被丢弃了。
    • 彼此相邻地检测到多个特征。

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

让机器学习一个角检测器

  1. 选择一组图像进行训练(最好从目标应用程序域中进行训练)
  2. 在每个图像中运行FAST算法以查找特征点。
  3. 对于每个特征点,将其周围的16个像素存储为矢量。对所有图像执行此操作以获得特征向量P。
  4. 这16个像素中的每个像素(例如xxx)可以具有以下三种状态之一:

  1. 取决于这些状态,特征矢量PPP被细分为3个子集,PdP_dPd​, PsP_sPs​, PbP_bPb​。

  2. 定义一个新的布尔变量KpK_pKp​,如果ppp是一个角,则为true,否则为false。

  3. 使用ID3算法(决策树分类器)使用变量KpK_pKp​查询每个子集,以获取有关真实类的知识。它选择x,该x通过KpK_pKp​的熵测得的有关候选像素是否为角的信息最多。

  4. 递归地将其应用于所有子集,直到其熵为零为止。

  5. 这样创建的决策树用于其他图像的快速检测。

非最大抑制

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

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

总结

它比其他现有的拐角检测器快几倍。

但是它对高水平的噪声并不鲁棒。它取决于阈值。

OpenCV中的高速拐角检测器

它被称为OpenCV中的任何其他特征检测器。

如果需要,您可以指定阈值,是否要应用非极大抑制,要使用的邻域等。

对于邻域,定义了三个标志,分别为cv.FAST_FEATURE_DETECTOR_TYPE_5_8cv.FAST_FEATURE_DETECTOR_TYPE_7_12cv.FAST_FEATURE_DETECTOR_TYPE_9_16

以下是有关如何检测和绘制FAST特征点的简单代码。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('simple.jpg',0)
# 用默认值初始化FAST对象
fast = cv.FastFeatureDetector_create()
# 寻找并绘制关键点
kp = fast.detect(img,None)
img2 = cv.drawKeypoints(img, kp, None, color=(255,0,0))
# 打印所有默认参数
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)
# 关闭非极大抑制
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)

查看结果。第一张图片显示了带有nonmaxSuppression的FAST,第二张图片显示了没有nonmaxSuppression的FAST:

附加资源

  1. Edward Rosten and Tom Drummond, “Machine learning for high speed corner detection” in 9th European Conference on Computer Vision, vol. 1, 2006, pp. 430–443.
  2. Edward Rosten, Reid Porter, and Tom Drummond, “Faster and better: a machine learning approach to corner detection” in IEEE Trans. Pattern Analysis and Machine Intelligence, 2010, vol 32, pp. 105-119.

欢迎关注磐创博客资源汇总站:

http://docs.panchuang.net/

欢迎关注PyTorch官方中文教程站:

http://pytorch.panchuang.net/

OpenCV中文官方文档:

http://woshicver.com/

OpenCV-Python 用于角点检测的FAST算法 | 四十一的更多相关文章

  1. 【OpenCV文档】用于角点检测的Fast算法

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

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

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

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

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

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

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

  5. opencv+python+dlib人脸关键点检测、实时检测

    安装的是anaconde3.python3.7.3,3.7环境安装dlib太麻烦, 在anaconde3中新建环境python3.6.8, 在3.6环境下安装dlib-19.6.1-cp36-cp36 ...

  6. 第十四节、FAST角点检测(附源码)

    在前面我们已经陆续介绍了许多特征检测算子,我们可以根据图像局部的自相关函数求得Harris角点,后面又提到了两种十分优秀的特征点以及他们的描述方法SIFT特征和SURF特征.SURF特征是为了提高运算 ...

  7. opencv笔记6:角点检测

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

  8. OPENCV图像特征点检测与FAST检测算法

    前面描述角点检测的时候说到,角点其实也是一种图像特征点,对于一张图像来说,特征点分为三种形式包括边缘,焦点和斑点,在OPENCV中,加上角点检测,总共提供了以下的图像特征点检测方法 FAST SURF ...

  9. 深度学习 + OpenCV,Python实现实时视频目标检测

    使用 OpenCV 和 Python 对实时视频流进行深度学习目标检测是非常简单的,我们只需要组合一些合适的代码,接入实时视频,随后加入原有的目标检测功能. 在本文中我们将学习如何扩展原有的目标检测项 ...

随机推荐

  1. Centos 7 中 部署 asp.net core 3.0 + nginx + mongodb 的一些新手简单入门,非docker

    目录 零.准备工作 一.部署Mongodb 1.安装Mongodb 2.创建mongodb的数据目录 3.设置目录权限 4.设置mongodb启动 5.修改mongodb的配置文件 6.启动Mongo ...

  2. 从头认识js-js客户端检测

    常用的客户端检测方式有以下三种: 1.能力检测 2.怪癖检测 3.用户代理检测 能力检测 最常用也是最为人们广泛接受的客户端检测形式是能力检测(又称特性检测).能力检测的目标不是识别特定的浏览器,而是 ...

  3. 【渗透】node.js经典问题

    1.循环问题 当循环调用 require() 时,一个模块可能在未完成执行时被返回.例如以下情况:a.js: exports.done = false; const b = require('./b. ...

  4. vue+element 表单封成组件(2)

    今天我们继续把时间选择器,多选框和单选框加上 父组件(在昨天的基础上增加): <template> <el-form :model="ruleForm" ref= ...

  5. DUBBO 面试灵魂18问

    一.Dubbo 是什么 dubbo 是一个分布式框架,是一个远程服务调用的分布式框架,其核心部分包含: 1)集群容错: 提供基于接口方法的透明远程过程调用,包含多协议支持,以及软负债均衡.失败容错.地 ...

  6. Head First设计模式——复合模式

    复合模式是HeadFirst上面详细讲的最后一个模式,其前面的模式作者认为都是成熟的经常使用的模式.所以这是详细讲解模式的最后一篇,同时这个模式讲解的篇幅也是最长的,接下来我就对其进行总结提炼进行讲解 ...

  7. go package 学习笔记 —— strconv(string与其他基本数据类型(int, float, bool)的转换)

    strconv实现了go中基本数据类型与string之间的转换. How to use in go go doc:https://godoc.org/strconv import "strc ...

  8. ES6中的find与filter的区别

    一直以来以为find和filter是一样的效果,最近在梳理,才发现是不一样的. 首先,filter和find区别:filter返回的是数组,find返回的是对象. 注意:find()找到第一个元素后就 ...

  9. 关于pytorch在windows上编辑的问题集合

    cmake在windows上自动寻找v140(VS2015)的编译器,现在只有VS2013的IDE,所以要修改编译器 修改掉VS2015的编译器名称,报错提示参数CMAKE_C_COMPILER和CM ...

  10. JDK中线程池参详细解析

    在jdk中为我们提供了三种创建线程池的方式,但是在阿里的编码规范里面都是明确禁止使用这三种api去创建线程池,推荐我们去自定义线程池.为什么? 要回答为什么,我们需要明白创建线程池时,各参数的作用: ...