25電賽e題雜亂環境穩定識別矩形框(附源碼)

?

識別并跟蹤矩形目標

識別視頻中符合矩形輪廓的目標區域,并標記中心點位置。

實現思路

  1. **圖像預處理:灰度 + 二值化
  2. **閉運算消除孔洞
  3. 二值化處理
  4. 查找并篩選矩形輪廓
  5. 解算中心點
  6. 目標篩選
  7. 結果繪制

環境

使用 OpenCV 和 python:

圖像預處理:灰度 + 二值化

將讀取到的幀轉換為灰度圖,再進行閾值二值化處理。
這里采用 反向二值化(白底黑物體),便于檢測黑色矩形:

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY_INV)

在這里插入圖片描述

閉運算消除孔洞

closed = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_RECT, (50, 50)))
  • 閉運算 : 膨脹后腐蝕,可去除圖中小孔洞和斷裂,提高矩形輪廓連通性。
    在這里插入圖片描述
    閉運算后圖像(輪廓更完整)

查找并篩選矩形輪廓

使用 cv2.findContours() 提取所有閉合輪廓,再篩選出“近似矩形”的輪廓:

is_rect, approx = is_approx_rect(cnt)
def is_approx_rect(contour, epsilon_factor=0.02):     peri = cv2.arcLength(contour, True)     approx = cv2.approxPolyDP(contour, epsilon_factor * peri, True)     return (4 <= len(approx) <= 5 and cv2.isContourConvex(approx)), approx
  • 調用 cv2.approxPolyDP() 將輪廓多邊形逼近
  • 條件:點數為 4~5 且輪廓是凸的

在這里插入圖片描述

                 保留下的近似矩形輪廓圖像

解算中心點

通過輪廓的幾何矩獲取中心點坐標:

def calc_center(approx):     M = cv2.moments(approx)     if M["m00"] == 0:         return None     return int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])

目標篩選(追蹤最近矩形)

  • 第一幀:選取面積最大的矩形
  • 后續幀:優先選取與上一幀中心點距離最近的矩形
  • 距離在 50 像素內的多個候選中,選擇面積最大的
    距離計算函數如下:
cv2.drawContours(display_frame, [approx], -1, (0, 0, 255), 5)
cv2.circle(display_frame, center, 7, (0, 0, 255), -1)

結果繪制

cv2.drawContours(display_frame, [approx], -1, (0, 0, 255), 5) cv2.circle(display_frame, center, 7, (0, 0, 255), -1)
  • 紅色畫出識別輪廓
  • 紅點標記中心點位置
    在這里插入圖片描述
    最終效果
    電賽e題,雜亂環境穩定識別,-嗶哩嗶哩

完整cv代碼

創作不易,點個贊再走哦

import cv2
import numpy as npdef is_approx_rect(contour, epsilon_factor=0.02):peri = cv2.arcLength(contour, True)approx = cv2.approxPolyDP(contour, epsilon_factor * peri, True)return (4 <= len(approx) <= 5 and cv2.isContourConvex(approx)), approxdef calc_center(approx):M = cv2.moments(approx)if M["m00"] == 0:return Nonereturn int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])def distance(p1, p2):return np.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2)def main():cap = cv2.VideoCapture("222.mp4")if not cap.isOpened():print("打開視頻失敗")returnprev_center = Nonewhile True:ret, frame = cap.read()if not ret:breakgray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)_, binary = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY_INV)closed = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_RECT, (50, 50)))contours_data = cv2.findContours(closed, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)contours = contours_data[1] if len(contours_data) == 3 else contours_data[0]candidates = []for cnt in contours:is_rect, approx = is_approx_rect(cnt)if is_rect:center = calc_center(approx)if center:candidates.append((approx, center, cv2.contourArea(approx)))if not candidates:selected = Noneelif prev_center is None:selected = max(candidates, key=lambda x: x[2])else:candidates.sort(key=lambda x: distance(x[1], prev_center))top_n = [candidates[0]]for c in candidates[1:]:if distance(c[1], prev_center) - distance(candidates[0][1], prev_center) < 50:top_n.append(c)else:breakselected = max(top_n, key=lambda x: x[2])display_frame = frame.copy()contour_img = np.zeros_like(frame)if selected:approx, center, _ = selectedcv2.drawContours(display_frame, [approx], -1, (0, 0, 255), 5)cv2.circle(display_frame, center, 7, (0, 0, 255), -1)cv2.drawContours(contour_img, [approx], -1, (0, 255, 0), 3)prev_center = centerelse:prev_center = Nonecv2.imshow("原視頻", display_frame)cv2.imshow("二值化", binary)cv2.imshow("閉運算", closed)cv2.imshow("輪廓", contour_img)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()if __name__ == "__main__":main()

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

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

相關文章

【前端安全】聊聊 HTML 閉合優先級和瀏覽器解析順序

【前端安全】聊聊瀏覽器解析順序和 HTML 閉合優先級 最近在研究 XSS 的時候&#xff0c;發現一個特別容易被忽略的問題 —— 瀏覽器到底是怎么解析 HTML 的&#xff1f;為什么有些 payload 成功了&#xff0c;有些卻怎么試都不行&#xff1f;其實這跟標簽的閉合優先級還有解析順…

PHP-分支語句、while循環、for循環

分支語句 無論在何種編程語言中&#xff0c;流程控制都是很重要的內容。由于 PHP 的大部分語法都繼承了C語言的特點&#xff0c; 因此在流程控制方面&#xff0c;PHP 有著和C語言類似的流程控制。 if else 語句是流程控制中根據條件判斷執行的一種。該語句執行時先對條件進行判…

并發編程常用工具類(下):CyclicBarrier 與 Phaser 的協同應用

在并發編程中&#xff0c;除了CountDownLatch和Semaphore&#xff0c;CyclicBarrier和Phaser也是實現多線程協作的重要工具。它們在處理多階段任務同步、動態調整參與線程等場景中展現出獨特價值。本文作為并發工具類系列的第二篇&#xff0c;將深入解析CyclicBarrier和Phaser的…

機器人焊接節氣裝置

在摩托車制造過程中&#xff0c;精密部件的焊接質量直接影響整車的安全性和操控性能。以發動機缸體焊接為例&#xff0c;傳統手工焊接容易出現焊縫不均勻的問題&#xff0c;而采用六軸弧焊機器人后&#xff0c;焊接精度能控制在0.1毫米以內。日本川崎重工的生產數據顯示&#x…

使用yolo11訓練食物浪費檢測數據集VOC+YOLO格式6734張32類別步驟和流程

【數據集介紹】數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件)圖片數量(jpg文件個數)&#xff1a;6734標注數量(xml文件個數)&#xff1a;6734標注數量(txt文件個數)&#xff1…

掌握PowerPC架構與編程技巧:技術資料詳解

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;PowerPC是一種高性能的RISC架構&#xff0c;最初由IBM、Motorola和Apple聯合開發&#xff0c;被設計用于高端工作站和服務器&#xff0c;同時廣泛應用于嵌入式系統、航空電子設備、游戲主機和超級計算機等領域。…

VR 企業展廳:開啟數字化展示新時代

在當今數字化浪潮席卷各行各業的時代&#xff0c;企業的展示與宣傳方式也在不斷革新。VR&#xff08;虛擬現實&#xff09;技術的出現&#xff0c;為企業展廳帶來了全新的變革&#xff0c;使其從傳統的實體展示空間&#xff0c;轉變為具有無限可能的數字化虛擬空間。一、VR 企業…

測試用例顆粒度全解析

引言&#xff1a;為什么顆粒度是測試團隊的“隱形門檻”&#xff1f;在軟件測試領域&#xff0c;測試用例顆粒度&#xff08;即測試用例的詳細程度&#xff09;看似是一個基礎問題&#xff0c;卻常常成為團隊協作的“隱形門檻”。某電商平臺測試團隊曾出現過這樣的窘境&#xf…

分布式鎖的基本原理和基于lua腳本的實現(Redisson)

為了確保分布式鎖可用&#xff0c;我們要確保鎖的實現同時滿足以下四個條件&#xff1a;- 互斥性。在任意時刻&#xff0c;只有一個客戶端能持有鎖。- 不會發生死鎖。即使有一個客戶端在持有鎖的期間崩潰而沒有主動解鎖&#xff0c;也能保證后續其他客戶端能加鎖。- 解鈴還須系…

智慧園區數字孿生全生命周期交付體系:從虛擬建模到全域智聯的快速交付新常態

在數字經濟與綠色低碳轉型的雙重驅動下&#xff0c;智慧園區建設正經歷從“物理空間堆砌”到“數據智能驅動”的范式革命。數字孿生技術作為核心引擎&#xff0c;通過構建物理園區的虛擬鏡像&#xff0c;實現虛實空間的毫秒級同步與智能協同&#xff0c;推動園區管理向全要素感…

電腦忘記開機密碼怎么辦?【圖文詳解】5種方法重置/更改/取消/設置開機密碼?

一、問題背景誰都有馬虎的時候&#xff0c;要是突然忘了電腦開機密碼&#xff0c;就只能對著登錄界面干著急&#xff0c;沒法打開電腦處理工作、查看文件&#xff0c;太影響效率了。別慌&#xff0c;其實有不少簡單實用的辦法能解除或重置密碼&#xff0c;下面就來一一介紹&…

Go語言select

select是什么select是Go語言層面提供的一種多路復用機制&#xff0c;用于檢測當前goroutine連接的多個channel是否有數據準備完畢&#xff0c;可用于讀或寫。Go語言的select語句&#xff0c;是用來起一個goroutine監聽多個Channel的讀寫事件&#xff0c;提高從多個Channel獲取信…

VUE+SPRINGBOOT從0-1打造前后端-前后臺系統-整體示例

一、注冊、登錄、密碼找回二、VUE前臺系統三、VUE后臺系統

深入解析SmolVLA:VLM與動作專家間的注意力機制交互

在機器人學習領域&#xff0c;如何有效地將視覺語言模型&#xff08;VLM&#xff09;的強大感知能力與低級動作控制相結合&#xff0c;是實現通用機器人智能的關鍵挑戰。SmolVLA&#xff08;Small Vision-Language-Action&#xff09;架構正是在這一背景下應運而生&#xff0c;…

Spring Security 認證與授權實現機制

Spring Security 是一個功能強大且高度可定制的身份驗證和訪問控制框架&#xff0c;其認證和授權實現機制如下&#xff1a;一、認證(Authentication)實現 1. 核心組件 AuthenticationManager&#xff1a;認證入口點&#xff0c;委托給AuthenticationProviderAuthenticationProv…

開源的時間跟蹤工具TimeTagger

簡介 什么是 TimeTagger &#xff1f; TimeTagger 是一個開源的時間跟蹤工具&#xff0c;旨在幫助用戶記錄和分析他們的時間使用情況。它提供了一個互動的用戶界面和強大的報告功能&#xff0c;適合個人和自由職業者使用。 主要特點 直觀的用戶界面&#xff1a;基于互動時間線…

學習游戲制作記錄(角色屬性和狀態腳本)8.4

1.實現簡單的角色屬性創建CharactorState腳本&#xff1a;掛載在敵人和玩家身上public float damage;//角色傷害public float maxHp;//最大生命[SerializeField] private float currentHealth;//當前生命void Start(){currentHealth maxHp;//初始化將當前生命設置為最大生命}p…

04-Chapter02-Example01

文章介紹 1、完善項目結構 1.1 新建第二章對應模塊Chapter021.2 新建模塊Chapter02對應包com.itheima1.3 在包com.itheima下新建class類 &#xff0c;類名稱Example01.java項目結構如下&#xff1a;2、編寫Example01.java代碼 P38 package com.itheima;public class Example01…

【達夢MPP(帶主備)集群搭建】

達夢MPP&#xff08;帶主備&#xff09;集群搭建 為了提高MPP系統可靠性&#xff0c;克服由于單節點故障導致整個系統不能繼續正常工作的問題&#xff0c;DM在普通的MPP系統基礎上&#xff0c;引入數據守護主備機制&#xff0c;為每一個MPP節點配置一個實時備庫作為備份節點&a…

Java基礎學習(一):類名規范、返回值、注釋、數據類型

目錄 一、類名規范二、返回值三、注釋四、數據類型 1. 基本類型2. 引用類型3. 強制數據類型轉換4. 進制5. 進制的轉換6. 超范圍運算 相關文章 Java基礎學習&#xff08;二&#xff09;&#xff1a;Java中的變量和常量、final&#xff08;重點&#xff09;、運算、字符串 了…