模板匹配詳解_第1頁
模板匹配詳解_第2頁
模板匹配詳解_第3頁
模板匹配詳解_第4頁
模板匹配詳解_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、模板匹配?目標(biāo)?在這節(jié)教程中您將學(xué)到: 使用 OpenCV 函數(shù) matchTemplate 在模 板塊和輸入圖像之間尋找匹配,獲得匹配結(jié) 果圖像 使用 OpenCV 函數(shù) minMaxLoc 在給定的 矩陣中尋找最大和最小值(包括它們的位 置).原理?什么是模板匹配?模板匹配是一項在一幅圖像中尋找與另一幅模板圖像最匹配(相似)部分的技術(shù).它是怎么實現(xiàn)的? 我們需要2幅圖像:1 .原圖像(I):在這幅圖像里,我們希望 找到一塊和模板匹配的區(qū)域2 .模板(T):將和原圖像比照的圖像 塊我們的目標(biāo)是檢測最匹配的區(qū)域 為了確定匹配區(qū)域,我們不得不滑動模板圖 像和原圖像進行比較: 通過 滑動,我們的意

2、思是圖像塊一次移動 一個像素(從左往右,從上往下).在每一個 位置,都進行一次度量計算來表明它是好”或 壞”地與那個位置匹配(或者說塊圖像和原圖像的特定區(qū)域有多么相似). 對于T覆蓋在I上的每個位置,你把度量 值保存到結(jié)果圖像矩陣(R)中.在R 中的每個位置(oy)都包含匹配度量值:上 圖就是 TM_CCORR_NORMED 方法 處理后的結(jié)果圖像 R.最白的位置代表最 高的匹配.正如您所見,紅色橢圓框住的位 置很可能是結(jié)果圖像矩陣中的最大數(shù)值,所以這個區(qū)域(以這個點為頂點,長寬和模 板圖像一樣大小的矩陣)被認(rèn)為是匹配的.實際上,我們使用函數(shù) minMaxLoc來定 位在矩陣R中的最大值點(或

3、者最小值, 根據(jù)函數(shù)輸入的匹配參數(shù)).OpenCV中支持哪些匹配算法?問得好.OpenCV通過函數(shù) matchTemplate實現(xiàn)了模板匹配算法.可用的方法 有6個:1.平方差匹配 method=CV_TM_SQDIFF這類方法利用平方差來進行匹配,最好匹配為0.匹配越差,匹配值越大.R(kq) =- Ifx + x; y + yb.標(biāo) 準(zhǔn) 平 方 差 匹 配method=CV_TM_SQDIFF_NORMED匯 xw(T(x',T)- i(x + x', y + H個y耳-jExw(T)2" £口1,+劃四+ T)2c.相關(guān)匹配 method=CV_TM_

4、CCORR這類方法采用模板和圖像間的乘法操作,所以較大的數(shù)表示匹配程度較高,0標(biāo)識最壞的匹配效果.R(x,y) = £(T(x',y>I(x + x-y+y')d.標(biāo) 準(zhǔn) 相 關(guān) 匹 配method=CV_TM_CCORR_NORMED.區(qū)W(T(x'y . Hx + xy 十 ¥)R(x,U)=、T(x1式產(chǎn).tX守 I(x + x' y + y午e.相關(guān)匹配 method=CV_TM_CCOEFF這類方法將模版對其均值的相對值與圖像對其均值的相關(guān)值進行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示沒有任何相關(guān)性(隨機序列).R(x

5、,y) = £(T'(xly')I(x + x',y+y'j)在這里口£,第)=T(x;y,)一 1/(w h) 工w T(x,)r(x 4-xy + yf = I(x + xy+yO- l/(w ' h) 區(qū)”四“1儀 +x",y + y")f.標(biāo) 準(zhǔn) 相 關(guān) 匹 配method=CV_TM_CCOEFF_NORMEDm ,W)rx + ky + U)R(x,y) = /*=X, y Q2 工 m Hx + x y + y,通常,隨著從簡單的測量(平方差)到更復(fù)雜的測量(相關(guān)系數(shù)),我們可獲得越來越 準(zhǔn)確的匹配(

6、同時也意味著越來越大的計算代價).最好的辦法是對所有這些設(shè)置 多做一些測試實驗,以便為自己的應(yīng)用選擇同時兼顧速度和精度的最佳方案 .代碼? 在這程序?qū)崿F(xiàn)了什么?0載入一幅輸入圖像和一幅模板圖像 塊(template)o 通過使用函數(shù)matchTemplate 實現(xiàn)之前所述的6種匹配方法的任一 個.用戶可以通過滑動條選取任何 一種方法.o歸一化匹配后的輸出結(jié)果0定位最匹配的區(qū)域0用矩形標(biāo)注最匹配的區(qū)域 下載代碼:單擊 這里 看一下代碼:#include "opencv2/highgui/highgui.hpp”#include "opencv2/imgproc/imgproc

7、.hpp”#include <iostream>#include <stdio.h>using namespacestd;using namespacecv;/ 全局變量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 , void * );/

8、* 主函數(shù)*/int main( int argc, char* argv )/載入原圖像和模板塊img = imread( argv 1, 1 );tempi = imread( argv 2, 1 );/ 創(chuàng)建窗口namedWindow( image_window, CV_WINDOW_AUTOSIZE );namedWindow( result_window, CV_WINDOW_AUTOSIZE );/創(chuàng)建滑動條char* trackbar_label = "Method: n 0: SQDIFRn 1: SQDIFF NORMEn 2: TM CCORRn 3: TM CC

9、ORR NORMEn 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 img_display;img.copyTo( img_di

10、splay );/創(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 );/進行匹配和標(biāo)準(zhǔn)化matchTemplate( img, tempi, result, match_method );normalize( result, result,0, 1, NORM_MINMAX- 1, Mat();/ 通過函數(shù)minMaxLoc定位最匹配的位置double

11、 minVal; double maxVal; Point minLoc; Point maxLoc;Point matchLoc;minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat();/ 對于方法SQDIFF和SQDIFF_NORMEDg小的數(shù)值代表更高的匹配結(jié)果 而對于其他方法,數(shù)值越大匹配越好if ( match_method = CV_TM_SQDIFF| match_method = CV_TM_SQDIFF_NORMED ) matchLoc = minLoc; else match

12、Loc = 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 ), Scalar二 all( 0), 2, 8, 0 );imshow( image_window, img_display );imshow

13、( result_window, result );return ;代碼說明?1. 定義一些全局變量,例如原圖像(img),模板 圖像(tempi)和結(jié)果圖像(result),還有匹 配方法以及窗口名稱:2. Mat img; Mat tempi; Mat result;3. char* image_window = "SourceImage"4. char* resuit_window = "Resultwindow"5.6. intmatch_method;7. intmax_Trackbar =5;8. 載入原圖像和匹配塊:9. img= imre

14、ad( argv1,1 );10. tempi = imread( argv 2, 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ù) MatchingMethod 就會被調(diào)用.15. char* trackbar_label = "Method: n 0: SQDIFF n 1: SQDIFF NORMED

15、n 2:TM CCORR 3: TM CCORR NORMED4: TM COEFRn 5: TM COEFF NORMED "16. createTrackbar( trackbar_label, image_window,&match_method,max_Trackbar, MatchingMethod );17. 一直等待,直到用戶退出這個程序.18. waitKey( 0);19. return 0;20. 讓我們先看看回調(diào)函數(shù).首先,它對原圖像 進行了一份復(fù)制:21.22.Mat img_display;img.copyTo( img_display );23.

16、然后,它創(chuàng)建了一幅用來存放匹配結(jié)果的 輸出圖像矩陣.仔細(xì)看看輸出矩陣的大小 (它包含了所有可能的匹配位置)24. intresult_cols=img.cols-templ.cols + 1;25. intresult_rows =img.rows-templ.rows + 1;26.27. result.create(result_cols,result_rows, CV_32FC1 );28. 執(zhí)行模板匹配操作:29. matchTemplate( img, templ, result, match_method );很自然地,參數(shù)是輸入圖像I,模板圖像T, 結(jié)果圖像R還有匹配方法(通過滑

17、動條給出)30. 我們對結(jié)果進行歸一化:31. normalize( result, result, 0, 1, NORM_MINMAX1 , Mat();32. 通過使用函數(shù) minMaxLoc,我們確定結(jié)果 矩陣R的最大值和最小值的位置.33. double minVal; double maxVal;Point minLoc; Point maxLoc;34. Point matchLoc;35.36. minMaxLoc( result,&minVal,&maxVal, &minLoc, &maxLoc, Mat();函數(shù)中的參數(shù)有:o result:匹

18、配結(jié)果矩陣o &minVal和 &maxVal:在矩陣result中存儲的最小值和最大值o &minLoc和 &maxLoc:在結(jié)果矩陣中最小值和最大值的坐標(biāo).o Mat():可選的掩模37. 對于前二種方法 (CV_SQDIFF 和 CV_SQDIFF_NORMED )最彳氐的數(shù)值標(biāo) 識最好的匹配.對于其他的,越大的數(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( matchLo

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論