利用OpenCV實現模板與多個對象匹配

代碼實現:

import cv2
import numpy as npimg_rgb = cv2.imread('mobanpipei.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('jianto.jpg', flags=0)
h, w = template.shape[:2]# 讀取圖像# # 順時針旋轉 90 度(k=1)
# rotated_image1 = np.rot90(template, k=1)
# # 逆時針旋轉 90 度(k=-1)
# rotated_image2 = np.rot90(template, k=-1)
j=[0,1,-1]
# 模板匹配
for i in j:template1 = np.rot90(template,k=i)res = cv2.matchTemplate(img_gray, template1, cv2.TM_CCOEFF_NORMED)threshold = 0.9  # 匹配閾值loc = np.where(res >= threshold)  # 獲取符合閾值的坐標(行,列)# 繪制所有匹配區域的矩形框for pt in zip(*loc[::-1]):cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), color=(0, 0, 255), thickness=6)cv2.imshow('Template Matching Result', img_rgb)
cv2.waitKey(0)

這段代碼是一個帶旋轉角度的模板匹配程序,核心功能是在目標圖像中查找與模板圖像(包含 0°、90° 順時針、90° 逆時針三種旋轉狀態)匹配度較高的區域,并標記出這些區域。下面分步驟解析:

一、基礎準備:導入庫與讀取圖像

import cv2  # 導入OpenCV庫,用于圖像處理
import numpy as np  # 導入numpy庫,用于數組操作(如旋轉)# 讀取目標圖像(待檢測的大圖),默認讀取為BGR格式
img_rgb = cv2.imread('mobanpipei.jpg')
# 將目標圖像轉為灰度圖(模板匹配通常在單通道灰度圖上進行,減少計算量)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)# 讀取模板圖像(要查找的小圖),flags=0表示以灰度圖格式讀取
template = cv2.imread('jianto.jpg', flags=0)
# 獲取模板圖像的高和寬(h:高度,w:寬度),后續繪制匹配區域時需要
h, w = template.shape[:2]

核心目的:加載目標圖像和模板圖像,并將目標圖像轉為灰度圖(模板匹配對顏色不敏感,灰度圖可簡化計算)。

注意:模板圖像直接以灰度圖讀取(flags=0),避免后續重復轉換。

二、處理模板旋轉:考慮多方向匹配

# 定義旋轉角度參數:0(不旋轉)、1(順時針90°)、-1(逆時針90°)
j = [0, 1, -1]

為什么需要旋轉?實際場景中,模板可能在目標圖像中以不同角度存在(比如模板是 “箭頭”,可能朝上、朝左、朝右),通過旋轉模板可提高匹配覆蓋率。

np.rot90函數說明:k=0表示不旋轉;k=1表示順時針旋轉 90°;k=-1表示逆時針旋轉 90°。

三、核心邏輯:多角度模板匹配與結果標記

# 遍歷每個旋轉角度,分別進行模板匹配
for i in j:# 按當前角度旋轉模板(得到旋轉后的模板)template1 = np.rot90(template, k=i)# 模板匹配:在目標灰度圖中查找與旋轉后模板匹配的區域# 方法:cv2.TM_CCOEFF_NORMED(歸一化相關系數匹配,結果范圍[-1,1],越接近1匹配度越高)res = cv2.matchTemplate(img_gray, template1, cv2.TM_CCOEFF_NORMED)# 設置匹配閾值(只保留匹配度≥0.9的區域,閾值越高,匹配越嚴格)threshold = 0.9# 找到所有匹配值≥閾值的位置坐標(返回的loc是元組,格式:(行坐標列表, 列坐標列表))loc = np.where(res >= threshold)# 遍歷所有符合條件的坐標,繪制矩形框標記匹配區域# zip(*loc[::-1]):將坐標從(行,列)轉換為(列,行)(OpenCV中圖像坐標是(x,y)對應列和行)for pt in zip(*loc[::-1]):# 繪制矩形:左上角坐標pt=(x,y),右下角坐標=(x+w, y+h),紅色(BGR中(0,0,255)),線寬6cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), color=(0, 0, 255), thickness=6)

模板匹配原理:cv2.matchTemplate會在目標圖像上滑動模板,計算每個位置的匹配度,生成一個 “匹配結果圖”(res),其中每個像素值代表該位置的匹配程度。

坐標轉換細節:loc返回的是(行,列),而 OpenCV 繪制矩形需要(x,y)(對應列、行),因此用loc[::-1]反轉順序,再用zip(*)轉換為可迭代的坐標對。

閾值選擇:threshold=0.9是經驗值,可根據實際匹配效果調整(值太高可能漏檢,太低可能誤檢)。

四、顯示結果

# 顯示標記了匹配區域的目標圖像
cv2.imshow('Template Matching Result', img_rgb)
# 等待按鍵輸入(0表示無限等待),按任意鍵后關閉窗口
cv2.waitKey(0)

最終在窗口中顯示目標圖像,所有匹配度≥0.9 的區域會被紅色矩形框標記。

實現效果:

代碼特點與注意事項

  1. 多角度匹配:通過旋轉模板(0°、90° 順 / 逆時針),解決了模板在目標圖像中旋轉導致的匹配失效問題。
  2. 潛在優化點
    • 旋轉后模板的尺寸會變化(如 90° 旋轉后,原高度 h 變為寬度,原寬度 w 變為高度),但代碼中仍用原wh繪制矩形,可能導致矩形框尺寸不準確(需根據旋轉后的模板尺寸動態調整)。
    • 未處理模板縮放問題:如果目標圖像中模板的大小與原圖不同,可能匹配失敗(可結合圖像金字塔實現多尺度匹配)。
  3. 適用場景:適用于檢測目標在圖像中可能存在 90° 旋轉的場景(如特定圖標、符號等)。

總結:這段代碼通過 “旋轉模板 + 多角度匹配” 的思路,提高了模板匹配的魯棒性,能有效標記出目標圖像中與不同角度模板匹配的區域,是模板匹配技術在實際場景中的典型應用。

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

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

相關文章

OS28.【Linux】自制簡單的Shell的修bug記錄

目錄 1.問題代碼 2.排查 前期檢查 查找是誰修改了environ[0] 使用gdb下斷點 查看后續的影響 分析出問題的split_commandline函數 3.反思 4.正確代碼 5.結論 6.除此之外...... ★提示: 此bug非常隱蔽,不仔細分析很難查出問題,非常鍛煉調試能力! 1.問題代碼 #includ…

Debian 系統上安裝與配置 MediaMTX

🎯 在 Debian 系統上安裝與配置 MediaMTX(原 rtsp-simple-server):打造輕量級流媒體服務器 作者:遠在太平洋 環境:Debian 10/11/12 | Ubuntu 可參考 關鍵詞:MediaMTX、rtsp-simple-server、RTSP…

分布式專題——10.4 ShardingSphere-Proxy服務端分庫分表

1 為什么要有服務端分庫分表? ShardingSphere-Proxy 是 ShardingSphere 提供的服務端分庫分表工具,定位是“透明化的數據庫代理”。 它模擬 MySQL 或 PostgreSQL 的數據庫服務,應用程序(Application)只需像訪問單個數據…

Mysql相關的面試題1

什么是聚集索引(聚簇索引)?什么是二級索引(非聚簇索引)? 聚集索引就是葉子節點關聯行數據的索引,二級索引就是葉子節點關聯主鍵的索引,聚集索引必須有且僅有一個,二級索引…

電涌保護器:為現代生活筑起一道隱形防雷網

何為電涌保護器?電涌保護器(Surge Protective Device,簡稱SPD)主要用于控制信號系統,保護電氣電子設備信號線路免受雷電電磁脈沖、感應過電壓、操作過電壓的影響,廣泛應用于工控、消防、安防監控、交通、電…

【uniapp微信小程序】掃普通鏈接二維碼打開小程序

需求:用戶A保存自己的邀請碼海報,用戶B掃描該普通連接二維碼,打開微信小程序,并且攜帶用戶A的邀請碼信息,用戶B登錄時,跟用戶A關聯,成為用戶A的下級。 tips:保存海報到手機相冊可以參…

LeetCode 378 - 有序矩陣中第 K 小的元素

文章目錄摘要描述題解答案題解代碼分析代碼解析示例測試及結果輸出結果時間復雜度空間復雜度總結摘要 在開發中,我們經常遇到需要處理大規模有序數據的場景,比如數據庫分頁、排行榜查詢、或者處理排序過的矩陣。LeetCode 第 378 題“有序矩陣中第 K 小的…

【Lua】Windows 下編寫 C 擴展模塊:VS 編譯與 Lua 調用全流程

? 目錄 ?🛫 導讀需求環境1?? 核心原理:Windows下Lua與C的交互邏輯2?? Windows下編寫步驟:以mymath模塊為例2.1 步驟1:準備Windows開發環境方式1:官網下載Lua源碼并編譯(可控性高)方式2&am…

Python快速入門專業版(二十九):函數返回值:多返回值、None與函數嵌套調用

目錄引一、多返回值:一次返回多個結果的優雅方式1. 多返回值的本質:隱式封裝為元組示例1:返回多個值的函數及接收方式2. 多返回值的接收技巧技巧1:用下劃線_忽略不需要的返回值技巧2:用*接收剩余值(Python …

python使用pip安裝的包與卸載

1:基本卸載命令 # 卸載單個包 pip uninstall package_name# 示例:卸載requests包 pip uninstall requests2:卸載多個包 # 一次性卸載多個包 pip uninstall package1 package2 package3# 示例 pip uninstall requests numpy pandas3&#xff1…

超級流水線和標量流水線的原理

一、什么是流水線?要理解這兩個概念,首先要明白流水線(Pipelining) 的基本思想。想象一個汽車裝配工廠:* 沒有流水線:一個工人負責組裝一整輛汽車,裝完一輛再裝下一輛。效率很低。* 有了流水線&…

【Ansible】管理復雜的Play和Playbook知識點

1.什么是主機模式?答:主機模式是Ansible中用于從Inventory中篩選目標主機的規則,通過靈活的模式定義可精準定位需要執行任務的主機。2.主機模式的作用答:篩選目標:從主機清單中選擇一個或多個主機/組,作為P…

FastGPT源碼解析 Agent 智能體應用創建流程和代碼分析

FastGPT對話智能體創建流程和代碼分析 平臺作為agent平臺,平臺所有功能都是圍繞Agent創建和使用為核心的。平臺整合各種基礎能力,如大模型、知識庫、工作流、插件等模塊,通過可視化,在界面上創建智能體,使用全部基礎能…

缺失數據處理全指南:方法、案例與最佳實踐

如何處理缺失數據:方法、案例與最佳實踐 1. 引言 在數據分析和機器學習中,缺失數據是一個普遍存在的問題。如何處理缺失值,往往直接影響到后續分析和建模的效果。處理不當,不僅會浪費數據,還可能導致模型預測結果的不準…

為什么Cesium不使用vue或者react,而是 保留 Knockout

1. Knockout-ES5 插件的語法簡化優勢 自動深度監聽:Cesium 通過集成 Knockout-ES5 插件,允許開發者直接使用普通變量語法(如 viewModel.property newValue)替代繁瑣的 observable() 包裝,無需手動聲明每個可觀察屬性。…

Word怎么設置頁碼總頁數不包含封面和目錄頁

有時候使用頁碼格式是[第x頁/共x頁]或[x/x]時會遇到word總頁數和實際想要的頁數不一致,導致顯示不統一,這里介紹一個簡單的辦法,適用于比較簡單的情況。 一、wps版本 文章分節 首先將目錄頁與正文頁進行分節:在目錄頁后面選擇插入…

突破機器人通訊架構瓶頸,CAN/FD、高速485、EtherCAT,哪種總線才是最優解?

引言: 從協作機械臂到人形機器人,一文拆解主流總線技術選型困局 在機器人技術飛速發展的今天,從工廠流水線上的協作機械臂到科技展會上的人形機器人,它們的“神經系統”——通訊總線,正面臨著前所未有的挑戰。特斯拉O…

Java核心概念詳解:JVM、JRE、JDK、Java SE、Java EE (Jakarta EE)

1. Java是什么? Java首先是一種編程語言。它擁有特定的語法、關鍵字和結構,開發者可以用它來編寫指令,讓計算機執行任務。核心特點: Java最著名的特點是“一次編寫,到處運行”(Write Once, Run Anywhere - …

OSPF高級技術 相關知識點

1.多區域OSPFospf 設計多區域原因:① 每個區域的路由器只需同步自己所在區域的鏈路狀態數據庫,分區域設 計可以使得每個區域的鏈路狀態數據庫得以減少。以降低路由器cpu、內存 的消耗。② 避免某區域內的網絡故障(例如:接口頻繁up…

Linux / Windows 下連續發送多幀 8 字節指令,下位機只響應第一幀,第二幀“丟失”。

串口編程易錯點筆記 基于 serial::Serial(wjwwood serial 庫) 場景:Linux / Windows 下連續發送多幀 8 字節指令,下位機只響應第一幀,第二幀“丟失”。1. 現象 serial::Serial ser("/dev/ttyUSB0", 115200);…