【2025年電賽E題】基于k230的矩形框識別鎖定1

文章目錄

    • 概要
    • 整體架構流程
    • 技術名詞解釋
    • 技術細節
      • 1. 多閾值適配與目標識別邏輯
      • 2. 動態ROI與狀態管理機制
      • 3. 數據平滑與偏差計算
      • 4. 硬件適配與UART通信
    • 小結
  • 靜態矩形框識別
  • 動態矩形框追蹤

概要

本文分析的代碼是基于立創·廬山派K230CanMV開發板的目標追蹤系統實現,主要功能是通過GC2093傳感器采集圖像,識別特定"黑框白心"目標(如帶黑色邊框的白色標記物),計算目標位置偏差并通過UART串口發送數據,同時在顯示器(虛擬窗口、LCD或HDMI)上實時展示追蹤過程及調試信息。

整體架構流程

代碼整體遵循"初始化-循環處理-資源釋放"的經典嵌入式系統流程,具體步驟如下:

  1. 系統初始化

    • 硬件配置:初始化FPIOA引腳映射,配置UART2(波特率115200)用于數據傳輸。
    • 傳感器初始化:啟動GC2093傳感器,設置分辨率(400x240)和灰度模式,開始采集圖像。
    • 顯示器初始化:根據DISPLAY_MODE(VIRT/LCD/HDMI)初始化對應顯示設備,設置顯示分辨率。
    • 媒體管理:初始化MediaManager協調傳感器與顯示器資源。
  2. 主循環處理

    • 圖像采集:通過sensor.snapshot()獲取實時圖像。
    • 目標識別:調用find_target_blob()在當前ROI內搜索"黑框白心"目標,結合多閾值和形態篩選規則驗證目標。
    • 動態ROI調整:若鎖定目標,縮小ROI至目標周圍(提高效率);若目標丟失,逐步擴大ROI至全視野(重新搜索)。
    • 數據處理:計算目標與畫面中心的偏差,通過smooth_target()平滑坐標,減少抖動。
    • 狀態管理:通過is_locked標記目標狀態,lost_frames計數連續丟失幀數,超過閾值則重置狀態。
    • 數據發送與顯示:通過UART發送目標狀態及坐標,在圖像上繪制輔助線、ROI和調試信息,最終通過顯示器展示。
  3. 資源釋放

    • 異常處理:捕獲鍵盤中斷或其他異常時,停止傳感器、關閉顯示器、釋放媒體資源,確保系統安全退出。

技術名詞解釋

  1. HSV閾值(thr_white/thr_black)
    用于顏色(灰度)識別的范圍參數。代碼中通過灰度值范圍定義"白色"和"黑色"區域,多閾值配置(列表形式)可適應不同光照下的顏色偏差(如強光/弱光下白色的灰度值范圍變化)。

  2. ROI(Region of Interest,感興趣區域)
    圖像中需要重點處理的區域。通過限制處理范圍減少計算量:目標鎖定時縮小ROI(圍繞目標),目標丟失時擴大ROI(逐步恢復全視野)。

  3. Blob分析
    對圖像中連通的像素區域(色塊)進行分析的技術。代碼中通過find_blobs()識別黑色邊框和白色中心的色塊,結合面積、長寬比等特征篩選有效目標。

  4. 實心度(Solidity)
    色塊實際像素數與外接矩形面積的比值,用于判斷色塊的"填充程度"。代碼中利用實心度篩選空心黑色邊框(實心度低),排除實心噪聲區域。

  5. UART(通用異步收發傳輸器)
    一種串行通信協議,代碼中用于將目標狀態、坐標等數據發送到外部設備(如控制器),波特率115200確保數據傳輸穩定。

  6. 幀率(FPS)
    每秒處理的圖像幀數,反映系統實時性。代碼中通過time.ticks_ms()計算幀率,用于評估系統性能。

技術細節

1. 多閾值適配與目標識別邏輯

代碼通過多閾值解決光照適應性問題,核心在于"黑框優先+白心驗證"的雙層識別策略:

# 多閾值配置(適應不同光照下的黑白識別)
thr_white = [(200, 255)]  # 白色中心的灰度范圍(可擴展多組)
thr_black = [(0, 60)]     # 黑色邊框的灰度范圍(可擴展多組)def find_target_blob(img, roi):# 1. 先找黑色邊框(多閾值遍歷+合并相鄰色塊)black_blobs = []for t in thr_black:blobs = img.find_blobs([t], roi=roi, merge=True)  # merge=True合并相鄰色塊if blobs:black_blobs.extend(blobs)# 2. 對每個黑色邊框驗證是否包含白色中心for b_blob in black_blobs:# 篩選黑色邊框(面積、長寬比、實心度)if not (MIN_RECT_AREA < b_blob.area() < MAX_RECT_AREA and0.5 < b_blob.w()/b_blob.h() < 2.0 and0.1 < b_blob.solidity() < 0.35):continue# 在黑色邊框內部10%邊距內搜索白色中心inner_roi = b_blob.rect()inner_margin = int(min(inner_roi[2], inner_roi[3]) * 0.1)inner_roi = (inner_roi[0] + inner_margin,inner_roi[1] + inner_margin,inner_roi[2] - 2*inner_margin,inner_roi[3] - 2*inner_margin)# 驗證白色中心white_blobs = []for t in thr_white:w_blobs = img.find_blobs([t], roi=inner_roi)if w_blobs:white_blobs.extend(w_blobs)if white_blobs:w_blob = max(white_blobs, key=lambda b: b.area())  # 取最大白色塊# 檢查白心是否在黑框中心區域dx = abs(w_blob.cx() - b_blob.cx())dy = abs(w_blob.cy() - b_blob.cy())if dx < b_blob.w()*0.15 and dy < b_blob.h()*0.15:return (b_blob, w_blob)  # 返回匹配的黑框白心return (None, None)

代碼解析

  • 多閾值遍歷:通過thr_blackthr_white列表支持多組灰度范圍,解決單一閾值在強光/弱光下失效的問題。
  • 合并相鄰色塊:merge=True確保斷裂的黑色邊框被識別為完整區域(如邊框有缺口時仍能正常識別)。
  • 內邊距ROI:在黑色邊框內部10%區域搜索白色中心,避免背景干擾,確保"心在框內"的特征匹配。

2. 動態ROI與狀態管理機制

通過ROI自適應調整平衡搜索效率與范圍,結合狀態標記實現穩定跟蹤:

# 初始化全視野ROI
current_roi = (0, 0, sensor.width(), sensor.height())
is_locked = False
lost_frames = 0
MAX_LOST_FRAMES = 8  # 連續丟失8幀則重置狀態while True:img = sensor.snapshot()b_blob, w_blob = find_target_blob(img, current_roi)if b_blob and w_blob:# 目標鎖定:縮小ROI至目標周圍is_locked = Truelost_frames = 0# 計算鎖定狀態下的ROI(目標周圍90%范圍)lock_roi = (max(0, b_blob.x() - int(b_blob.w()*0.05)),max(0, b_blob.y() - int(b_blob.h()*0.05)),min(sensor.width(), b_blob.w()*1.1),min(sensor.height(), b_blob.h()*1.1))current_roi = lock_roielse:# 目標丟失:逐步擴大ROIlost_frames += 1if lost_frames > MAX_LOST_FRAMES:is_locked = False# 每次擴大100像素(限制在全視野內)new_x = max(0, current_roi[0] - 50)new_y = max(0, current_roi[1] - 50)new_w = min(sensor.width(), current_roi[2] + 100)new_h = min(sensor.height(), current_roi[3] + 100)current_roi = (new_x, new_y, new_w, new_h)

代碼解析

  • 鎖定狀態優化:目標鎖定時ROI縮小為目標尺寸的1.1倍,減少背景處理量(如400x240圖像中,ROI縮小后計算量可降低60%以上)。
  • 丟失恢復策略:目標丟失后,ROI每次向外擴展50像素(橫向/縱向),逐步恢復全視野,避免瞬間擴大導致的計算量激增。
  • 狀態容錯機制:MAX_LOST_FRAMES=8允許短時間遮擋(約0.2~0.3秒,按30FPS計算),防止誤判丟失。

3. 數據平滑與偏差計算

通過指數平滑減少抖動,結合視角補償提升跟蹤穩定性:

# 數據平滑與偏差計算
prev_x, prev_y = 0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94879.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94879.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94879.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言中的數組可以用int a[3]來創建。寫一次int就可以了,而java中要聲明兩次int類型像這樣:int[] arr = new int[3];

C 語言數組只需寫一次int&#xff0c;而 Java 需兩次int相關聲明&#xff0c;核心原因是兩種語言的數組本質定義、類型系統設計和內存管理邏輯完全不同&#xff0c;具體可拆解為兩點核心差異&#xff1a;一、C 語言&#xff1a;數組是 “內存塊的類型綁定”&#xff0c;一次聲明…

深度學習——詳細教學:神經元、神經網絡、感知機、激活函數、損失函數、優化算法(梯度下降)

神經網絡實戰&#xff1a; 深度學習——神經網絡簡單實踐&#xff08;在乳腺癌數據集上的小型二分類示例&#xff09;-CSDN博客https://blog.csdn.net/2302_78022640/article/details/150779819?spm1001.2014.3001.5502 深度學習——神經網絡&#xff08;PyTorch 實現 MNIST…

Ubuntu 軟件安裝的五種方法

1、App Store 安裝 Ubuntu 里面有 一個App叫 “Ubuntu軟件” 2、Sudo apt-get install 安裝法 注意 使用apt工具安裝軟件&#xff0c;需要sudo&#xff0c;也就是root權限 例子 apt -get install git 會提示查看是否以root用戶運行&#xff0c;install-安裝sudo a…

Day15 (前端:JavaScript基礎階段)

接續上文&#xff1a;Day14——JavaScript 核心知識全解析&#xff1a;變量、類型與操作符深度探秘-CSDN博客 點關注不迷路喲。你的點贊、收藏&#xff0c;一鍵三連&#xff0c;是我持續更新的動力喲&#xff01;&#xff01;&#xff01; 主頁:一位搞嵌入式的 genius-CSDN博…

在線旅游及旅行管理系統項目SQL注入

1.前言 之前在網上隨便逛逛的時候&#xff0c;發現一個有各種各樣的PHP項目的管理系統&#xff0c;隨便點進一個查看&#xff0c;發現還把mysql版本都寫出來了&#xff0c;而且還是PHP語言。 https://itsourcecode.com/free-projects/php-project/online-tours-and-travels-m…

Java網絡編程(UDP, TCP, HTTP)

1. OSI 七層網絡模型層級名稱核心功能協議示例數據單元7應用層提供用戶接口和網絡服務HTTP, FTP, SMTP, DNS報文6表示層數據格式轉換、加密/解密、壓縮/解壓SSL, JPEG, MPEG數據流5會話層建立、管理和終止會話連接NetBIOS, RPC會話數據4傳輸層端到端可靠傳輸、流量控制、差錯校…

【P2P】P2P主要技術及RELAY服務1:python實現

P2P 技術 P2P(點對點)網絡的核心是去中心化的網絡拓撲和通信協議。DP的應用相對較少,但可能出現在: 路由優化:在一些復雜的P2P網絡中,一個節點需要向另一個節點發送消息。為了找到一條延遲最低或跳數最少的路徑,可能會用到類似最短路徑的算法,而這類算法(如Bellman-F…

docker 安裝 redis 并設置 volumes 并修改 修改密碼(一)

在 Docker 中安裝 Redis 并設置volumes持久化數據,同時修改 Redis 密碼的完整步驟如下: 安裝 Docker 如果還沒有安裝 Docker,可以參考以下步驟安裝: 在 Alibaba Cloud Linux 上安裝 Docker # 更新系統 sudo yum update -y# 安裝 Docker 依賴 sudo yum install -y yum-util…

如何找出所有連接到本機指定端口的客戶端 IP

在日常運維或排查網絡問題時&#xff0c;我們常常需要知道&#xff1a;有哪些客戶端正在連接我的服務&#xff1f;連接數是否異常&#xff1f;是否存在惡意掃描或 DDoS 行為&#xff1f;本文將教你使用一條簡潔高效的 Linux 命令組合&#xff0c;統計連接到本機某個端口&#x…

java IDE安裝idea社區版步驟

IntelliJ IDEA 社區版&#xff08;Community Edition&#xff09;是一款功能強大且完全免費的集成開發環境&#xff0c;非常適合 Java 和 Kotlin 初學者或進行基礎開發2。我會為你提供詳細的安裝步驟。 &#x1f6e0; IntelliJ IDEA 社區版安裝指南 &#x1f4cb; 系統要求與…

Agent智能體

什么是 Agent&#xff1f; Agent 是一個智能體&#xff0c;可以接收用戶請求&#xff0c;利用大模型&#xff08;LLM&#xff09;的推理能力&#xff0c;自動決定&#xff1a; 自己回答還是調用外部工具&#xff08;數據庫、API、腳本等&#xff09; 最終把結果返回給用戶。 能…

【VSCode】使用VSCode打開md文件以及轉化為PDF

【VSCode】使用VSCode打開md文件以及轉化為PDF在 Visual Studio Code (VS Code) 中渲染 Markdown 并保存為 PDF&#xff0c;可以通過以下步驟實現。 首先安裝好 VSCode&#xff0c;可以參考下述鏈接 https://blog.csdn.net/weixin_43848614/article/details/148042035 安裝m…

蘋果ImageIO零日漏洞分析:攻擊背景與iOS零點擊漏洞歷史對比

蘋果公司已緊急發布全生態系統安全更新&#xff0c;修復編號為CVE-2025-43300的ImageIO框架高危零日漏洞&#xff08;zero-day&#xff09;&#xff0c;該漏洞已被用于復雜的定向攻擊。這是蘋果在2025年修復的第七個零日漏洞&#xff0c;凸顯iOS和macOS設備面臨的威脅持續升級。…

面試 TOP101 遞歸/回溯專題題解匯總Java版(BM55 —— BM61)

8月刷題挑戰&#xff0c;多重好禮等你拿 遞歸/回溯 題號題目名稱核心思路時間復雜度空間復雜度代碼亮點牛客原題鏈接BM55沒有重復項數字的全排列使用回溯法生成所有排列O(n!)O(n)使用回溯法生成所有排列&#xff0c;邏輯清晰&#x1f517; 直達BM56有重復項數字的全排列使用回…

音頻相關數學知識

時域&#xff08;Time domain&#xff09;是描述數學函數或物理信號對時間的關系&#xff0c;如果聲音對應頻率正負波動&#xff0c;對應事件x軸為時間&#xff0c;y軸為振幅頻域信號在頻率方面特性&#xff0c;如射頻范圍正弦型函數可以用來虛擬音頻&#xff0c;正弦&#xff…

SAP-ABAP:SAP HANA 架構解析:主從(Scale-Out)與主備(High Availability)架構深度對比

SAP HANA 架構解析&#xff1a;主從&#xff08;Scale-Out&#xff09;與主備&#xff08;High Availability&#xff09;架構深度對比 一、架構概述 在SAP HANA數據庫系統中&#xff0c;兩種核心架構模式解決了不同的業務需求&#xff1a;主從架構&#xff08;Scale-Out&#…

【Hadoop】HDFS 分布式存儲系統

Namenode是整個HDFS文件系統的前端&#xff0c;只有一個&#xff0c;管理數據塊映射信息&#xff0c;配置副本策略&#xff0c;處理客戶端的讀寫請求。Secondary namenode是namenode的熱備&#xff0c;當active namenode出現故障時&#xff0c;快速切換為新的active namenode。…

[特殊字符] 如何在自己的倉庫開發,同時保持同步原作者更新(超詳細教程)

在開源協作開發中&#xff0c;很多時候我們會遇到這樣一種情況&#xff1a; &#x1f449; 我們想基于一個開源項目繼續開發&#xff0c;代碼要推送到自己的倉庫里&#xff1b; &#x1f449; 但原作者可能還會更新&#xff0c;我們也希望能隨時把最新的改動同步過來。 本文以 …

Spring Ai (Function Calling / Tool Calling) 工具調用

1.工具調用介紹 工具調用是現代大語言模型&#xff08;LLM&#xff09;的一項重要能力&#xff0c;允許模型在生成回復時“決定”是否需要調用某個外部函數來獲取信息或執行操作。例如&#xff1a; 聯網搜索 &#xff08;實現查詢到大模型未學習和RAG知識庫中不存在的數據&am…

LabVIEW 正弦波噪聲濾波

利用 LabVIEW 搭建程序&#xff0c;先合成含噪正弦波&#xff08;正弦信號與高通濾波后的噪聲疊加&#xff09;&#xff0c;再通過低通濾波提取純凈正弦波&#xff0c;實現噪聲去除&#xff0c;常用于信號處理、測試測量場景&#xff0c;驗證濾波算法對正弦信號的降噪效果。?功…