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 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)

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

提醒说明 

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。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【小程序开发需要多少钱?】

哈喽&#xff0c;大家好&#xff0c;这里是智创开发。 我们今天聊聊开发一个小程序需要多少钱。 由于自己组建团队来开发小程序成本过高&#xff0c;大品牌的企业一般都不会这么搞&#xff0c;所以我们今天只谈假如我有需求&#xff0c;找服务商来全程搞定的费用大致是多少。和…

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

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

java+ssm+vue代码视频学习讲解

一、ssm 1.项目文件结构 2.数据库连接信息 3.其他配置信息 4.java代码文件目录介绍 5.entity层代码 6.controller&#xff0c;service&#xff0c;dao&#xff0c;entity层之间的关系 7.controller层代码 8.登陆拦截功能实现 AuthorizationInterceptor.java 9.文件上传功能 …

日志审计系统Agent项目创建——获取Linux的ip并将得到的日志插入数据库中(Linux版本)

上一篇文章可以直接展示系统在运行过程中的日志&#xff0c;读取日志文件https://blog.csdn.net/wjl990316fddwjl/article/details/135553685 如何将得到的日志插入数据表中&#xff0c;进行更可观的展示&#xff1f; 1、创建表格并执行&#xff0c;可以看到数据库已经创建好…

paypal贝宝怎么绑卡支付

一、PayPal是什么 PayPal是一个很多国家地区通用的支付渠道&#xff0c;我们可以把它理解为一项在线服务&#xff0c;相当于美国版的支付宝。你可以通过PayPal进行汇款和收款&#xff0c;相比传统的电汇和西联那类的汇款方式&#xff0c;PayPal更加简单和容易&#xff0c;被很…

使用ffmpeg对视频进行静音检测

1 原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-version3 --enable-sta…

Retinal Structure Detection in OCTA Image viaVoting-Based Multitask Learning

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

Spring之AOP源码(二)

书接上文 文章目录 一、简介1. 前文回顾2. 知识点补充 二、ProxyFactory源码分析1. ProxyFactory2. JdkDynamicAopProxy3. ObjenesisCglibAopProxy 三、 Spring AOP源码分析 一、简介 1. 前文回顾 前面我们已经介绍了AOP的基本使用方法以及基本原理&#xff0c;但是还没有涉…

SQL注入攻击

1.用java实现登录的检查 package jdbc1;import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Scanner;public class Login {public static void main(String args[]){try(Connection connec…

新型的变现和引流方式

AI 数字人短视频正成为一种新型的变现和引流方式。随着人工智能技术的不断发展&#xff0c;数字人技术也越来越成熟&#xff0c;为用户提供了更加逼真、生动的虚拟形象。通过AI 数字人短视频&#xff0c;用户可以创作出具有个性化特点的短视频内容&#xff0c;并将其发布在各大…

PLC控制脉冲轴绝对位置往复运动(三菱FX系列简单状态机编程)

有关状态机的具体介绍,专栏有很多文章,大家可以通过下面的链接查看: https://rxxw-control.blog.csdn.net/article/details/125488089https://rxxw-control.blog.csdn.net/article/details/125488089三菱FX系列回原功能块介绍 https://rxxw-control.blog.csdn.net/article…

在vue3和上挂载方法,以及在页面中怎么使用原型(公共)上的方法

//新建的项目的main.js文件是这样的 //main.js 文件 //befor import { createApp } from vue; import App from ./App.vue;const app createApp(App); app.mount(#app);以下例子用于解释在vue3.0的main.js中挂载公共的方法&#xff08;foo&#xff09; //main.js 文件 //afte…

51-11 多模态论文串讲—VLMo 论文精读

VLMo: Unified Vision-Language Pre-Training with Mixture-of-Modality-Experts (NeurIPS 2022) VLMo 是一种多模态 Transformer 模型&#xff0c;从名字可以看得出来它是一种 Mixture-of-Modality-Experts (MoME)&#xff0c;即混合多模态专家。怎么理解呢&#xff1f;主流 …

解决ELK日志收集中Logstash报错的关键步

ElK执行日志收集的时候logstash报错&#xff1a; Failed to execute action {:action>LogStash::PipelineAction::Create/pipeline_id:main, :exception>“LogStash::ConfigurationError”, :message>“Expected one of [^\r\n], “\r”, “\n” at line 88, column 4…

【深度学习每日小知识】Overfitting 过拟合

过拟合是机器学习&#xff08;ML&#xff09;中的常见问题&#xff0c;是指模型过于复杂&#xff0c;泛化能力较差的场景。当模型在有限数量的数据上进行训练&#xff0c;并且学习了特定于该特定数据集的模式&#xff0c;而不是适用于新的、看不见的数据的一般模式时&#xff0…

不用下载就可以使用的三个在线抠图网站

字图像处理技术的发展&#xff0c;抠图已经成为一项重要的技术。在许多情况下&#xff0c;我们需要将图片中的某一部分抠出来&#xff0c;例如将人物从背景中抠出&#xff0c;或者将产品从图片中抠出。传统的抠图方法需要使用专业的图像处理软件&#xff0c;如Photoshop等&…

22k+stars centos轻松搭建网盘的神器

说明: 系统:centos7 64 ip:192.168.168.107 目录 1.下载 2.安装 3.启动 4.测试 1.下载 根据系统下载 wget https://github.com/filebrowser/filebrowser/releases/download/v2.27.0/linux-amd64-filebrowser.tar.gz 2.安装 tar -zxvf linux-amd64-filebrowser.tar.gz…

Linux限制用户可用硬盘空间

为了防止某个用户占用大量资源导致其他用户无法正常使用&#xff0c;一般会对单个用户可占用资源进行限制。就磁盘限额&#xff0c;XFS文件系统原生支持目录级别的限制。ext文件系统不支持目录限制&#xff0c;曲线方式是限制用户的总占用空间。 本文介绍使用quota程序限制用户…

有没有可以拖拉拽生成一个低代码平台?

据我所知&#xff0c;低代码平台都能拖拉拽生成。作为一组数字技术工具平台&#xff0c;它能基于图形化拖拽、参数化配置等更为高效的方式&#xff0c;实现快速构建、数据编排、连接生态、中台服务等。通过少量代码或不用代码实现数字化转型中的场景应用创新。 到底啥是低代码&…

网络——华为与华三

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 写在前面 大家好&#xff0c;我是网络豆&#xff0…