(純新手教學)計算機視覺(opencv)實戰十四——模板與多個對象匹配

圖片旋轉、圖片鏡像相關教學:
(純新手教學)計算機視覺(opencv)實戰十三——圖片旋轉、圖片鏡像 的幾種常用方法-CSDN博客https://blog.csdn.net/2302_78022640/article/details/151356600?spm=1011.2415.3001.5331


模板與多個對象匹配

在計算機視覺中,模板匹配(Template Matching)是一種常見的圖像處理方法,能夠在大圖像中尋找與小模板相似的區域。很多時候,模板在目標圖像中可能不止出現一次,并且還可能存在旋轉的情況。因此,模板與多個對象的匹配技術就顯得非常重要。

下面的代碼演示了如何使用 OpenCV 進行模板匹配,并支持在目標圖像中同時查找多個方向的模板對象。


?核心函數:cv2.matchTemplate

OpenCV 提供了 cv2.matchTemplate 函數來實現模板匹配。

cv2.matchTemplate(image, templ, method, result=None, mask=None)

參數說明:

  • image:待搜索的圖像(通常比模板大)。

  • templ:模板圖像,需要在大圖中被搜索的目標。

  • method:匹配方法,用來衡量相似度。

  • result:存放匹配結果的矩陣,一般不用手動傳入,函數會自動生成。

  • mask:掩膜,可選參數,某些方法不支持。


常見匹配方法

模板匹配的效果依賴于所選擇的計算方式。OpenCV 提供了六種主要方法:

  1. TM_SQDIFF(平方差匹配法)

    • 使用平方差衡量誤差。

    • 匹配越好,結果值越小。

  2. TM_CCORR(相關匹配法)

    • 采用乘法運算,計算圖像與模板的相關性。

    • 數值越大表示匹配程度越高。

  3. TM_CCOEFF(相關系數匹配法)

    • 通過相關系數計算相似度,排除了亮度影響。

    • 數值越大說明匹配效果越好。

  4. TM_SQDIFF_NORMED(歸一化平方差匹配法)

    • 與 TM_SQDIFF 類似,但結果被歸一化。

    • 匹配越好,值越小。

  5. TM_CCORR_NORMED(歸一化相關匹配法)

    • 在 TM_CCORR 的基礎上進行歸一化,結果范圍更穩定。

    • 數值越大,匹配越好。

  6. TM_CCOEFF_NORMED(歸一化相關系數匹配法)

    • 在 TM_CCOEFF 的基礎上進行歸一化,最常用的一種方法。

    • 結果范圍通常在 -1 到 1 之間,越接近 1 匹配越好。


圖片準備:

arrow.jpg

arrows.jpg

運行結果圖:

代碼解析

import cv2
import numpy as npimg_rgb = cv2.imread('arrows.jpg')
cv2.imshow('img_gray', img_rgb)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)template1=cv2.imread('./arrow.jpg', flags=0)
# 旋轉 90 度,k=-1 表示順時針旋轉 90 度
template2 = np.rot90(template1, k=-1)
# 旋轉 90 度,k=1 表示逆時針旋轉 90 度
template3 = np.rot90(template1, k=1)
template4 = np.rot90(template1, k=2)
cv2.imshow('template1', template1)
cv2.imshow('template2', template2)
cv2.imshow('template3', template3)
cv2.imshow('template4', template4)
cv2.waitKey(0)templates=[template1,template2,template3,template4]for template in templates:h, w = template.shape[:2]# 使用模板匹配方法 cv2.matchTemplate 進行模板匹配res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)threshold = 0.9  # 設定匹配閾值# 獲取匹配結果中所有符合閾值的點的坐標loc = np.where(res >= threshold)  # 符合條件的行,符合條件的列# print(loc)# 遍歷所有匹配點for pt in zip(*loc[::-1]):# 在原圖上繪制匹配區域的矩形框cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), color=(0, 0, 255), thickness=1)cv2.imshow('result', img_rgb)
cv2.waitKey(0)

核心步驟講解

  1. 讀取圖像并灰度化

    • 使用 cv2.imread 讀取原始圖像 arrows.jpg,并轉換為灰度圖。

    • 灰度圖可以減少計算量,同時保留了模板匹配所需的主要信息。

  2. 加載模板并進行旋轉

    • 模板 arrow.jpg 作為基本形狀。

    • 使用 np.rot90 對模板進行旋轉,生成 4 個方向的模板(0°、90°、180°、270°)。

    • 這樣就能應對目標圖像中箭頭方向不一致的情況。

  3. 模板匹配

    • cv2.matchTemplate 用于計算模板與目標圖像各個位置的匹配程度。

    • 選擇 cv2.TM_CCOEFF_NORMED 方法,該方法會輸出歸一化相關系數,值越接近 1 表示越相似。

  4. 匹配閾值設定

    • 設置 threshold = 0.9,即相似度大于等于 0.9 的區域才認為是有效匹配。

    • 閾值過低可能引入誤檢,過高可能漏檢。

  5. 定位與繪制

    • np.where(res >= threshold) 找到所有符合條件的點。

    • 使用 cv2.rectangle 在原圖 img_rgb 上繪制矩形框,標記出匹配區域。

  6. 結果展示

    • 使用 cv2.imshow 顯示最終帶有標記的圖像。


應用場景

  1. 目標檢測
    在工廠生產線上檢測零件是否存在、方向是否正確。

  2. 游戲自動化
    在屏幕截圖中查找某個按鈕或圖標的位置,實現自動點擊。

  3. 文檔處理
    在掃描件中查找特定的標志或符號。

  4. 視頻監控
    在實時視頻中檢測特定物體的出現與方向。


方法優缺點

  • 優點

    • 實現簡單,代碼量少。

    • 適合已知模板的精確匹配任務。

    • 可以通過旋轉模板來解決方向差異。

  • 缺點

    • 對尺度變化不敏感(如果模板大小與目標圖像中對象大小不同,效果不好)。

    • 對光照、噪聲等變化敏感。

    • 計算效率在大規模匹配時較低。


總結

通過這段代碼,可以看到如何使用 OpenCV 的模板匹配方法,結合旋轉操作,在圖像中查找多個方向的相同目標對象。該方法在簡單場景下效果顯著,尤其適合對象外形固定、尺寸不變的任務。

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

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

相關文章

Java面試核心知識點總結:Redis與MySQL高可用、高并發解決方案

在分布式系統開發中,高并發場景下的數據一致性、系統可用性以及性能優化始終是核心挑戰。本文基于Java技術棧,結合Redis與MySQL的工程實踐,系統梳理分布式系統設計的關鍵技術要點。一、Redis集群架構演進與高可用實踐1.1 主從哨兵模式部署方案…

R 語言科研繪圖第 72 期 --- mantel檢驗圖

在發表科研論文的過程中,科研繪圖是必不可少的,一張好看的圖形會是文章很大的加分項。 為了便于使用,本系列文章介紹的所有繪圖都已收錄到了 sciRplot 項目中,獲取方式: R 語言科研繪圖模板 --- sciRplothttps://mp.…

4.2-中間件之MySQL

4.2.1MySQL的基本知識SQL語句用于存取數據以及查詢、更新和管理關系數據庫系統。包括:DQL(select)、DML(insert,update,delete)、DDL(create,alter,drop)、DCL(grant,revoke&#xf…

LVS + Keepalived 高可用負載均衡集群

目錄 一、核心組件與作用 1. LVS(Linux Virtual Server) 2. Keepalived 二、DR 模式下的 LVS Keepalived 工作原理 1. 整體架構 2. 數據包流向(DR 模式) 三、部署步驟(DR 模式) 3.1 環境規劃 3.2…

知識沉淀過于碎片化如何形成體系化框架

要將過于碎片化的知識沉淀轉變為體系化的框架,必須采取一套自上而下設計與自下而上歸集相結合的系統性方法,其核心路徑在于首先進行戰略性診斷與頂層藍圖設計、其次構建統一且可擴展的知識架構(分類與標簽體系)、然后實施系統性的…

XLua教程之C#調用Lua

上一篇文章 XLua教程之入門篇-CSDN博客 在C#腳本中訪問lua全局數據,特別是table以及function,代價比較大,建議盡量少做相關操作。 LuaEnv.Global.Get 用于獲取一個全局變量,但是無法獲取局部變量(用local修飾) 全局基本類型變量…

C++ 標準庫中的哈希函數:從std::hash到自定義哈希器

C 標準庫中的哈希函數:從 std::hash 到自定義哈希器 1. 引言 在上一篇中,我們介紹了哈希表為什么能夠實現 O(1) 查找。 核心秘密在于:哈希函數。 在 C 標準庫中,哈希表容器(如 unordered_map、unordered_set&#xff0…

在圖形 / 游戲開發中,為何 Pixels Per Unit(PPU)數值越小,物體在屏幕上顯示的尺寸越大?

1. 什么是 PPU? PPU(Pixels Per Unit)指的是 多少像素對應游戲世界中的一個單位(Unit)。 在 Unity 等游戲引擎中,1 Unit 通常被視為世界空間的基本長度,比如 1 米。2. PPU 與物體大小的關系PPU …

【ZYNQ開發篇】Petalinux和電腦端的靜態ip地址配置

使用Petalinux工具為ZYNQ板卡搭建嵌入式Linux操作系統,成功搭建后,用戶通常會使用客戶端軟件對ZYNQ板卡上的Linux系統進行訪問,軟件需要知道ZYNQ板卡的ip地址才能進行訪問,如果ip地址是動態變化的,軟件每次訪問都要重新…

AVL樹知識總結

AVL樹概念性質一顆AVL樹或是空樹,或者具有一下性質的二叉搜索樹:左右都是AVL樹,左右子樹高度差的絕對值不超過1AVL樹有n個結果,高度保持在O(logN) 搜索時間復雜度O(logN)模擬實現插入定義&#…

返利app的跨域問題解決方案:CORS與反向代理在前后端分離架構中的應用

返利app的跨域問題解決方案:CORS與反向代理在前后端分離架構中的應用 大家好,我是阿可,微賺淘客系統及省賺客APP創始人,是個冬天不穿秋褲,天冷也要風度的程序猿! 在返利APP的前后端分離架構中,跨…

【dl】python基礎 深度學習中需要用到的python基礎

直接在jupyter寫筆記然后導出md格式真的太好用了本文筆記來自小破站視頻BV1K14y1c75ePython 基礎 1. 變量 1.1 三種基本變量類型 # 字符串 str str_v "123"# 數字 int或float num_v 11 float_v 12.0# 布爾型 bool bool_v True1.1.1 字符串 f字符串:在…

Vue FullPage.js 完整使用指南:Vue 3 官方全屏滾動解決方案

概述 vue-fullpage.js 是 FullPage.js 的官方 Vue.js 3 包裝器,為 Vue 3 應用提供了強大的全屏滾動功能。該插件基于成熟的 FullPage.js 庫,支持多種滾動效果和豐富的配置選項,特別適用于企業級數據大屏、產品展示、單頁應用等場景。 官方信…

軟件工程實踐一:Git 使用教程(含分支與 Gitee)

文章目錄目標一、快速上手1. Windows 安裝 Git2. 初始化 / 克隆二、核心概念速覽三、常用命令清單1) 查看狀態與差異2) 添加與提交3) 歷史與回溯4) 撤銷與恢復(Git 2.23 推薦新命令)5) 忽略文件四、分支與合并(Branch & Merge&#xff09…

css`min()` 、`max()`、 `clamp()`

min() 用來計算多個數值中最小的那個,非常適合做自適應。 width: min(50vw, 500px) 50vw 表示 視口寬度的 50% 500px 表示 500px min(50vw, 500px) 表示會取兩者中 最小的那個 作為最終的寬度,。 使用場景 限制某個元素寬度不超過某個值; 響…

【WRF-VPRM 預處理器】HEG 安裝(服務器)-MRT工具替代

目錄 HEG 安裝 驗證 HEG 安裝與否 設置環境變量(建議) 命令行接口(Command Line Interface) hegtool 工具 hegtool 用法 Header File 格式 功能1:`gdtif` 工具 – MISR 數據處理 `gdtif` 使用方式 參數文件格式(Parameter File Format) 功能2:`resample` 工具 – 重采樣…

PyTorch 神經網絡

神經網絡是一種模仿人腦神經元鏈接的計算模型, 由多層節點組成, 用于學習數據之間的復雜模式和關系。神經網絡通過調整神經元之間的連接權重來優化預測結果,這個過程可以涉及到向前傳播,損失計算,反向傳播和參數更新。…

詳細解析蘋果iOS應用上架到App Store的完整步驟與指南

📱蘋果商店上架全流程詳解 👩?💻想要將你的App上架到蘋果商店?跟隨這份指南,一步步操作吧! 1?? 申請開發者賬號:訪問蘋果開發者網站,注冊并支付99美元年費,獲取開發者…

三維GIS開發實戰!Cesium + CZML 實現火箭飛行與分離的 3D 動態模擬

CZML是一種基于JSON的數據格式,專門用于在Cesium中描述3D場景和時間動態數據。本文將詳細介紹了CZML的特點(JSON格式、時間動態性、層次結構等)和基本組件,并給出了一個火箭發射的實例。通過搭建Cesium開發環境(使用vi…

Spring Boot 深入剖析:BootstrapRegistry 與 BeanDefinitionRegistry 的對比

在 Spring Boot 的啟動過程中,BootstrapRegistry 和 BeanDefinitionRegistry 是兩個名為“Registry”卻扮演著截然不同角色的核心接口。理解它們的差異是深入掌握 Spring Boot 啟動機制和進行高級定制開發的關鍵。BootstrapRegistry public static ConfigurableAppl…