AGAST 角点检测器和 FAST 角点检测器:
两者都是计算机视觉中快速检测图像角点的算法,核心目的是高效找到图像中 "有辨识度的点",但细节略有不同:
(1)FAST 角点检测器
• 特点:速度极快,专门为实时场景设计(比如摄像头实时跟踪)。
• 原理:判断一个点是否为角点时,只看它周围 16 个像素(形成一个圆)。如果其中连续 12 个以上的像素,要么都比它亮很多,要么都比它暗很多,就判定为角点。
• 优势:计算简单,速度快,适合嵌入式设备(如 OpenMV 摄像头)。
• 缺点:对噪声较敏感(可能误判一些不是角点的点)。
(2)AGAST 角点检测器(
• 特点:FAST 算法的改进版,更灵活,适应性更强。
• 原理:在 FAST 基础上优化了判断逻辑,不需要固定检查 16 个像素,而是根据图像局部特征动态调整检查的像素数量和位置。
• 优势:在保持速度的同时,减少了误判,对不同类型的图像(比如明暗差异大或小的场景)适应性更好。

core_detector用来控制使用的角点检测的算法,默认是AGAST角点检测

normalized是布尔值。若为True,在多分辨率下关闭提取键点。

#normalized=True 表示 “归一化提取”,即只从图像的原始尺度(不进行多尺度缩放)中提取关键点。
#这是为了让 kpts2 的提取方式与 kpts1 中的某一尺度保持一致,确保两者能正确匹配(避免因缩放差异导致特征点无法对应)

image.match_descriptor(kpts1, kpts2, threshold=85)

LBP描述符,这个函数返回的是一个体现两个描述符之间区别的整数

如果返回值越小,证明两者越匹配

对于ORB描述符来说,这个函数返回的是一个kptmatch对象,

kptmatch.rect()返回矩形元组(匹配到的物体特征的外界矩形的框框)


import sensor
import time
import image

# Reset sensor
sensor.reset()

# Sensor settings
sensor.set_contrast(3)
sensor.set_gainceiling(16)
sensor.set_framesize(sensor.VGA)#640*480
sensor.set_windowing((320, 240))
sensor.set_pixformat(sensor.GRAYSCALE)

sensor.skip_frames(time=2000)
sensor.set_auto_gain(False, gain_db=100)


def draw_keypoints(img, kpts):
if kpts:
print(kpts) # 在控制台打印这些特征点的具体数据
# (比如每个点的坐标是多少,长什么样,计算机能看懂的信息)
img.draw_keypoints(kpts)# 在画面上把这些特征点画出来
# (会在每个特征点的位置画个小圆圈或十字,我们肉眼就能看到了)
img = sensor.snapshot()
time.sleep_ms(1000)


kpts1 = None
#因为程序刚启动时还没看到任何物体,所以先设为空,等摄像头捕捉到第一帧图像后,再从中提取特征点存入kpts1
#不建议从文件中导入特征
#因为每次运行的时候,环境不一样,背景不一样,光线不一样
clock = time.clock()
while True:
clock.tick()
img = sensor.snapshot()
if kpts1 is None:
# 判断:是不是第一次运行?(kpts1还是空的)
# 如果是第一次,就从当前画面中"提取物体的特征点"    
kpts1 = img.find_keypoints(max_keypoints=150, threshold=10, scale_factor=1.2)
draw_keypoints(img, kpts1)
else:
kpts2 = img.find_keypoints(max_keypoints=150, threshold=10, normalized=True)
# 变量 kpts2 用来存储当前帧图像中提取的关键点,和初始帧的 kpts1 对应。

if kpts2:
match = image.match_descriptor(kpts1, kpts2, threshold=85)
if match.count() > 10:
# If we have at least n "good matches"
# Draw bounding rectangle and cross.
img.draw_rectangle(match.rect())
img.draw_cross(match.cx(), match.cy(), size=10)

            print(kpts2, "matched:%d dt:%d" % (match.count(), match.theta()))

# Draw FPS
img.draw_string(0, 0, "FPS:%.2f" % (clock.fps()))

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

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

相关文章

基于深度学习的CT图像3D重建技术研究

基于深度学习的CT图像3D重建技术研究 摘要 本文详细探讨了使用深度学习技术进行CT(计算机断层扫描)图像3D重建的全过程。我们从CT成像基本原理出发,系统介绍了数据预处理、深度学习模型构建、训练优化以及三维可视化等关键技术环节。研究采用了先进的深度学习架构如3D U-Net…

JVM相关面试八股

什么是双亲委派模型? 如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就返回成功&#xff…

Javaweb————HTTP消息体拆分讲解

❤️❤️❤️一.HTTP请求消息结构 (1)请求行 💙 请求方法 💙URL地址 💙协议名 (2)请求头 报文头包含若千个属性格式为“属性名:属性值”, 服务端据此获取客户端的基本信息 (3&…

GitHub的免费账户的存储空间有多少?

GitHub的免费账户在存储空间方面的具体限制如下: 一、普通仓库(非LFS)存储限制 公共仓库 总存储:无明确总容量限制,但建议单个仓库不超过1GB以确保性能。若仓库过大(如超过5GB),可能会收到GitHub的优化提示邮件。 文件大小:单个文件最大100MB,超过100MB的文件会被直…

Java学习|黑马笔记|Day23】网络编程、反射、动态代理

【DAY23】 文章目录【DAY23】一.网络编程1)三要素1.1)IPInetAddress类的使用1.2)端口号1.3)协议2.1)UDP协议发送数据2.2)UDP协议接收数据2.3)UDP的三种通信方式3.1)TCP协议的发送和接…

【Linux】从普通进程到守护进程:系统服务的诞生之路

当你在深夜关闭SSH终端,为何Web服务器仍在默默响应请求?这背后是守护进程的魔法在守护着系统服务的不灭之火。一、守护进程的六大核心特征守护进程(Daemon)是Linux系统的无名英雄,它们舍弃了普通进程的"世俗享受&…

k8s常用基础命令总结

----------------------k8s常用基础命令--------------------------------- 获取 Pod 信息 # 1.获取k8s的命名空间 kubectl get namespaces ​1)获取 Pod 列表及简要信息: kubectl get pods 2)以 YAML 格式获取 Pod 详细信息: kubectl get pod -o yaml 3)​获取特定命名空间中…

Java高级之基于Java Attach与Byte-Buddy实现SQL语句增强

目录 一 Agent 模块 1 HookAgent.java 2 FormatAdvice.java 3 配置文件 二 Attacher 模块 1 AttachMain.java 三 测试模块 1 DruidTest.java 四 验证步骤 五 原理解析 笔者目标写一款数据分析中间件,用来增强当前主流开源项目,前几天写了一票用…

2025第五届生物发酵营养源高峰论坛

一、会议时间会议时间:2025年8月8日二、会议地点上海新国际博览中心–W4馆现场2号会议室三、组织单位主办单位:中国生物发酵产业协会承办单位:浙江工业大学乐斯福集团Procelys 乐斯福发酵营养元参会福利,助力高效交流为提升参会体验,组委会特别推出多项福…

Kubernetes 配置管理

这里写目录标题什么是 ConfigMap创建 ConfigMap基于目录创建 ConfigMap创建 conf 目录,里面放置两个文件基于目录下的所有文件创建 ConfigMap查看当前创建的 ConfigMap基于文件创建 ConfigMap创建测试文件 game-cfg基于单个文件创建 ConfigMap查看当前创建的 Config…

ESP32+MicroPython:用Python玩转物联网开发

什么是ESP32? ESP32作为当下最热门的物联网开发板,常被比作"嵌入式世界的瑞士军刀"。但很多初学者会混淆芯片、模组和开发板的概念,其实它们的关系很简单: 芯片(Soc):核心处理器,如ESP32-D0WD模…

opencv学习(图像金字塔)

1.什么是图像金字塔图像金字塔是一种多尺度图像表示方法,通过对原始图像进行下采样(缩小)和上采样(放大),生成一系列不同分辨率的图像集合,形似 “金字塔”(底部是高分辨率原始图像&…

从 C# 到 Python:项目实战第五天的飞跃

在前面三天的学习中,我们已经掌握了 Python 的基础语法、数据结构以及一些核心库的使用。今天,我们将通过三个实战项目,深入对比 C# 和 Python 在命令行工具开发、Web 应用开发以及数据处理方面的差异,感受 Python 在实际项目中的…

rabbitmq 03

一、mq的作用和使用场景 MQ的基本作用 MQ(Message Queue,消息队列)是一种应用程序对应用程序的通信方法,主要作用包括: 异步处理:解耦生产者和消费者,允许生产者发送消息后立即返回&#xff0…

Ubuntu 24.04 显示中文+使用中文键盘

ubuntu 24.04 中文显示中文键盘Ubuntu中文输入重启iBus服务Ubuntu中文输入 安装的Ubuntu24.04,一般默认是英文的,要使用中文的话,可以通过命令行设置,也可以使用‘设置’,在图形化界面中操作。 下面是在‘设置’的图形…

Docker实战:Tomcat容器从部署到自定义网页的完整操作

Docker实战:Tomcat容器从部署到自定义网页的完整操作 继Nginx容器部署后,我们再来实操Tomcat容器的使用——从拉取镜像、启动容器,到端口映射、网页挂载,全程通过实际命令演示,带你掌握Tomcat在Docker中的核心用法。 一…

使用cherry studio离线搭建私人知识库流程记录

本篇文章记录近期尝试在个人笔记本上、全离线状态下搭建知识库的流程。用到的工具包括:Cherry Studio、ollama。主要过程是:首先下载ollama用于管理大模型;然后,从魔塔社区下载需要的deepseek、千问大模型和bge-m3嵌入模型&#x…

【工具类】Linux 环境利用 uv 安装多版本 python

文章目录前置工作环境说明如果kali无法访问网络pypi 换源安装 uvuv 写入环境变量临时写入永久写入无法打开 github 解决方案(注意此方法可能也会失效)安装多版本 python查看已安装的pythonuv python install到 uv 的 github 主页,找安装文件下…

求职招聘小程序源码招聘小程序开发定制

身份:求职者、企业求职者:完善简历,简历投递企业:企业入驻,查看简历企业会员:半年 、年度 权益:每日发布条数、刷新条数,简历下载数量聊天:求职者可以和企业聊天招聘会…

Git 使用全指南:从配置到免密登录

Git 使用全指南:从配置到免密登录一、Git 基础配置二、Git 代码提交流程2.1 克隆远程仓库2.2 创建并切换分支2.3 暂存文件2.4 提交到本地仓库2.5 拉取远程最新代码2.6 推送本地分支到远程三、VSCode 服务器免密登录配置3.1 生成 Windows SSH 密钥3.2 复制公钥到服务…