【OpenCV-Python】教程:4-6 FAST (Features from Accelerated Segment Test)算法角点检测

news2024/11/15 12:48:51

OpenCV Python FAST(Features from Accelerated Segment Test) 算法角点检测

【目标】

  • 理解FAST算法的理论基础;
  • 用OpenCV里的FAST 检测角点;

【理论】

我们看到了几个特征检测器,其中很多都非常好。但是从实时应用程序的角度来看,它们还不够快。一个最好的例子是SLAM ( Simultaneous Localization and Mapping ) 移动机器人,它的计算资源有限。

作为一种解决方案,FAST (feature from Accelerated Segment Test) 算法由Edward Rosten 和 Tom Drummond 在2006年的论文《Machine learning for high-speed corner detection 》中提出,(后来在2010年进行了修订)。下面是对该算法的基本总结。详情请参考原论文(所有图片均取自原论文)。

利用FAST进行特征检测

  1. 选择一个像素 p(被判断是否为感兴趣的点), 设它的亮度为 Ip;
  2. 选择一个适当的阈值 t;
  3. 假定该点的 16 邻域将被用于测试;

fast_speedtest.jpg

  1. 如果 p 周围有n个连续点亮于 p, 或者 暗于 p, 则该点为 FAST 的角点。n 一般选择为 12;
  2. 一个快速的去除非角点的方法是,只测试考虑1、9、5、13等点,亮度同时超过或低于 p 点的像素超过3个,则认为是角点,否则为非角点。它有以下缺点:
    • 当 n < 12 时,它不会拒绝尽可能多的候选;
    • 像素的选择不是最有的,因为它的效率取决于问题的顺序和角点的分布;
    • 高速测试的结果被丢弃;
    • 多个特征点相邻;

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

机器学习角点检测器

  1. 选择一批图像用于训练,最好是选择应用领域的图像;
  2. 运行FAST算法在每张图像中找到特征点。
  3. 对于每个特征点,存储其 16 个邻域像素为一个 vector,对所有图像都进行;
  4. 对于每个像素来说,都可能存在3种以下情况:

fast_eqns.jpg

  1. 基于这些状态,这些特征向量被分为3个子集 P d , P s , P b P_d,P_s,P_b Pd,Ps,Pb
  2. 定义一个布尔向量, K p K_p Kp, 如果 p p p 是角点,则为真,否则为假;
  3. 利用ID3算法 (决策树分类器)使用变量 K p K_p Kp查询每个子集
  4. 这将递归应用所有子集,直到熵为零;
  5. 这样创建的决策树用于其他图像的快速检测;

非极大抑制

在相邻位置检测多个兴趣点是另一个问题。采用非极大抑制法求解。

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

总结

该算法比其他的角点检测快几倍;但是对于噪声来说并不鲁棒,依赖于阈值;

【代码】

在这里插入图片描述

import numpy 
import cv2 
from matplotlib import pyplot as plt

# 读取图片
img = cv2.imread("assets/blox.jpg", 0)
colorim = cv2.imread("assets/blox.jpg", 1)

# 创建Fast检测
fast = cv2.FastFeatureDetector_create()

# Fast 特征检测
kp = fast.detect(img, None)

# 画特征点
img2 = cv2.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)) )

# 关闭非极大值抑制
fast.setNonmaxSuppression(0)
kp = fast.detect(img, None)
print("Total Keypoints without nonmaxSuppression: {}".format(len(kp)))
img3 = cv2.drawKeypoints(img, kp, None, color=(255, 0, 0))

cv2.imshow("img2", img2)
cv2.imshow("img3", img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 输出
Threshold: 10
nonmaxSuppression:True
neighborhood: 2
Total Keypoints with nonmaxSuppression: 431
Total Keypoints without nonmaxSuppression: 1575

【接口】

  • FastFeatureDetector_create
cv2.FastFeatureDetector_create(	[, threshold[, nonmaxSuppression[, type]]]	) ->	retval
  • type: FastFeatureDetector::DetectorType; TYPE_5_8/TYPE_7_12/TYPE_9_16
# 获得算法名称ID,
# Reimplemented in cv::AKAZE, cv::KAZE, cv::SimpleBlobDetector, cv::GFTTDetector, cv::AgastFeatureDetector, cv::FastFeatureDetector, cv::MSER, cv::ORB, cv::BRISK, cv::SIFT, and cv::AffineFeature.
cv.FastFeatureDetector.getDefaultName(		) ->	retval

# 是否采用了非极大值抑制
cv.FastFeatureDetector.getNonmaxSuppression(		) ->	retval

# FAST的阈值
cv.FastFeatureDetector.getThreshold(		) ->	retval

# FAST Detector 类型
cv.FastFeatureDetector.getType(		) ->	retval

# 设置非极大值抑制
cv.FastFeatureDetector.setNonmaxSuppression(	f	) ->	None

# 设置阈值
cv.FastFeatureDetector.setThreshold(	threshold	) ->	None

# 设置类型
cv.FastFeatureDetector.setType(	type	) ->	None

【参考】

  1. OpenCV 官方文档
  2. 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.
  3. 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.
  4. FastFeatureDetector Class Reference

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

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

相关文章

预训练语言模型

一、预训练 对于一个具有少量数据的任务 A&#xff0c;首先通过一个现有的大量数据搭建一个 CNN 模型 A&#xff0c;由于 CNN的浅层学到的特征通用性特别强&#xff0c;因此在搭建一个 CNN 模型 B&#xff0c;其中模型 B 的浅层参数使用模型 A 的浅层参数&#xff0c;模型 B 的…

Android Studio Dolphin logct日志台新版特性及老版本恢复

Android Studio Dolphin logct日志台新版特性及老版本恢复 日志台在此版本进行了更新&#xff0c;本文按官网描述简要汇总了其新特性和使用方法&#xff0c;以及老版本的日志如何恢复。 老版本日志台恢复 如果是习惯了老版本日志台的仁兄&#xff0c;可按下方截图操作进入Se…

IDEA安装ChatGPT插件步骤

首先感谢大佬的提供的插件【ChatGPT JetBrains插件完整版发布。让AI帮你写代码。-哔哩哔哩】 **前期准备&#xff1a;**需要注册OpenAI账号。不会的可以见我的教程&#xff1a;传送门 1、注册号账号后&#xff0c;打开网站https://chat.openai.com/api/auth/session 复制acess…

TS201的外部中断和定时终端控制FLAG输出(含参考源码)

硬件准备 ADZS-TS201S-EZLITE&#xff1a;ADI TS201开发板 AD-HP560ICE&#xff1a;ADI DSP专用仿真器 软件准备 Visual DSP软件 硬件链接 外部中断控制FLAG输出 原理就不讲了&#xff0c;前面几章都有说。 调试步骤: 1)打开VisualDSP&#xff0c;并新建一个工程文件&am…

C语言刷题系列——8.矩阵的行/列互换

&#x1f6a9;矩阵的行/列互换⛄一) 题目要求⛄二) 题解step1:输入矩阵step2:输入k(执行 行/列 互换操作的次数)step3:&#xff08;循环内部&#xff09;行/列互换step4:打印互换后的矩阵⛄三) 最终的实现⛄一) 题目要求 输入描述&#xff1a;第一行包含两个整数n和m&#xff…

基于pytest来演示一个PO测试模式案例

首先要说的是&#xff0c;这是一个很简易的案例&#xff0c;目的在于体会这样一种结构。 第一部分&#xff1a;基本操作 案例描述&#xff1a;启动浏览器--打开好123--点击logo--跳转到百度--输入搜索词汇--点击按钮开始搜索。 模式描述&#xff1a;这个模式把元素的提取、元…

基于Java实现(WEB)影院管理系统(TMS)【100010015】

电影院系统需求规格说明 1. 引言 1.1 目的 本文档描述了影院管理系统的功能需求和非功能需求。开发小组的软件系统实现与验证工作都以此文档为依据。1.2 范围 影院管理系统是为了xx影院开发的业务系统&#xff0c;开发的目标是帮助该影院处理日常的重点事物&#xff0c;包括…

算法基础篇-03-查找(顺序查找和二分法查找)

1.查找 查找&#xff1a;在一些数据元素中&#xff0c;通过一定的方法找出与给定关键字相同的数据元素的过程&#xff1b;列表查找(线性表查找)&#xff1a;从列表中查找指定元素&#xff1b; 输入&#xff1a; 列表&#xff0c;待查找元素输出&#xff1a;元素下标(未找到元素…

【Linux】git的使用

&#x1f922;Linux 关联到gitee的操作记录 &#x1f922;Linux 下下载gitee的库 &#x1f92c;sudo yum install git 在Linux中安装git这个软件 &#x1f92c;git clone 下载gitee库到本地 &#x1f92c;git add. 将代码放到刚才下载好的目录中 &#x1f92c;git commit -…

HTML网上书店静态HTML网页作业作品 大学生三联书店网页设计制作成品 简单DIV CSS布局网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

SpringBoot 如何进行业务校验,老鸟们都这么玩的~

throw new IllegalArgumentException(“用户不存在&#xff01;”); } } 采用Assert能使代码更优雅&#xff0c;更简洁。 还是上面的例子&#xff0c;如果采用Assert可以这样写&#xff1a; public void test2(int accountId) { Account account accountDao.selectById(…

【力扣篇一】数组30题

前言 &#xff08;12月5日&#xff09;突然想起了很久以前别人&#xff08;具体来源已经记不清了&#xff09;传给我的一套题单。网上的题单不少&#xff0c;光收藏可不行&#xff0c;关键还得下手。 这套题单的题目数量为300出头&#xff0c;什么时候刷完我还没有明确计划&a…

对标40亿美金Webflow,「Towify」想用无代码方式搭建小程序

低代码和无代码的浪潮,在全球已经席卷了几次。今年以来,以低代码、无代码方式为主的网页开发、搭建工具受到了资本和市场的认可: 2022年8月,成立于2017年的低代码-内部程序开发平台Retool完成4500万美元融资,投后估值32亿美元。2022年3月,成立于2012年的无代码-外部网页搭…

关于魔趣刷机(含root)步骤

关于魔趣刷机&#xff08;含root&#xff09;步骤准备工作第一步&#xff1a;下载room和TWRP第二步&#xff1a;刷入TWRP到手机第三步&#xff1a;刷入room到手机第四步&#xff1a;安装Magisk app第四步&#xff1a;验证手机是否root参考链接准备工作 一台手机(推荐小米)、TW…

ADI Blackfin DSP处理器-BF533的开发详解28:SD卡的文件系统(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了通过文件系统读取 SD 卡上的文件&#xff0c;并对文件和文件夹做读、写、删除、建立、文件列表、文件搜索等功能&#xff0c…

【Pytorch】第 8 章 :实施政策梯度和政策优化

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Git 客户端::Git Fork 注册版-NEW

Git Fork 是最简单有效的 Windows 客户端之一。许多开发人员正在使用此版本控制程序&#xff0c;它允许您协作处理您的项目。具有类似这样的用户界面的客户端可以使您的工作更轻松。 Fork 的 Fork 界面非常人性化。在右侧的左侧有大量的存储库和分支、标签、来源和藏匿处。此外…

【Pytorch】第 7 章 :深度 Q 网络实战

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

CleanMyMac X4.12.2免费版MAC电脑系统磁盘优化工具

我的 MacBook Pro 只有 256GB 硬盘空间&#xff0c;平时也勉强够用。但最近在升级新版本操作系统 macOS Ventura 13 时发现磁盘空间不够&#xff0c;导致不能升级。对于一个升级强迫症患者来说&#xff0c;任何的小红点都不能忍&#xff0c;更何况是系统升级这种事情。在确定了…

ARM 汇编初始化 SDRAM 详解

一、初始化代码框架介绍&#xff08;函数调用和返回、步骤等&#xff09; SDRAM 初始化使用一个函数 sdram_asm_init &#xff0c;函数在 sdram_init.S 文件中实现&#xff0c;是一个汇编函数。 强调&#xff1a;汇编实现的函数在返回时需要明确使用返回指令&#xff08;mov p…