opencv 模板匹配方法匯總

在OpenCV中,模板匹配是一種在較大圖像中查找特定模板圖像位置的技術。OpenCV提供了多種模板匹配方法,通過cv2.matchTemplate函數實現,該函數支持的匹配方式主要有以下6種,下面詳細介紹每種方法的原理、特點和適用場景。

1. cv2.TM_SQDIFF(平方差匹配法)

  • 原理:計算模板與圖像中每個可能位置的像素值平方差的總和。匹配結果值越小,表示匹配程度越高。
  • 特點:對光照變化比較敏感,因為它直接比較像素值的差異。
  • 公式 R ( x , y ) = ∑ x ′ , y ′ ( T ( x ′ , y ′ ) ? I ( x + x ′ , y + y ′ ) ) 2 R(x,y)=\sum _{x',y'} (T(x',y') - I(x + x',y + y'))^2 R(x,y)=x,y?(T(x,y)?I(x+x,y+y))2,其中 T T T 是模板圖像, I I I 是輸入圖像, R R R 是匹配結果圖像。
  • 適用場景:適用于模板和目標圖像的光照條件較為一致的情況。

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

  • 原理:是cv2.TM_SQDIFF的歸一化版本,將平方差結果歸一化到 [0, 1] 范圍內。匹配結果值越接近 0,表示匹配程度越高。
  • 特點:對光照變化有一定的魯棒性,因為歸一化操作減少了不同圖像之間像素值范圍差異的影響。
  • 適用場景:當模板和目標圖像的光照有一定差異,但差異不是特別大時適用。

3. cv2.TM_CCORR(相關性匹配法)

  • 原理:計算模板與圖像中每個可能位置的像素值相關性。匹配結果值越大,表示匹配程度越高。
  • 特點:對光照變化也比較敏感,因為它直接依賴于像素值的相關性。
  • 公式 R ( x , y ) = ∑ x ′ , y ′ ( T ( x ′ , y ′ ) ? I ( x + x ′ , y + y ′ ) ) R(x,y)=\sum _{x',y'} (T(x',y') \cdot I(x + x',y + y')) R(x,y)=x,y?(T(x,y)?I(x+x,y+y))
  • 適用場景:適用于模板和目標圖像的光照條件較為一致,且模板和目標之間的亮度模式相似的情況。

4. cv2.TM_CCORR_NORMED(歸一化相關性匹配法)

  • 原理:是cv2.TM_CCORR的歸一化版本,將相關性結果歸一化到 [0, 1] 范圍內。匹配結果值越接近 1,表示匹配程度越高。
  • 特點:對光照變化有較好的魯棒性,因為歸一化操作消除了不同圖像之間像素值范圍差異的影響。
  • 適用場景:在光照條件不穩定的情況下,是一種比較常用的匹配方法。

5. cv2.TM_CCOEFF(相關系數匹配法)

  • 原理:計算模板與圖像中每個可能位置的像素值相關系數。匹配結果值越大,表示匹配程度越高。相關系數衡量的是兩個信號之間的線性相關性。
  • 特點:對光照變化有一定的魯棒性,因為它考慮了模板和圖像的均值。
  • 適用場景:適用于模板和目標圖像的光照有一定差異,但整體結構相似的情況。

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

  • 原理:是cv2.TM_CCOEFF的歸一化版本,將相關系數結果歸一化到 [-1, 1] 范圍內。匹配結果值越接近 1,表示匹配程度越高。
  • 特點:對光照變化具有較強的魯棒性,是一種比較穩定的匹配方法。
  • 適用場景:在各種光照條件下都能有較好的表現,是最常用的模板匹配方法之一。

代碼示例

import cv2
import numpy as np# 讀取圖像和模板
img = cv2.imread('image.jpg', 0)
template = cv2.imread('template.jpg', 0)
h, w = template.shape[:2]# 定義匹配方法
methods = ['cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED', 'cv2.TM_CCORR','cv2.TM_CCORR_NORMED', 'cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED']for meth in methods:img2 = img.copy()method = eval(meth)# 執行模板匹配res = cv2.matchTemplate(img2, template, method)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)# 根據不同的匹配方法確定最佳匹配位置if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:top_left = min_locelse:top_left = max_locbottom_right = (top_left[0] + w, top_left[1] + h)# 在圖像上繪制矩形框標記匹配位置cv2.rectangle(img2, top_left, bottom_right, 255, 2)# 顯示結果cv2.imshow(meth, img2)cv2.waitKey(0)
cv2.destroyAllWindows()

這個示例代碼展示了如何使用不同的模板匹配方法在圖像中查找模板的位置,并在圖像上繪制矩形框標記匹配結果。你可以根據實際需求選擇合適的匹配方法。

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;// 定義模板匹配方法名稱和對應的枚舉值
const char* method_names[] = { "TM_SQDIFF", "TM_SQDIFF_NORMED", "TM_CCORR","TM_CCORR_NORMED", "TM_CCOEFF", "TM_CCOEFF_NORMED" };
const int methods[] = { TM_SQDIFF, TM_SQDIFF_NORMED, TM_CCORR,TM_CCORR_NORMED, TM_CCOEFF, TM_CCOEFF_NORMED };int main()
{// 讀取圖像和模板Mat img = imread("image.jpg", IMREAD_GRAYSCALE);Mat template_img = imread("template.jpg", IMREAD_GRAYSCALE);if (img.empty() || template_img.empty()){cout << "Could not open or find the image or template" << endl;return -1;}int h = template_img.rows;int w = template_img.cols;// 遍歷不同的匹配方法for (int i = 0; i < 6; i++){Mat img2 = img.clone();Mat result;// 執行模板匹配matchTemplate(img2, template_img, result, methods[i]);double minVal, maxVal;Point minLoc, maxLoc;// 查找匹配結果中的最小值和最大值以及它們的位置minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);Point topLeft;bool isMatch = false;// 根據不同的匹配方法確定最佳匹配位置,并判斷是否匹配成功if (methods[i] == TM_SQDIFF || methods[i] == TM_SQDIFF_NORMED){topLeft = minLoc;if (methods[i] == TM_SQDIFF_NORMED && minVal < 0.1) // 可調整閾值{isMatch = true;}}else if (methods[i] == TM_CCORR_NORMED && maxVal > 0.8) // 可調整閾值{topLeft = maxLoc;isMatch = true;}else if (methods[i] == TM_CCOEFF_NORMED && maxVal > 0.8) // 可調整閾值{topLeft = maxLoc;isMatch = true;}if (isMatch){Point bottomRight(topLeft.x + w, topLeft.y + h);// 在圖像上繪制矩形框標記匹配位置rectangle(img2, topLeft, bottomRight, Scalar(255), 2);}else{cout << "No match found using " << method_names[i] << endl;}// 顯示結果imshow(method_names[i], img2);}waitKey(0);destroyAllWindows();return 0;
}

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

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

相關文章

NAT,代理服務,內網穿透

NAT 把報文的源IP替換為途徑路由器的WAN口IP NAPT 如何將數據從公網轉回給內網的主機&#xff1f;通過NAPT&#xff08;轉換表&#xff09;來實現&#xff0c;每次從內網到公網&#xff0c;公網到內網都會根據轉換表來進行 細節&#xff1a; NAT轉換時&#xff0c;值替換源…

大模型分布式訓練和優化

1. 分布式訓練概述 隨著語言模型參數量和所需訓練數據量的急速增長,單個機器上有限的資源已無法滿足大語言模型訓練的要求。因此,設計分布式訓練(Distributed Training)系統來解決海量的計算和內存資源需求問題變得至關重要。 分布式訓練是指將機器學習或深度學習模型訓練任…

第三方機構有哪些接口?

1&#xff0c;網銀接口。2&#xff0c;代扣接口。3&#xff0c;POS接口。4&#xff0c;快捷支付接口 1.網銀接口 第三方支付平臺連接網銀接口&#xff0c;進行支付跳轉時&#xff0c;第三方支付平臺充當了一個網關的角色&#xff0c;或者充當了銀行的代 理。 2.代扣接口 銀…

JUnit 版本影響 Bean 找不到

JUnit 版本影響 Bean 找不到 在為實現類編寫測試類時&#xff0c;在測試類中使用構造器注入 Bean 時&#xff0c;提示找不到 Bean&#xff0c;代碼如下&#xff1a; Service public class WeChatServiceImpl implements IWeChatService {Overridepublic String getNumber(Str…

夸父工具箱(安卓版) 手機超強工具箱

如今&#xff0c;人們的互聯網活動日益頻繁&#xff0c;導致手機內存即便頻繁清理&#xff0c;也會莫名其妙地迅速填滿&#xff0c;許多無用的垃圾信息悄然占據空間。那么&#xff0c;如何有效應對這一難題呢&#xff1f;答案就是今天新推出的這款工具軟件&#xff0c;它能從根…

《深度學習進階》第7集:深度實戰 通過訓練一個智能體玩游戲 來洞察 強化學習(RL)與決策系統

深度學習進階 | 第7集&#xff1a;深度實戰 通過訓練一個智能體玩游戲 來洞察 強化學習&#xff08;RL&#xff09;與決策系統 在深度學習的廣闊領域中&#xff0c;強化學習&#xff08;Reinforcement Learning, RL&#xff09;是一種獨特的范式&#xff0c;它通過智能體與環境…

Linux端口映射

1. 方法一使用firewalld 1.1 開啟偽裝IP firewall-cmd --permanent --add-masquerade 1.2 配置端口轉發&#xff0c;將到達本機的12345端口的訪問轉發到另一臺服務器的22端口 firewall-cmd --permanent --add-forward-portport12345:prototcp:toaddr192.168.172.131:toport…

文本處理Bert面試內容整理-BERT的基本原理是什么?

BERT(Bidirectional Encoder Representations from Transformers)的基本原理可以從以下幾個方面來理解: 1. 雙向上下文建模 BERT的一個核心創新是它通過雙向(bidirectional)建模上下文來理解詞語的意義。傳統的語言模型(如GPT)是單向的,即它們只考慮文本的左到右(或右…

MAC 本地搭建部署 dify(含 github訪問超時+Docker鏡像源拉取超時解決方案)

目錄 一、什么是 dify&#xff1f; 二、安裝 docker 1. 什么是 docker&#xff1f; 2. docker下載地址 三、安裝 dify 1. dify下載地址 2.可能遇到問題一&#xff1a; github訪問超時 3.下載后完成解壓 4.進入到 cmd 終端環境&#xff0c;執行下面三個命令 5.可能遇到…

USB3.0設備控制器驅動分析

一、USB驅動框架分析 USB控制器作為device的驅動框架分為&#xff1a;gadget Function驅動、gadget Function API、Composite以及UDC驅動。 gadget Function 驅動&#xff1a; 解釋&#xff1a;是針對 USB 設備特定功能的驅動程序。功能&#xff1a;負責實現 USB 設備對外提供的…

《Redis 入門指南:快速掌握高性能緩存技術》

目錄 一、準備工作 二、操作數據庫 2.1 切換數據庫 2.2 存儲和查看數據 一、存儲語法 二、一次性存儲多個鍵值對 三、追加值 四、查看值的類型 五、查詢值 六、一次查詢多個值 七、查看當下數據庫所有的鍵 八、刪除鍵 九、查看 鍵 是否存在 十、重命名鍵 2.3 過期…

跨部門溝通與團隊協作

【跨部門協作&#xff1a;破局之道在冰山之下】 感謝太原市組織部信任&#xff0c;上海財經大學邀約 今日為財務精英拆解《跨部門溝通與團隊協作》迷局。從本位思維到共同愿景&#xff0c;用因果回路圖透視沖突本質&#xff0c;當財務人開始用"延遲反饋"視角看預算博…

【零基礎到精通Java合集】第一集:Java開發環境搭建

以下是針對**“Java開發環境搭建”**的15分鐘課程內容設計,包含知識點拆分、實操演示與互動練習: 課程標題:Java開發環境搭建(15分鐘) 目標:完成JDK安裝、IDE配置并運行第一個Java程序 一、課程內容與時間分配 0-2分鐘 課程目標與前置準備 明確學習目標:JDK安裝、環境…

【JavaEE】wait 、notify和單例模式

【JavaEE】wait 、notify 和單例模式 一、引言一、wait()方法二、notify()方法三、notifyAll()方法四、wait&#xff08;&#xff09;和sleep&#xff08;&#xff09;對比五、單例模式5.1 餓漢模式5.2 懶漢模式5.2 懶漢模式-線程安全&#xff08;改進&#xff09; 博客結尾有此…

http報文的content-type參數和spring mvc傳參問題

很早之前博主聊過HTTP的報文結構以及其中和傳參相關的重要參數content-type還有spring mvc&#xff0c;以前的三篇文章&#xff1a; HTTP與HTTPS協議詳解&#xff1a;基礎與安全機制-CSDN博客 詳解Http的Content-Type_content-type application-CSDN博客 如何在Spring Boot中…

‘ts-node‘ 不是內部或外部命令,也不是可運行的程序

新建一個test.ts文件 let message: string = Hello World; console.log(message);如果沒有任何配置的前提下,會報錯’ts-node’ 不是內部或外部命令,也不是可運行的程序。 此時需要安裝一下ts-node。 npm install

《白帽子講 Web 安全:點擊劫持》

目錄 摘要&#xff1a; 一、點擊劫持概述 二、點擊劫持的實現示例&#xff1a;誘導用戶收藏指定淘寶商品 案例 構建惡意頁面&#xff1a; 設置絕對定位和z - index&#xff1a; 控制透明度&#xff1a; 三、其他相關攻擊技術 3.1圖片覆蓋攻擊與 XSIO 3.2拖拽劫持與數據…

基于機器學習的圖像分類綜述

圖像分類是計算機視覺和模式識別領域的核心任務之一,其目標是從輸入的圖像中自動識別并標注其所屬的類別標簽。基于機器學習的圖像分類技術近年來取得了顯著進展,尤其是在深度學習的推動下,性能得到了質的提升,并在多個實際應用中表現出色。 以下是對基于機器學習的圖像分…

SQL Server 中行轉列

在 SQL Server 數據庫中&#xff0c;行轉列在實踐中是一種非常有用&#xff0c;可以將原本以行形式存儲的數據轉換為列的形式&#xff0c;以便更好地進行數據分析和報表展示。本文將深入淺出地介紹 SQL Server 中的行轉列技術&#xff0c;并以數據表中的時間數據為例進行詳細講…

系統架構設計師—計算機基礎篇—系統性能評價

文章目錄 性能評價指標主頻CPU時鐘周期機器周期CPIMIPS 系統性能調整阿姆達爾解決方案性能優化數據庫應用系統Web應用系統 性能評估方法評價程序真實程序基準測試程序核心程序小型基準程序合成基準程序 基準測試程序組 評測準確度 性能指標計算機數據庫應用系統Web應用系統 性能…