OpenCV 模板與多個對象匹配方法詳解(繼OpenCV 模板匹配方法詳解)

文章目錄

  • 前言
  • 1.導入庫
  • 2.圖片預處理
  • 3.輸出模板圖片的寬和高
  • 4.模板匹配
  • 5.獲取匹配結果中所有符合閾值的點的坐標
    • 5.1 threshold = 0.9:
    • 5.2 loc = np.where(res >= threshold):
  • 6.遍歷所有匹配點
    • 6.1 loc 的結構回顧
    • 6.2 loc[::-1] 的作用
      • 6.2.1 為什么需要反轉?
    • 6.3 zip(*loc[::-1]) 的作用
  • 7.畫出模板匹配矩形框
    • 7.1 功能
    • 7.2 參數詳解
    • 7.3 關鍵細節
    • 7.4 常見問題
  • 8.運行結果
  • 9. 總結

前言

上文《OpenCV 模板匹配方法詳解》我們詳細介紹了模板匹配這一方法,本文我們來介紹一下模板與多個對象匹配的方法。

其中有很多的函數需要我們來詳細介紹,接下來我們直接看代碼講解:

1.導入庫

import cv2
import numpy as np
  • 導入opencv庫和numpy庫

2.圖片預處理

img_rgb = cv2.imread("image.jpg")
img_gray = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY)
template = cv2.imread("tem.jpg",0)
  • 導入圖片,并轉化為灰度圖
  • 導入的圖片如下圖所示,左圖為匹配圖片,右圖為模板圖片

在這里插入圖片描述


3.輸出模板圖片的寬和高

h,w = template.shape[:2]
  • template.shape:假設 template 是一個 NumPy 數組(通常是圖像數據),.shape 屬性會返回數組的維度信息。
  • 對于圖像:通常返回 (高度, 寬度, 通道數),如果是灰度圖則只有 (高度, 寬度)
  • [:2]:切片操作,取前兩個元素
  • 例如對于彩色圖像 (480, 640, 3),取前兩個值得到 (480, 640)
  • h, w = …:元組解包
  • 將前兩個值分別賦值給變量 h (height/高度) 和 w (width/寬度)

所以這行代碼的作用是:獲取模板圖像的高度和寬度,分別存入變量 h 和 w 中。


4.模板匹配

# 使用模板匹配方法 cv2.matchTemplate 進行模板匹配
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)

功能:

  • 模板匹配:在 img_gray(灰度圖像)中滑動 template(模板圖像),計算每個位置的 相似度,并返回一個 相似度矩陣 res。
  • 匹配方法:cv2.TM_CCOEFF_NORMED 是 歸一化相關系數匹配,取值范圍 [-1, 1],越接近 1 表示匹配度越高。

返回值 res:

  • res 是一個 二維浮點型數組,大小 = (img_h - template_h + 1, img_w - template_w +1)(因為模板不能超出原圖邊界)
  • 每個 res[y, x] 表示模板在 (x, y) 處的匹配得分。

5.獲取匹配結果中所有符合閾值的點的坐標

# 設定匹配閾值
threshold = 0.9
# 獲取匹配結果中所有符合閾值的點的坐標
loc = np.where(res >= threshold) #(符合條件的行,符合條件的列)

5.1 threshold = 0.9:

功能:

  • 設定一個 匹配閾值,只有 res 中 ≥ 0.9 的點才被認為是有效匹配。

調整建議:

  • 閾值越高(如 0.95),匹配越嚴格,漏檢率可能增加。
  • 閾值越低(如 0.8),匹配越寬松,但可能誤檢。

5.2 loc = np.where(res >= threshold):

功能:

  • 查找所有匹配度 ≥ threshold 的坐標,返回它們的 行列索引。
  • loc 是一個 元組,包含兩個數組:
  •  loc[0]:所有匹配點的 Y 坐標(行索引)
    
  •  loc[1]:所有匹配點的 X 坐標(列索引
    

示例
假設 res 如下:

res = [[0.1, 0.3, 0.7],[0.8, 0.95, 0.6],  # (1,1) = 0.95 ≥ 0.9[0.4, 0.9, 0.2]    # (2,1) = 0.9 ≥ 0.9
]

執行 loc = np.where(res >= 0.9) 后:

loc = (array([1, 2]), array([1, 1]))  # 匹配點:(Y=1,X=1), (Y=2,X=1)

注意:loc 是一個元組,格式為 (y_coords, x_coords),所以先返回的是Y值,再返回的是X值!!!


6.遍歷所有匹配點

for pt in zip(*loc[::-1]):

這段代碼 for pt in zip(*loc[::-1]): 是 模板匹配后處理 的關鍵部分,用于遍歷所有匹配到的目標位置,并調整坐標順序以適應 OpenCV 的繪圖要求。下面詳細解析它的作用:

6.1 loc 的結構回顧

在之前的代碼中:

loc = np.where(res >= threshold)
  • loc 是一個元組,格式為 (y_coords, x_coords),所以先返回的是Y值,再返回的是X值

6.2 loc[::-1] 的作用

loc[::-1] 的作用loc[::-1] 對元組進行 反向切片,將 (y_coords, x_coords) 變成 (x_coords, y_coords)。
例如:

loc = (array([1, 2]), array([3, 4]))
loc[::-1] = (array([3, 4]), array([1, 2]))  
# 現在順序是 (x, y)

6.2.1 為什么需要反轉?

  • OpenCV 的坐標系統使用 (x, y)(列在前,行在后),而 np.where() 返回的是 (y, x),因此需要交換順序。

6.3 zip(*loc[::-1]) 的作用

  • *loc[::-1] 解包 元組,相當于
zip(array([3, 4]), array([1, 2]))
  • zip() 將兩個數組按元素配對,生成可迭代的 (x, y) 坐標對
for pt in zip(*loc[::-1]):print(pt)  # 輸出:(3, 1), (4, 2)

最終效果:
遍歷所有匹配點,每次循環的 pt 是一個 (x, y) 坐標元組,可以直接用于 OpenCV 繪圖函數(如 cv2.rectangle())。


7.畫出模板匹配矩形框

cv2.rectangle(img_rgb,pt,(pt[0] + w,pt[1] + h),(0,0,255),1)

這段代碼 cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 1) 是 OpenCV 中用于在圖像上繪制矩形的函數,具體含義如下:


7.1 功能

在圖像 img_rgb 上,以 pt 為左上角起點,繪制一個 寬度為 w、高度為 h 的紅色矩形框,邊框粗細為 1 像素


7.2 參數詳解

參數含義示例
img_rgb要繪制矩形的目標圖像(RGB 格式)從 cv2.imread()讀取的圖像
pt矩形的 左上角坐標 (x, y)(50, 100) 表示從圖像的第 50 列、第 100 行開始
(pt[0] + w, pt[1] + h)矩形的 右下角坐標如果 pt=(50,100),w=30,h=20,則右下角是 (80, 120)
(0, 0, 255)矩形顏色(BGR 格式)(0,0,255)表示純紅色
1矩形邊框的粗細(像素)1 表示 1 像素寬,-1表示填充矩形

7.3 關鍵細節

  1. 坐標順序

    • OpenCV 使用 (x, y) 坐標,其中:
      • x 是水平方向(列索引,從左到右遞增)
      • y 是垂直方向(行索引,從上到下遞增)
  2. 顏色格式

    • (0, 0, 255)BGR 格式(不是 RGB),所以這里表示紅色。
    • 常見顏色示例:
      • 紅色:(0, 0, 255)
      • 綠色:(0, 255, 0)
      • 藍色:(255, 0, 0)
  3. 矩形尺寸

    • w 和 h通常是模板圖像的寬度和高度(通過 template.shape[:2] 獲取)。
    • 如果 w 或 h 超出圖像邊界,OpenCV 會報錯。

7.4 常見問題

  1. 為什么矩形顏色不對?

    • 檢查顏色是否是 BGR 格式,例如紅色應為 (0, 0, 255),而非 RGB 的 (255, 0, 0)。
  2. 如何調整矩形樣式?

    • 修改參數:
      • 邊框粗細:2 表示更粗的邊框,-1 表示填充矩形。
      • 顏色:(255, 0, 0) 是藍色,(0, 255, 0) 是綠色。

8.運行結果

在這里插入圖片描述

9. 總結

到這里本篇博客就結束啦,感謝大家的閱讀!最近一直在堅持每天寫博客,當作是一個敘說心得的地方,在這個過程中自己通過不斷的回顧之前所學習的內容,發現很多細節地方之前都沒有注意到,通過再一次的回顧,增添了很多收獲,這真的就是“溫故而知新”這句話現實化了。最后,希望大家能一直朝著自己理想的方向努力。越努力,越幸運!!!

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

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

相關文章

產品經理學習過程

一:掃盲篇(初始產品經理) 階段1:了解產品經理 了解產品經理是做什么的、產品經理的分類、產品經理在實際工作中都會接觸什么樣的崗位、以及產品經理在實際工作中具體要做什么事情。 二:準備篇 階段2:工…

【消息隊列RocketMQ】一、RocketMQ入門核心概念與架構解析

在當今互聯網技術飛速發展的時代,分布式系統的架構設計愈發復雜。消息隊列作為分布式系統中重要的組件,在解耦應用、異步處理、削峰填谷等方面發揮著關鍵作用。RocketMQ 作為一款高性能、高可靠的分布式消息中間件,被廣泛應用于各類互聯網場景…

從“鏈主”到“全鏈”:供應鏈數字化轉型的底層邏輯

1. 制造業與供應鏈數字化轉型的必然性 1.1. 核心概念與戰略重要性 制造業的數字化轉型,是利用新一代數字技術(如工業互聯網、人工智能、大數據、云計算、邊緣計算等)對制造業的整體價值鏈進行根本性重塑的過程。這不僅涉及技術的應用&#…

x-ui重新申請ssl證書失敗

由于某些需要我們重新申請ssl證書,x-ui自動化腳本不能強制更新,根據x-ui倉庫源碼: https://github.com/vaxilu/x-ui/blob/main/x-ui.sh 在申請ssl證書的地方稍作修改,得到,運行下面的腳本就可以重新申請ssl證書&#…

Java NIO Java 虛擬線程(微線程)與 Go 協程的運行原理不同 為何Go 能在低配機器上承接10萬 Websocket 協議連接

什么是Java NIO? Java NIO(New Input/Output) 是Java 1.4(2002年)引入的一種非阻塞、面向緩沖區的輸入輸出框架,旨在提升Java在高性能和高并發場景下的I/O處理能力。它相比傳統的 Java IO(java…

go環境安裝mac

下載go安裝包:https://golang.google.cn/dl/ 找到對應自己環境的版本下載。 注意有二進制的包,也有圖形界面安裝的包。圖形界面直接傻瓜式點就行了。 二進制的按照下面操作: 1、下載二進制包。 2、將下載的二進制包解壓至 /usr/local目錄…

LVGL源碼(9):學會控件的使用(自定義彈窗)

LVGL版本:8.3 LVGL的控件各式各樣,每種控件都有自己的一些特性,當我們想要使用一個LVGL控件時,我們首先可以通過官網去了解控件的一些基本特性,官網鏈接如下: LVGL Basics — LVGL documentation&#xf…

《軟件設計師》復習筆記(1)——考試介紹【新】

目錄 一、考試介紹 證書價值 考試要求 二、【新】計算機與軟件工程知識 三、軟件設計 一、考試介紹 >考試科目>考題形式>考試時長>合格標準計算機與軟件工程知識75道單選題(每題1分,總分75分)2023年11月改革機試后&#…

MCU中的BSS和data都占用SRAM空間嗎?

在MCU中,BSS段和data段都占用SRAM空間,但它們的存儲方式和用途有所不同。? BSS段 BSS段(Block Started by Symbol)用于存儲未初始化的全局變量和靜態變量。這些變量在程序啟動時會被清零,因此它們不占用Flash空間&a…

Ubuntu 22.04 更換 Nvidia 顯卡后啟動無法進入桌面問題的解決

原顯卡為 R7 240, 更換為 3060Ti 后, 開機進桌面時卡在了黑屏界面, 鍵盤有反應, 但是無法進入 shell. 解決方案為 https://askubuntu.com/questions/1538108/cant-install-rtx-4060-ti-on-ubuntu-22-04-lts 啟動后在開機菜單中(如果沒有開機菜單, 需要按shift鍵), 進入recove…

Python爬蟲-爬取貓眼演出數據

前言 本文是該專欄的第53篇,后面會持續分享python爬蟲干貨知識,記得關注。 貓眼平臺除了有影院信息之外,它還涵蓋了演出信息,比如說“演唱會,音樂節,話劇音樂劇,脫口秀,音樂會,戲曲藝術,相聲”等等各種演出相關信息。 而本文,筆者將以貓眼平臺為例,基于Python爬蟲…

人工智能-機器學習(線性回歸,邏輯回歸,聚類)

人工智能概述 人工智能分為:符號學習,機器學習。 機器學習是實現人工智能的一種方法,深度學習是實現機器學習的一種技術。 機器學習:使用算法來解析數據,從中學習,然后對真實世界中是事務進行決策和預測。如垃圾郵件檢…

FPGA學習(五)——DDS信號發生器設計

FPGA學習(五)——DDS信號發生器設計 目錄 FPGA學習(五)——DDS信號發生器設計一、FPGA開發中常用IP核——ROM/RAM/FIFO1、ROM簡介2、ROM文件的設置(1)直接編輯法(2)用C語言等軟件生成初始化文件 3、ROM IP核配置調用 二、DDS信號發…

【Vue】從 MVC 到 MVVM:前端架構演變與 Vue 的實踐之路

個人博客:haichenyi.com。感謝關注 一. 目錄 一–目錄二–架構模式的演變背景?三–MVC:經典的分層起點?四–MVP:面向接口的解耦嘗試?五–MVVM:數據驅動的終極形態??六–Vue:MVVM 的現代化實踐??? 二. 架構模…

【算法】快速排序、歸并排序(非遞歸版)

目錄 一、快速排序&#xff08;非遞歸&#xff09; 1.原理 2.實現 2.1 stack 2.2 partition(array,left,right) 2.3 pivot - 1 > left 二、歸并排序&#xff08;非遞歸&#xff09; 1.原理 2.實現 2.1 gap 2.1.1 i 2*gap 2.1.2 gap * 2 2.1.3 gap < array.…

CasualLanguage Model和Seq2Seq模型的區別

**問題1&#xff1a;**Causal Language Modeling 和 Conditional Generation 、Sequence Classification 的區別是什么&#xff1f; 因果語言模型(Causal Language Model)&#xff1a; 預測給定文本序列中的下一個字符&#xff0c;一般用于文本生成、補全句子等&#xff0c;模型…

【計算機視覺】三維視覺項目 - Colmap二維圖像重建三維場景

COLMAP 3D重建 項目概述項目功能項目運行方式1. 環境準備2. 編譯 COLMAP3. 數據準備4. 運行 COLMAP 常見問題及解決方法1. **編譯問題**2. **運行問題**3. **數據問題** 項目實戰建議項目參考文獻 項目概述 COLMAP 是一個開源的三維重建軟件&#xff0c;專注于 Structure-from…

狀態管理最佳實踐:Bloc架構實踐

狀態管理最佳實踐&#xff1a;Bloc架構實踐 引言 Bloc (Business Logic Component) 是Flutter中一種強大的狀態管理解決方案&#xff0c;它基于響應式編程思想&#xff0c;通過分離業務邏輯和UI表現層來實現清晰的代碼架構。本文將深入探討Bloc的核心概念、實現原理和最佳實踐…

Python多任務編程:進程全面詳解與實戰指南

1. 進程基礎概念 1.1 什么是進程&#xff1f; 進程(Process)是指正在執行的程序&#xff0c;是程序執行過程中的一次指令、數據集等的集合。簡單來說&#xff0c;進程就是程序的一次執行過程&#xff0c;它是一個動態的概念。 想象你打開電腦上的音樂播放器聽歌&#xff0c;…

Linux 網絡基礎(二) (傳輸協議層:UDP、TCP)

目錄 一、傳輸層的意義 二、端口號 1、五元組標識一個通信 2、端口號范圍劃分 3、知名端口號&#xff08;Well-Know Port Number&#xff09; &#xff08;1&#xff09;查看端口號 4、綁定端口號數目問題 5、pidof & netstat 命令 &#xff08;1&#xff09;ne…