Python+OpenCV系列:模版匹配

文章目錄

        • 1. 模板匹配基本原理
        • 2. `cv2.matchTemplate()` 函數
          • 函數原型:
        • 3. 模板匹配步驟
        • 4. 單目標模板匹配示例
        • 5. 多目標模板匹配
          • 多目標模板匹配示例
          • 代碼解析:
        • 6. 多模板匹配
          • 多模板匹配示例
          • 代碼解析
        • 7. 總結

模板匹配是一種在圖像中尋找模板的位置的方法。在計算機視覺中,模板匹配廣泛應用于目標識別、物體跟蹤、缺陷檢測等領域。OpenCV 提供了強大的模板匹配功能,可以非常方便地在目標圖像中找到與模板圖像相似的區域。本文將詳細講解如何使用 Python 和 OpenCV 進行單目標和多目標模板匹配,包含多模板匹配的技巧。


1. 模板匹配基本原理

模板匹配的基本思想是將模板圖像滑動到目標圖像的不同位置,計算每個位置的匹配度,選擇匹配度最高的位置。匹配度通常是通過計算模板圖像與目標區域的相似度來評估的。常見的匹配方法包括:

  • 平方差(SSD)
  • 相關性(CCOEFF)
  • 歸一化互相關(CCOEFF_NORMED)
  • 平方差歸一化(SQDIFF_NORMED)

這些方法通過不同的計算方式,適應不同的圖像匹配需求。


2. cv2.matchTemplate() 函數

OpenCV 提供的 cv2.matchTemplate() 函數用于執行模板匹配。它接收目標圖像和模板圖像作為輸入,并返回一個結果圖像,該圖像的每個像素值表示模板在該位置的匹配度。

函數原型:
result = cv2.matchTemplate(image, template, method)
  • image:目標圖像(通常是灰度圖像)。
  • template:模板圖像(通常是灰度圖像)。
  • method:匹配方法,常見方法有:
    • cv2.TM_CCOEFF
    • cv2.TM_CCOEFF_NORMED
    • cv2.TM_SQDIFF
    • cv2.TM_SQDIFF_NORMED
3. 模板匹配步驟
  1. 讀取圖像和模板:讀取目標圖像和模板圖像。
  2. 轉換為灰度圖像:模板匹配通常在灰度圖像上進行。
  3. 使用模板匹配:調用 cv2.matchTemplate() 執行匹配操作。
  4. 獲取匹配結果:使用 cv2.minMaxLoc() 獲取匹配結果的位置和相似度。
  5. 繪制矩形框:標記模板在目標圖像中的匹配區域。

4. 單目標模板匹配示例
import cv2
import numpy as np# 讀取圖像和模板
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
template = cv2.imread('template.jpg', cv2.IMREAD_GRAYSCALE)# 執行模板匹配
result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)# 獲取匹配結果的最小值、最大值和位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)# 繪制矩形框標記最佳匹配位置
top_left = max_loc
h, w = template.shape
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img, top_left, bottom_right, (0, 255, 0), 2)# 顯示匹配結果
cv2.imshow('Matched Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 多目標模板匹配

在實際應用中,常常需要在圖像中尋找多個模板或多個目標。這時可以通過遍歷匹配結果來定位多個匹配位置。

多目標匹配的實現步驟

  1. 使用 cv2.matchTemplate() 對目標圖像和模板進行匹配。
  2. 使用 cv2.threshold() 設定一個閾值,從結果圖像中篩選出匹配度較高的區域。
  3. 通過遍歷匹配結果,提取出多個匹配區域的位置。
多目標模板匹配示例
import cv2
import numpy as np# 讀取圖像和模板
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
template = cv2.imread('template.jpg', cv2.IMREAD_GRAYSCALE)# 執行模板匹配
result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)# 設置匹配的閾值
threshold = 0.8
locations = np.where(result >= threshold)# 遍歷所有匹配的位置,繪制矩形框
w, h = template.shape[::-1]
for pt in zip(*locations[::-1]):cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)# 顯示匹配結果
cv2.imshow('Multiple Matched Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
代碼解析:
  • np.where(result >= threshold):找到所有匹配度大于等于設定閾值的匹配位置。
  • zip(*locations[::-1]):將結果數組的位置反轉,以便于繪制矩形框。
  • cv2.rectangle():在每個匹配位置繪制矩形框。

6. 多模板匹配

當我們有多個模板需要在圖像中進行匹配時,可以通過循環處理每個模板進行匹配。每次循環都使用 cv2.matchTemplate() 對圖像進行模板匹配,找出所有匹配的區域。

多模板匹配示例
import cv2
import numpy as np# 讀取圖像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 模板列表
templates = ['template1.jpg', 'template2.jpg', 'template3.jpg']# 循環處理每個模板
for template_path in templates:# 讀取當前模板template = cv2.imread(template_path, cv2.IMREAD_GRAYSCALE)# 執行模板匹配result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)# 設置匹配的閾值threshold = 0.8locations = np.where(result >= threshold)# 遍歷所有匹配的位置,繪制矩形框w, h = template.shape[::-1]for pt in zip(*locations[::-1]):cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)# 顯示匹配結果
cv2.imshow('Multiple Templates Matched', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
代碼解析
  • templates:多個模板文件的路徑列表。
  • 每次循環讀取不同的模板并進行模板匹配。
  • 對每個模板的匹配結果,使用 np.where() 提取所有匹配位置。

7. 總結

模板匹配是圖像處理中非常基礎且有效的技術,常用于目標檢測、物體跟蹤等任務。使用 OpenCV 中的 cv2.matchTemplate() 函數,我們能夠在圖像中找到與模板圖像相似的區域。通過設置合適的匹配閾值和選擇適當的匹配方法,我們可以實現多目標模板匹配和多模板匹配。在復雜場景中,模板匹配可能會受到圖像旋轉、尺度變化等因素的影響,因此在實際應用中,通常需要結合其他技術進行改進。

  • 單目標模板匹配:尋找圖像中最匹配的一個模板位置。
  • 多目標模板匹配:在圖像中找到多個匹配的區域。
  • 多模板匹配:針對多個模板同時進行匹配。

模板匹配是圖像處理中重要的一環,在一些簡單、規則的場景下非常有效,但對于復雜背景和變化大的情況,可能需要結合其他計算機視覺技術來提高匹配精度。

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

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

相關文章

基于IEEE 802.1Qci的時間敏感網絡(TSN)主干架構安全分析及異常檢測系統設計

中文標題:基于IEEE 802.1Qci的時間敏感網絡(TSN)主干架構安全分析及異常檢測系統設計 英文標題:Security Analysis of the TSN Backbone Architecture and Anomaly Detection System Design Based on IEEE 802.1Qci 作者信息&…

怎樣提升企業網絡的性能?

企業網絡的穩定性和高效性直接影響員工的工作效率。以下從多維度分析了一些有效策略,幫助公司提升網絡性能,營造更高效的辦公環境。 1. 升級網絡設備 采用性能更高的網絡硬件是優化網絡體驗的重要基礎。選擇支持高吞吐量、低延遲的設備(如企業…

scala基礎_數據類型概覽

Scala 數據類型 下表列出了 Scala 支持的數據類型: 類型類別數據類型描述Scala標準庫中的實際類基本類型Byte8位有符號整數,數值范圍為 -128 到 127scala.Byte基本類型Short16位有符號整數,數值范圍為 -32768 到 32767scala.Short基本類型I…

力扣239.滑動窗口最大值

文章目錄 一、前言二、單調隊列 一、前言 力扣239.滑動窗口最大值 滑動窗口最大值,這道題給定一個數組,以及一個窗口的長度,這個窗口會往后滑動,直到數組最后一個元素。 要求每個滑動窗口的中的最大值。對于這道題,我…

mac 安裝CosyVoice (cpu版本)

CosyVoice 介紹 CosyVoice 是阿里研發的一個tts大模型 官方項目地址:https://github.com/FunAudioLLM/CosyVoice.git 下載項目(非官方) git clone --recursive https://github.com/v3ucn/CosyVoice_for_MacOs.git 進入項目 cd CosyVoic…

電腦插件修復工具

DirectX修復工具 鏈接:夸克網盤分享

Maven 安裝配置(詳細教程)

文章目錄 一、Maven 簡介二、下載 Maven三、配置 Maven3.1 配置環境變量3.2 Maven 配置3.3 IDEA 配置 四、結語 一、Maven 簡介 Maven 是一個基于項目對象模型(POM)的項目管理和自動化構建工具。它主要服務于 Java 平臺,但也支持其他編程語言…

Scala中的泛型特質

代碼如下: package test41 //泛型特質 object test3 { //定義一個日志//泛型特質,X是泛型名稱,可以更改。trait Logger[X] {val content: Xdef show():Unit }class FileLogger extends Logger[String] {override val content: String "…

前端三大框架 Vue、React 和 Angular 的市場占比分析

一、引言 ?? 隨著前端技術的迅速發展,Vue.js、React 和 Angular 已成為全球最受歡迎的三大前端框架。在國內外,不同的框架在市場中的占比和流行程度存在顯著差異。本文將從全球和中國市場的角度,對這三大框架的市場占比進行分析&#xff0…

vue3+echarts+websocket分時圖與K線圖實時推送

一、父組件代碼&#xff1a; <template> <div class"chart-box" v-loading"loading"> <!-- tab導航欄 --> <div class"tab-box"> <div class"tab-list"> <div v-for"(item, index) in tabList…

用python的flask寫的一個MQTT中轉功能,http的方式發送數據和接收數據

需求背景 給一個客戶對接人臉識別的設備&#xff0c;最后需要通知服務端進行一些消息推送。 簡單例子 # 作者 陳老師 # https://v.iiar.cn import json import paho.mqtt.client as mqtt import requests from flask import Flask, requestapp Flask(__name__)# MQTT配置 mq…

ASP.NET |日常開發中讀寫XML詳解

ASP.NET &#xff5c;日常開發中讀寫XML詳解 前言一、XML 概述1.1 定義和結構1.2 應用場景 二、讀取 XML 文件2.1 使用XmlDocument類&#xff08;DOM 方式&#xff09;2.2 使用XmlReader類&#xff08;流方式&#xff09; 三、寫入 XML 文件3.1 使用XmlDocument類3.2 使用XmlWr…

分布式 Paxos算法 總結

前言 相關系列 《分布式 & 目錄》《分布式 & Paxos算法 & 總結》《分布式 & Paxos算法 & 問題》 參考文獻 《圖解超難理解的 Paxos 算法&#xff08;含偽代碼&#xff09;》《【超詳細】分布式一致性協議 - Paxos》 Basic-Paxos 基礎帕克索斯算法…

Git-基礎操作命令

目錄 Git基礎操作命令 case *查看提交日志 log 版本回退 get add . Git基礎操作命令 我們創建并且初始化這個倉庫以后&#xff0c;我們就要在里面進行操作。 Git 對于文件的增刪改查存在幾個狀態&#xff0c;這些修改狀態會隨著我們執行Git的命令而發生變化。 untracked、…

Spring Boot 實戰:構建一個社交平臺 API

在這篇博客中&#xff0c;我們將繼續深入 Spring Boot 的開發實踐&#xff0c;通過構建一個簡單的社交平臺 API&#xff0c;幫助大家理解如何使用 Spring Boot 高效地開發一個具有注冊、登錄、個人資料管理、帖子發布與評論、點贊等功能的社交平臺。在開發過程中&#xff0c;我…

配置mysqld(讀取選項內容,基本配置),數據目錄(配置的必要性,目錄下的內容,具體文件介紹,修改配置)

目錄 配置mysqld 讀取選項內容 介紹 啟動腳本 基本配置 內容 端口號 數據目錄的路徑 配置的必要性 配置路徑 mysql數據目錄 具體文件 修改配置時 權限問題 配置mysqld 讀取選項內容 介紹 會從[mysqld] / [server] 節點中讀取選項內容 優先讀取[server] 雖然服務…

智能家居WTR096-16S錄放音芯片方案,實現語音播報提示及錄音留言功能

前言&#xff1a; 在當今社會的高速運轉之下&#xff0c;夜幕低垂之時&#xff0c;許多辛勤工作的父母尚未歸家。對于肩負家庭責任的他們而言&#xff0c;確保孩童按時用餐與居家安全成為心頭大事。此時&#xff0c;家居留言錄音提示功能應運而生&#xff0c;恰似家中的一位無形…

Java 編程基礎:開啟編程世界的大門

一、Java 環境搭建 在開始編寫 Java 代碼之前&#xff0c;我們需要先搭建 Java 開發環境。 1. 安裝 JDK&#xff08;Java Development Kit&#xff09; JDK 是 Java 開發的核心工具包&#xff0c;它包含了編譯 Java 源文件所需的編譯器&#xff08;javac&#xff09;以及運行…

pytorch bilstm crf的教程,注意 這里不支持批處理,要支持批處理 用torchcrf這個。

### Bi-LSTM Conditional Random Field ### pytorch tutorials https://pytorch.org/tutorials/beginner/nlp/advanced_tutorial.html ### 模型主要結構&#xff1a; ![title](sources/bilstm.png) pytorch bilstm crf的教程&#xff0c;注意 這里不支持批處理 Python version…

【SickOs1.1靶場滲透】

文章目錄 一、基礎信息 二、信息收集 三、反彈shell 四、提權 一、基礎信息 Kali IP&#xff1a;192.168.20.146 靶機IP&#xff1a;192.168.20.150 二、信息收集 端口掃描 nmap -sS -sV -p- -A 192.168.20.150 開放了22、3128端口&#xff0c;8080端口顯示關閉 22端…