




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、模板匹配¶目標(biāo)¶在這節(jié)教程中您將學(xué)到:· 使用OpenCV函數(shù) matchTemplate 在模板塊和輸入圖像之間尋找匹配,獲得匹配結(jié)果圖像 · 使用OpenCV函數(shù) minMaxLoc 在給定的矩陣中尋找最大和最小值(包括它們的位置). 原理¶什么是模板匹配?¶模板匹配是一項(xiàng)在一幅圖像中尋找與另一幅模板圖像最匹配(相似)部分的技術(shù).它是怎么實(shí)現(xiàn)的?¶· 我們需要2幅圖像:1. 原圖像 (I): 在這幅圖像里,我們希望找到一塊和模板匹配的區(qū)域 2. 模板 (T): 將和原圖像比照的圖像塊 我們的目標(biāo)是檢測最匹配的區(qū)
2、域:· 為了確定匹配區(qū)域, 我們不得不滑動模板圖像和原圖像進(jìn)行 比較 :· 通過 滑動, 我們的意思是圖像塊一次移動一個像素 (從左往右,從上往下). 在每一個位置, 都進(jìn)行一次度量計(jì)算來表明它是 “好” 或 “壞” 地與那個位置匹配 (或者說塊圖像和原圖像的特定區(qū)域有多么相似).· 對于 T 覆蓋在 I 上的每個位置,你把度量值 保存 到 結(jié)果圖像矩陣 (R) 中. 在 R 中的每個位置 都包含匹配度量值:上圖就是 TM_CCORR_NORMED 方法處理后的結(jié)果圖像 R . 最白的位置代表最高的匹配. 正如您所見, 紅色橢圓框住的位置很可能是結(jié)果圖像矩陣中的最
3、大數(shù)值, 所以這個區(qū)域 (以這個點(diǎn)為頂點(diǎn),長寬和模板圖像一樣大小的矩陣) 被認(rèn)為是匹配的.· 實(shí)際上, 我們使用函數(shù) minMaxLoc 來定位在矩陣 R 中的最大值點(diǎn) (或者最小值, 根據(jù)函數(shù)輸入的匹配參數(shù)) .OpenCV中支持哪些匹配算法?¶問得好. OpenCV通過函數(shù) matchTemplate 實(shí)現(xiàn)了模板匹配算法. 可用的方法有6個:1. 平方差匹配 method=CV_TM_SQDIFF 這類方法利用平方差來進(jìn)行匹配,最好匹配為0.匹配越差,匹配值越大.b. 標(biāo)準(zhǔn)平方差匹配 method=CV_TM_SQDIFF_NORMEDc. 相關(guān)匹配 method=CV
4、_TM_CCORR這類方法采用模板和圖像間的乘法操作,所以較大的數(shù)表示匹配程度較高,0標(biāo)識最壞的匹配效果.d. 標(biāo)準(zhǔn)相關(guān)匹配 method=CV_TM_CCORR_NORMEDe. 相關(guān)匹配 method=CV_TM_CCOEFF這類方法將模版對其均值的相對值與圖像對其均值的相關(guān)值進(jìn)行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示沒有任何相關(guān)性(隨機(jī)序列).在這里f. 標(biāo)準(zhǔn)相關(guān)匹配 method=CV_TM_CCOEFF_NORMED通常,隨著從簡單的測量(平方差)到更復(fù)雜的測量(相關(guān)系數(shù)),我們可獲得越來越準(zhǔn)確的匹配(同時也意味著越來越大的計(jì)算代價). 最好的辦法是對所有這些設(shè)置多做一些測
5、試實(shí)驗(yàn),以便為自己的應(yīng)用選擇同時兼顧速度和精度的最佳方案.代碼¶· 在這程序?qū)崿F(xiàn)了什么?o 載入一幅輸入圖像和一幅模板圖像塊 (template) o 通過使用函數(shù) matchTemplate 實(shí)現(xiàn)之前所述的6種匹配方法的任一個. 用戶可以通過滑動條選取任何一種方法. o 歸一化匹配后的輸出結(jié)果 o 定位最匹配的區(qū)域 o 用矩形標(biāo)注最匹配的區(qū)域 · 下載代碼: 單擊 這里· 看一下代碼:#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgpro
6、c.hpp"#include <iostream>#include <stdio.h>using namespace std;using namespace cv;/ 全局變量Mat img; Mat templ; Mat result;char* image_window = "Source Image"char* result_window = "Result window"int match_method;int max_Trackbar = 5;/ 函數(shù)聲明void MatchingMethod( int, vo
7、id* );/* 主函數(shù) */int main( int argc, char* argv ) / 載入原圖像和模板塊 img = imread( argv1, 1 ); templ = imread( argv2, 1 ); / 創(chuàng)建窗口 namedWindow( image_window, CV_WINDOW_AUTOSIZE ); namedWindow( result_window, CV_WINDOW_AUTOSIZE ); / 創(chuàng)建滑動條 char* trackbar_label = "Method: n 0: SQDIFF n 1: SQDIFF NORMED n 2:
8、 TM CCORR n 3: TM CCORR NORMED n 4: TM COEFF n 5: TM COEFF NORMED" createTrackbar( trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod ); MatchingMethod( 0, 0 ); waitKey(0); return 0;/* * 函數(shù) MatchingMethod * 簡單的滑動條回調(diào)函數(shù) */void MatchingMethod( int, void* ) / 將被顯示的原圖像 Mat
9、 img_display; img.copyTo( img_display ); / 創(chuàng)建輸出結(jié)果的矩陣 int result_cols = img.cols - templ.cols + 1; int result_rows = img.rows - templ.rows + 1; result.create( result_cols, result_rows, CV_32FC1 ); / 進(jìn)行匹配和標(biāo)準(zhǔn)化 matchTemplate( img, templ, result, match_method ); normalize( result, result, 0, 1, NORM_MINM
10、AX, -1, Mat() ); / 通過函數(shù) minMaxLoc 定位最匹配的位置 double minVal; double maxVal; Point minLoc; Point maxLoc; Point matchLoc; minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() ); / 對于方法 SQDIFF 和 SQDIFF_NORMED, 越小的數(shù)值代表更高的匹配結(jié)果. 而對于其他方法, 數(shù)值越大匹配越好 if( match_method = CV_TM_SQDIFF | matc
11、h_method = CV_TM_SQDIFF_NORMED ) matchLoc = minLoc; else matchLoc = maxLoc; / 讓我看看您的最終結(jié)果 rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar:all(0), 2, 8, 0 ); rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Sc
12、alar:all(0), 2, 8, 0 ); imshow( image_window, img_display ); imshow( result_window, result ); return;代碼說明¶1. 定義一些全局變量, 例如原圖像(img), 模板圖像(templ) 和結(jié)果圖像(result) , 還有匹配方法以及窗口名稱:2. Mat img; Mat templ; Mat result;3. char* image_window = "Source Image"4. char* result_window = "Result win
13、dow"5.6. int match_method;7. int max_Trackbar = 5;8. 載入原圖像和匹配塊:9. img = imread( argv1, 1 );10. templ = imread( argv2, 1 );11. 創(chuàng)建窗口,顯示原圖像和結(jié)果圖像:12. namedWindow( image_window, CV_WINDOW_AUTOSIZE );13. namedWindow( result_window, CV_WINDOW_AUTOSIZE );14. 創(chuàng)建滑動條并輸入將被使用的匹配方法. 一旦滑動條發(fā)生改變,回調(diào)函數(shù) MatchingMe
14、thod 就會被調(diào)用.15. char* trackbar_label = "Method: n 0: SQDIFF n 1: SQDIFF NORMED n 2: TM CCORR n 3: TM CCORR NORMED n 4: TM COEFF n 5: TM COEFF NORMED"16. createTrackbar( trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod );17. 一直等待,直到用戶退出這個程序.18. waitKey(0);19. ret
15、urn 0;20. 讓我們先看看回調(diào)函數(shù). 首先, 它對原圖像進(jìn)行了一份復(fù)制:21. Mat img_display;22. img.copyTo( img_display );23. 然后, 它創(chuàng)建了一幅用來存放匹配結(jié)果的輸出圖像矩陣. 仔細(xì)看看輸出矩陣的大小(它包含了所有可能的匹配位置)24. int result_cols = img.cols - templ.cols + 1;25. int result_rows = img.rows - templ.rows + 1;26.27. result.create( result_cols, result_rows, CV_32FC1 )
16、;28. 執(zhí)行模板匹配操作:29. matchTemplate( img, templ, result, match_method );很自然地,參數(shù)是輸入圖像 I, 模板圖像 T, 結(jié)果圖像 R 還有匹配方法 (通過滑動條給出)30. 我們對結(jié)果進(jìn)行歸一化:31. normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );32. 通過使用函數(shù) minMaxLoc ,我們確定結(jié)果矩陣 R 的最大值和最小值的位置.33. double minVal; double maxVal; Point minLoc; Point maxLoc;34
17、. Point matchLoc;35.36. minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );函數(shù)中的參數(shù)有:o result: 匹配結(jié)果矩陣 o &minVal 和 &maxVal: 在矩陣 result 中存儲的最小值和最大值 o &minLoc 和 &maxLoc: 在結(jié)果矩陣中最小值和最大值的坐標(biāo). o Mat(): 可選的掩模 37. 對于前二種方法 ( CV_SQDIFF 和 CV_SQDIFF_NORMED ) 最低的數(shù)值標(biāo)識最好的匹配.
18、 對于其他的, 越大的數(shù)值代表越好的匹配. 所以, 我們在 matchLoc 中存放相符的變量值:38. if( match_method = CV_TM_SQDIFF | match_method = CV_TM_SQDIFF_NORMED )39. matchLoc = minLoc; 40. else41. matchLoc = maxLoc; 42. 顯示原圖像和結(jié)果圖像. 再用矩形框標(biāo)注最符合的區(qū)域:43. rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar:all(0), 2, 8, 0 );44. rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar:all(0), 2, 8, 0 );45.46. imshow( image_window, img_display );47. imshow( r
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司職業(yè)鑒定活動方案
- 公司新年拍照策劃方案
- 公司獻(xiàn)血公益活動策劃方案
- 公司種植綠植活動方案
- 公司特賣現(xiàn)場活動方案
- 公司電商短視頻策劃方案
- 公司溫泉度假活動方案
- 公司臘八節(jié)慰問活動方案
- 公司水槍大戰(zhàn)活動方案
- 公司相親會會活動方案
- 2025年河南省高考物理真題(解析版)
- 2025中國心肌病綜合管理指南要點(diǎn)解讀課件
- 7數(shù)滬科版期末考試卷-2024-2025學(xué)年七年級(初一)數(shù)學(xué)下冊期末考試模擬卷03
- 涼山州木里縣選聘社區(qū)工作者筆試真題2024
- 2025年中國太平洋人壽保險(xiǎn)股份有限公司勞動合同
- 配電線路高級工練習(xí)試題附答案
- 護(hù)士N2理論考試試題及答案
- 2025年河北省中考麒麟卷地理(二)
- 公共組織績效評估-形考任務(wù)一(占10%)-國開(ZJ)-參考資料
- GB/T 45439-2025燃?xì)鈿馄亢腿細(xì)馄块y溯源二維碼應(yīng)用技術(shù)規(guī)范
- 臺球廳股東合同范例
評論
0/150
提交評論