OpenCV-Python(34):FAST算法

目标

  • 理解 FAST 算法的基础
  • 使用OpenCV 中的FAST 算法相关函数进行角点检测

介绍

        FAST算法(Features from Accelerated Segment Test)是一种用于在图像中快速检测角点的算法。它是一种基于像素的检测方法,具有高效、准确的特点,常用于计算机视觉领域中的特征点提取、图像匹配等任务。

背景 

        我们前面学习了几个特征检测器,它们大多数效果都很好。但是从实时处理的角度来看,这些算法都不够快。一个最好例子就是SLAM(同步定位与地图构建)、移动机器人,它们的计算资源非常有限。为了解决这个问题,Edward_Rosten 和Tom_Drummond 在2006 年提出了FAST 算法。我们下面将会对此算法进行一个简单的介绍。你可以参考原始文献获得更多细节,本节中的所有图像都是来源于原始文章。

算法步骤

        FAST算法的基本思想是通过对像素灰度值的快速比较来判断是否为角点。该算法的主要步骤如下:

  1. 选择一个像素点作为中心点。
  2. 选取中心点周围的16个像素点,分别计算它们与中心点的灰度差值。
  3. 判断中心点是否为角点。如果中心点与连续N个相邻像素点的灰度差值超过一个阈值T,或者与连续M个相邻像素点的灰度差值超过另一个阈值K,则认为中心点是角点。

FAST算法特征提取详细说明

1.在图像中选取一个像素点p,来判断它是不是关键点。Ip 等于像素点p的灰度值。

2.选择适当的阈值t。

3.如下图所示在像素点p 的周围选择16 个像素点进行测试。

4.如果在这16 个像素点中存在n 个连续像素点的灰度值高于于Ip + t,或者低于Ip −t,那么像素点p 就被认为是一个角点。如上图中的虚线所示,n 选取的值为12。

5. 为了获得更快的效果,还采用了额外的加速办法。首先对候选点的周围每个90 度的点:1,9,5,13 j进行测试,(先测1 和19, 如果它们符合阈值要求再测试 5 和13)。如果p 是角点,那么这四个点中至少有3 个要符合阈值要求。如果不是的话肯定不是角点,就放弃。对通过这步测试的点再继续􄦊进行测试,看是否有12 的点符合阈值要求。这个检测器的效率很高,但是它有如下几条缺点:

        • 当n<12 时它不会丢弃很多候选点(获得的候选点比较多)。
        • 像素的选取不是最优的,因为它的效果取决与要解决的问题点和角点的分布情况。
        • 告诉测试的结果被抛弃
        • 检测到的很多特征点都是连在一起的。

        通过不断研究改进,前3 个问题可以通过机器学习的方法解决,最后一个问题可以使用非最大值抑制的方法解决。

 机器学习的角点检测器

1. 选择一组训练练图片(最好是跟最后应用相关的图片)。
2. 使用FAST 算法找出每幅图像的特征点。
3. 对每一个特征点,将其周围的16 个像素存储构成一个向量。对所有图像都这样做构建一个特征向量 P。

 4. 每一个特征点的16 像素点都属于下列三类中的一种。

5. 根据这些像素点的分类,特征向量 P 也被分为3 个子集:Pd、Ps、Pb
6. 定义一个新的布尔变 Kp,如果p 是角点就设置为Ture,如果不是就设置为False。 

7. 使用ID3 算法(决策树分类器)Use the ID3 algorithm (decisiontree classifier) to query each subset using the variable Kp for theknowledge about the true class. It selects the x which yields the most information about whether the candidate pixel is a corner,measured by the entropy of Kp.
8. This is recursively applied to all the subsets until its entropy is zero.
9. 将构建好的决策树用于其他图像的快速的检测。

非极大值抑制

        使用极大值抑制的方法可以解决检测到的特征点相连的问题。

  1. 对所有检测到到特征点构建一个打分函数V。V 就是像素点p 与周围16个像素点差值的绝对值之和。
  2. 计算临近两个特征点的打分函数V。
  3. 忽略V 值最低的特征点

总结

  1. FAST算法的优点是速度快(比其它角点检测算法都快),适用于实时的图像处理任务。但它也有一些限制,例如对于图像噪声较多或纹理不明显的情况下,检测结果可能不准确(噪声很高时不稳定)。
  2. 在使用FAST算法时,需要根据具体应用场景调整阈值N、阈值T和阈值K的取值,才能获得较好的检测效果。
  3. 除了FAST算法,还有其他一些常用的角点检测算法,如Harris角点检测、Shi-Tomasi角点检测等,可以根据实际需求选择合适的算法或者根据具体任务结合不同算法使用。

OpenCV的FAST算法实现 

        和其它特征点检测一样我们可以在OpenCV 中直接使用FAST 特征检测器。如果你愿意的话,你可以设置阈值,是否进行最大值抑制,使用的邻域大小等。邻域可以设置为下列3 中之一:cv2.FAST_FEATURE_DETECTOR_TYPE_5_8, cv2.FAST_FEATURE_DETECTOR_TYPE_7_12和cv2.FAST_FEATURE_DETECTOR_TYPE_9_16。下面是使用FAST 算法进行特征点检测的简单代码。

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = 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 nonmaxSuppressionfast.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)

        结果如下。第一幅图是使用了非最大值抑制的结果,第二幅没有使用非最大值抑制。 

提醒说明 

OpenCV的版本不同,常见特征器的方法可能会有不同,以下也可以参考。

在OpenCV-python中,可以使用cv2.FastFeatureDetector()函数来创建FAST角点检测器。该函数的用法如下:

fast = cv2.FastFeatureDetector_create(threshold=10, nonmaxSuppression=True, type=cv2.FAST_FEATURE_DETECTOR_TYPE_9_16, max_npoints=5000)

其中,参数的含义如下:

  • threshold:阈值,用于判断像素点是否为角点。默认值为10。
  • nonmaxSuppression:是否进行非最大值抑制,即在相邻的角点中只选择响应最大的角点。默认值为True。
  • type:角点检测算法的类型。默认值为cv2.FAST_FEATURE_DETECTOR_TYPE_9_16,表示使用16个像素点进行快速比较。
  • max_npoints:最大检测到的角点数量。默认值为5000。

在创建FAST角点检测器后,可以使用fast.detect()函数来检测图像中的角点。

FAST角点检测器的type参数定义了角点检测算法的类型。在OpenCV-python中,提供了以下几种类型:

  • cv2.FAST_FEATURE_DETECTOR_TYPE_5_8:使用8个像素点进行快速比较。
  • cv2.FAST_FEATURE_DETECTOR_TYPE_7_12:使用12个像素点进行快速比较。
  • cv2.FAST_FEATURE_DETECTOR_TYPE_9_16:使用16个像素点进行快速比较。

使用示例:

import cv2# 读取图像
image = cv2.imread("image.jpg")# 创建FAST角点检测器
fast = cv2.FastFeatureDetector_create(threshold=10, nonmaxSuppression=True, type=cv2.FAST_FEATURE_DETECTOR_TYPE_9_16, max_npoints=5000)# 检测角点
keypoints = fast.detect(image, None)# 绘制角点
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None, color=(0, 255, 0), flags=0)# 显示结果
cv2.imshow("FAST", image_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述示例中,创建FAST角点检测器时,通过参数设置了阈值为10,进行非最大值抑制,使用16个像素点进行快速比较,并设置最大检测到的角点数量为5000。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法分析与设计】最短路径和

题目&#xff1a; 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例&#xff1a; 示例 1&#xff1a; 输入&#xff1a;grid [[1,3,1],…

【PHP AES加解密示例】从入门到精通,一篇文章让你掌握加密解密技术!

一、引言 随着互联网的普及&#xff0c;数据安全问题越来越受到人们的关注。在众多加密算法中&#xff0c;AES&#xff08;Advanced Encryption Standard&#xff09;因其高效、安全的特点被广泛应用。本文将通过PHP语言&#xff0c;为大家展示一个简单的AES加解密示例&#x…

Retinal Structure Detection in OCTA Image viaVoting-Based Multitask Learning

一、摘要 研究背景&#xff1a;自动检测视网膜结构&#xff0c;如视网膜血管(RV)、中央凹血管区(FAZ)和视网膜血管连接(RVJ)&#xff0c;对了解眼部疾病和临床决策具有重要意义。 主要工作&#xff1a;在本文中&#xff0c;提出了一种新的基于投票的自适应特征融合多任务网络…

Pr模板(剪辑素材),Pr预设(视频转场,调色),Pr插件,Pr教程,Pr模板网

PR模板,免费Premiere模板下载网站.logo片头模板,标题字幕,样机相册,节奏快闪,开场预告,转场特效,图文照片,抖音自媒体Vlog短视频模板等Premiere项目工程源文件模板下载 Pr模板&#xff1a;https://prmuban.com/template PR预设,PR转场预设,PR调色预设,Pr剪辑视频特效PR预设.pr…

优化的实时换脸项目——DeepFaceLive

DeepFaceLive是一款基于人工智能技术的换脸工具&#xff0c;可以实现实时面部捕捉和换脸效果。它利用深度学习和计算机视觉算法&#xff0c;能够以惊人的准确度和速度将脸部特征无缝地映射到任何人的脸上。DeepFaceLive的特点是可以实时换脸&#xff0c;让用户通过网络摄像头应…

MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构

目录 前言 1. 主从复制 主从复制的基本配置示例&#xff1a; 2. 主从复制的限制 3. InnoDB Cluster架构 InnoDB Cluster配置步骤示例&#xff1a; 4. InnoDB Cluster的优势 总结 ⭐️ 好书推荐 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&…

京东年度数据报告-2023全年度游戏本十大热门品牌销量(销额)榜单

同笔记本市场类似&#xff0c;2023年度游戏本市场的整体销售也呈下滑态势。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;京东平台上游戏本的年度销量累计超过350万&#xff0c;同比下滑约6%&#xff1b;销售额将近270亿&#xff0c;同比下滑约11%。 鲸参谋综合了京东…

C语言变量与函数

目录 变量函数 变量 变量&#xff1a;计算机里的一块内存空间int a 0; 表示定义一个整型 int 变量&#xff1b;这个变量名字叫做 a “” 表示赋值&#xff1b;即将右边的 0 赋值给左边的整型变量 a 现在这一块空间 a 存放了一个值 0 这个过程也叫做整型变量 a 的初始化初始化…

C++/WinRT 简介

C/WinRT 是 Windows 运行时 (WinRT) API 的完全标准新式 C17 语言投影&#xff0c;以基于标头文件的库的形式实现&#xff0c;旨在为你提供对新式 Windows API 的一流访问。 利用 C/WinRT&#xff0c;你可以采用任何符合标准的 C17 编译器创作和使用 Windows 运行时 API。 Wind…

OSG StatsHandler 初步学习

osg为视景器的使用和调试提供了丰富的辅助组件&#xff0c;它们主要是以osg::ViewerBase的成员变量或交互事件处理器(osgGA::GUIEventHandler)的形式出现。osgViewer::StatsHandler、osg::Stats类就是其中的两个经常用到的辅助组件。 #include<osgViewer/Viewer> #inclu…

iOS xcode 15.1 打包报错

真机调试的时候没问题&#xff0c;打包的时候报错了 #报错 解决办法 pods.xcodeproj - build phases - compile sources - compiler flags pods.xcodeproj - Targets-support files pods-xx-frameworks

GitHub Copilot的使用方法和快捷按键

GitHub Copilot是GitHub与OpenAI合作开发的一款人工智能编码助手。它基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型&#xff0c;可以为你提供代码补全、建议和生成的功能 使用方法&#xff1a; 安装插件&#xff1a; 首先&#xff0c;确保你的开发环…

[redis] redis的安装,配置与简单操作

一、缓存的相关知识 1.1 缓存的概念 缓存是为了调节速度不一致的两个或多个不同的物质的速度&#xff0c;在中间对速度较慢的一方起到加速作用&#xff0c;比如CPU的一级、二级缓存是保存了CPU最近经常访问的数据&#xff0c;内存是保存CPU经常访问硬盘的数据&#xff0c;而且…

LeetCode讲解篇之39. 组合总和

文章目录 题目描述题解思路题解代码 题目描述 题解思路 首先排序数组&#xff0c;然后开始选择数字&#xff0c;当选择数字num后&#xff0c;在去选择大于等于num的合法数字&#xff0c;计算过程中的数字和&#xff0c;直到选数字和等于target, 加入结果集&#xff0c;若数字和…

关于镜头选型时的一些注意事项

1、问题背景 最近的项目调试过程中&#xff0c;遇到与镜头相关的问题比较多。所以本文主要总结一下镜头选型时需注意的事项&#xff0c;保证在项目前期就能规避掉一些问题&#xff0c;避免项目延期。 2、问题分析 我们拿到手的一般都是摄像头模组&#xff0c;在进行摄像头调试时…

114.QTimer类和QWidget类

目录 一、QTimer类 定时器使用举例&#xff1a; 二、QWidget类 2.1设置父对象 2.2窗口位置 2.3窗口尺寸 2.4窗口标题和图标 2.5信号 2.6槽函数 示例代码&#xff1a; 一、QTimer类 QTimer 是 Qt 中用于实现定时器的类。它可以在一定的时间间隔内发射信号&#xff0c;…

品牌帮助中心:提升企业客户服务水平与效率的实用指南

什么是品牌帮助中心&#xff1f;简单来理解&#xff0c;他就是一种加速问题解决效率的方式&#xff0c;是通过在官网设置文章库或者社区的形式&#xff0c;为客户提供自助服务&#xff0c;自我查找问题答案。是一种既能提升问题解决效率&#xff0c;又能提升品牌形象的方式。接…

8年经验分享:想要成为一名合格的软件测试工程师,你得会些啥?

对于很多新入行或者打算入行&#xff0c;成为软件测试工程师的小伙伴来说&#xff0c;刚开始接触这行&#xff0c;不知道自己究竟该学些什么&#xff0c;或者不知道必须掌握哪些知识&#xff0c;才能成为一名合格的测试工程师。 根据笔者观点&#xff0c;如果你能在学习过程中&…

机器学习第二十五周周报 ConvLSTM

文章目录 week 25 ConvLSTM摘要Abstract一、李宏毅机器学习二、文献阅读1. 题目2. abstract3. 网络架构3.1降水预报问题的建模3.2Convolutional LSTM3.3编码-预测结构 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1Moving-MNIST Dataset4.3.2雷达回波数据集 4.4 结论…

【自控实验】4. 数字仿真实验

本科课程实验报告&#xff0c;有太多公式和图片了&#xff0c;干脆直接转成图片了 仅分享和记录&#xff0c;不保证全对 使用matlab中的simulink进行仿真 实验内容 线性连续控制系统的数字仿真 根据开环传递函数G(S)的不同&#xff0c;完成两个线性连续控制系统的仿真。 …