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.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 復制公鑰到服務…