当前位置: 首页 > news >正文

openmv特征点检测

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.xdnf.cn/news/1192681.html

相关文章:

  • 如何使用Anaconda(miniconda)和Pycharm
  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频语义理解与智能检索进阶(365)
  • x86汇编语言入门基础(三)汇编指令篇5 串操作
  • Windows11下和Vmware中的Ubuntu22.04设置samba服务遇到的一个问题- valid users和guest设置冲突
  • 零基础学习性能测试第三章:jmeter构建性能业务场景
  • java网络请求工具类HttpUtils
  • 智慧水库管理系统中标签工厂的建立方案
  • HTTP 协议的基本格式和 fiddler 的用法
  • PHP语法高级篇(六):面向对象编程
  • 可调谐激光器原理与设计 【DFB 与 DBR 激光器剖析】
  • 详解力扣高频SQL50题之1141. 查询近30天活跃用户数【简单】
  • 【区块链安全】DeFi协议安全漏洞深度分析:从闪电贷攻击到MEV套利
  • Nuxt 4:前端开发的全新篇章
  • java集合框架面试点(2)
  • 【C语言进阶】程序环境和预处理
  • 各种前端框架界面
  • HighlightingSystem
  • 精密全波整流电路(四)
  • Linux 如何统计系统上各个用户登录(或者登出)记录出现的次数?
  • python 检测蜂窝网络,实现掉网自动拨号
  • 自定义定时任务功能详解
  • SGLang 核心技术详解
  • GO 从入门到精通2
  • TCP如何解决网络切换问题
  • 简单实现支付密码的页面及输入效果
  • @PathVariable与@RequestParam的区别
  • Zama+OpenZeppelin:将机密智能合约带入 DeFi 和数字资产领域
  • 拒绝SQL恐惧:用Python+pyqt打造任意Excel数据库查询系统
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 热词数量分析日期统计功能实现
  • 【数据结构】二叉树初阶详解(二):实现逻辑与代码拆解(超详版)