0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

?詳細剖析模板匹配

新機器視覺 ? 來源:小白學視覺 ? 2023-03-03 10:10 ? 次閱讀


																

模板匹配介紹

我們需要2幅圖像:

原圖像 (I):在這幅圖像里,我們希望找到一塊和模板匹配的區(qū)域

模板 (T):將和原圖像比照的圖像塊

c3b0917c-b920-11ed-bfe3-dac502259ad0.jpg

  • 模板匹配就是在整個圖像區(qū)域發(fā)現(xiàn)與給定子圖像匹配的小塊區(qū)域。

  • 所以模板匹配首先需要一個模板圖像T(給定的子圖像)

  • 另外需要一個待檢測的圖像-源圖像S

  • 工作方法,在帶檢測圖像上,從左到右,從上向下計算模板圖像與重疊子圖像的匹配度,匹配程度越大,兩者相同的可能性越大。

模板匹配原理

我們的目標是檢測最匹配模板的原圖像的區(qū)域:

c3cf2614-b920-11ed-bfe3-dac502259ad0.jpg

為了確定匹配模板區(qū)域, 我們不得不滑動模板圖像和原圖像進行比較 :

c3ed1386-b920-11ed-bfe3-dac502259ad0.jpg

對于 模板(T) 覆蓋在 原圖像 (I) 上的每個位置,你把度量值保存 到 結果圖像矩陣 ( R ) 中. 在 R 中的每個位置 (x,y) 都包含匹配度量值:

c40a2bd8-b920-11ed-bfe3-dac502259ad0.jpg

上圖(右)就是TM_CCORR_NORMED方法處理后的結果圖像 R . 最白的位置代表最高的匹配. 正如您所見, 黑色框住的位置很可能是結果圖像矩陣中的最大數(shù)值, 所以這個區(qū)域 (以這個點為頂點,長寬和模板圖像一樣大小的矩陣) 被認為是匹配的.

實際上, 我們使用函數(shù)minMaxLoc來定位在矩陣 R 中的最大值點 (或者最小值, 根據(jù)函數(shù)輸入的匹配參數(shù)) .

voidminMaxLoc(InputArray src,double* minVal,double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray())
  • src:輸入圖像。

  • minVal:在矩陣 src中存儲的最小值,可輸入NULL表示不需要。

  • maxVal :在矩陣 src中存儲的最大值,可輸入NULL表示不需要。

  • minLoc:在結果矩陣中最小值的坐標,可輸入NULL表示不需要,Point類型。

  • maxLoc:在結果矩陣中最大值的坐標,可輸入NULL表示不需要,Point類型。

  • mask:可選的掩模

模板匹配介紹 – 匹配算法介紹:

OpenCV中提供了六種常見的匹配算法如下:

  • 計算平方不同 :計算出來的值越小,越相關TM_SQDIFF = 0

c41a139a-b920-11ed-bfe3-dac502259ad0.png

  • 計算相關性:計算出來的值越大,越相關TM_CCORR = 2

c42bcae0-b920-11ed-bfe3-dac502259ad0.png

  • 計算相關系數(shù):計算出來的值越大,越相關TM_CCOEFF = 4

c43c1ac6-b920-11ed-bfe3-dac502259ad0.png

  • 計算歸一化平方不同 :計算出來的值越接近0,越相關TM_SQDIFF_NORMED = 1

c44f3d22-b920-11ed-bfe3-dac502259ad0.png

  • 計算歸一化相關性:計算出來的值越接近1,越相關TM_CCORR_NORMED = 3

c460754c-b920-11ed-bfe3-dac502259ad0.png

  • 計算歸一化相關系數(shù):計算出來的值越接近1,越相關TM_CCOEFF_NORMED = 5

c471e37c-b920-11ed-bfe3-dac502259ad0.png

總結如下:

c480914c-b920-11ed-bfe3-dac502259ad0.jpg

相關API介紹cv::matchTemplate

matchTemplate(
InputArray image,// 源圖像,必須是8-bit或者32-bit浮點數(shù)圖像
InputArray templ,// 模板圖像,類型與輸入圖像一致
OutputArray result,// 輸出結果,必須是單通道32位浮點數(shù),假設源圖像WxH,模板圖像wxh, 則結果必須為W-w+1, H-h+1的大小。
intmethod,//使用的匹配方法
InputArray mask=noArray()//(optional)
)

c49aaca8-b920-11ed-bfe3-dac502259ad0.jpg

程序代碼

#include
#include
usingnamespacestd;
usingnamespacecv;

// 定義一些全局變量, 例如原圖像(img), 模板圖像(templ) 和結果圖像(result) ,
// 還有匹配方法以及窗口名稱:
Mat img, templ, result;
char* image_window ="Source Image";
char* result_window ="Result window";

intmatch_method = TM_SQDIFF;
intmax_Trackbar =5;

voidMatchingMethod(int,void* );

intmain(intargc,char** argv )
{
// 1. 載入原圖像和模板塊
img = imread("E:/Experiment/OpenCV/Pictures/TargetSearch.jpg");
templ = imread("E:/Experiment/OpenCV/Pictures/Target.jpg");
imshow("模板圖像",templ);

// 創(chuàng)建窗口
namedWindow( image_window, CV_WINDOW_AUTOSIZE );
namedWindow( result_window, CV_WINDOW_AUTOSIZE );

// 2. 創(chuàng)建滑動條并輸入將被使用的匹配方法. 一旦滑動條發(fā)生改變,回調(diào)函數(shù) MatchingMethod 就會被調(diào)用.
char* trackbar_label ="模板匹配方式";
createTrackbar( trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod );

MatchingMethod(0,0);

waitKey(0);
return0;
}

voidMatchingMethod(int,void* )
{
// 將被顯示的原圖像
Mat img_display;
img.copyTo( img_display );

// 創(chuàng)建輸出結果的矩陣
intresult_cols = img.cols - templ.cols +1;
intresult_rows = img.rows - templ.rows +1;
// 創(chuàng)建了一幅用來存放匹配結果的輸出圖像矩陣. 仔細看看輸出矩陣的大小(它包含了所有可能的匹配位置)
result.create( result_cols, result_rows, CV_32FC1 );

// 執(zhí)行模板匹配操作,并對結果進行歸一化:
matchTemplate( img, templ, result, match_method );
normalize( result, result,0,1, NORM_MINMAX,-1, Mat() );

// 通過函數(shù) minMaxLoc 定位最匹配的位置
doubleminVal, maxVal;
Point minLoc, maxLoc;
Point matchLoc;

//通過使用函數(shù) minMaxLoc ,我們確定結果矩陣 R 的最大值和最小值的位置.
minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );//尋找result中最大值,最小值,及它們所在的位置

// 對于方法 SQDIFF 和 SQDIFF_NORMED, 越小的數(shù)值代表更高的匹配結果. 而對于其他方法, 數(shù)值越大匹配越好
if( match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED ){
 matchLoc = minLoc;
}else{
 matchLoc = maxLoc;
}

// 繪制矩形
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( result_window, result );

return;
}

運行結果

c4aa700c-b920-11ed-bfe3-dac502259ad0.jpg

c4bdc79c-b920-11ed-bfe3-dac502259ad0.jpg

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 圖像
    +關注

    關注

    2

    文章

    1075

    瀏覽量

    40275
  • 模板
    +關注

    關注

    0

    文章

    107

    瀏覽量

    20533
  • 函數(shù)
    +關注

    關注

    3

    文章

    4237

    瀏覽量

    61971

原文標題:?詳細剖析模板匹配

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    什么是模板匹配?模板匹配的原理講解 圖像處理與模板匹配算法

    一:什么是模板匹配? 在OpenCV教程中這樣解釋模板匹配模板匹配是一項在一幅圖像中尋找與另
    的頭像 發(fā)表于 05-05 09:25 ?3.4w次閱讀
    什么是<b class='flag-5'>模板</b><b class='flag-5'>匹配</b>?<b class='flag-5'>模板</b><b class='flag-5'>匹配</b>的原理講解 圖像處理與<b class='flag-5'>模板</b><b class='flag-5'>匹配</b>算法

    labview 模板匹配

    請問模板匹配沒有數(shù)據(jù)出現(xiàn)是什么問題?
    發(fā)表于 04-10 15:29

    labview 視覺 多模板匹配 教程

    ` 本帖最后由 wcl86 于 2019-9-24 17:12 編輯 Labview視覺多模板匹配教程 源碼回復可見:[hide][/hide]談到labview的定位,有很多人吐槽其沒有多模板
    發(fā)表于 09-24 16:59

    labview 視覺 多模板匹配 教程

    `談到labview的定位,有很多人吐槽其沒有多模板匹配的功能,今天就給大家介紹下,labview視覺自帶的多模板匹配功能。多模板
    發(fā)表于 07-23 20:46

    手寫數(shù)字識別的模板匹配方法源程序

    手寫數(shù)字識別的模板匹配
    發(fā)表于 01-02 19:43 ?73次下載

    基于改進模板匹配的芯片缺陷檢測方法

    提出了一種改進的模板匹配方法。該方法是在傳統(tǒng)的模板匹配方法的基礎上,通過對模板匹配算法的改進,以
    發(fā)表于 09-03 15:15 ?9次下載

    基于模板匹配的電子元器件針腳檢測方法

    相關系數(shù)法模板匹配是數(shù)字攝影檢測中的一種經(jīng)典的基于灰度的匹配方法。提出了一種基于模板匹配的電子器件針腳檢測方法,以實際針腳影像和自動生成的標
    發(fā)表于 08-02 14:12 ?19次下載

    基于模板匹配的圖像跟蹤技術

    為了解決傳統(tǒng)模板匹配方法跟蹤圖像時遇到的問題,提出了在跟蹤過程中采用變模板匹配的方法。該方法較好地解決了傳統(tǒng)方法的局限性,通過實驗比較了使用模板
    發(fā)表于 12-20 17:01 ?0次下載

    模板匹配

    《OpenCV3編程入門》書本配套源代碼:模板匹配
    發(fā)表于 06-06 15:39 ?5次下載

    OpenCV3編程入門-源碼例程全集-模板匹配

    OpenCV3編程入門-源碼例程全集-模板匹配
    發(fā)表于 09-17 22:55 ?4次下載

    基于模板匹配的OCR盲人導讀儀器(STM32+OV5640)

    基于模板匹配的OCR盲人導讀儀器(STM32F407+OV5640)
    發(fā)表于 12-11 16:39 ?35次下載

    機器視覺中基于灰度統(tǒng)計的快速模板匹配算法詳細概述

    本文針對傳統(tǒng)的基于灰度值的匹配算法計算量大、時間復雜度高的缺陷,提出了一種基于灰度統(tǒng)計的快速模板匹配算法。以十字特征直線代替模板進行粗匹配,
    發(fā)表于 08-18 15:53 ?7次下載
    機器視覺中基于灰度統(tǒng)計的快速<b class='flag-5'>模板</b><b class='flag-5'>匹配</b>算法<b class='flag-5'>詳細</b>概述

    探究halcon模板匹配干擾邊緣消除辦法

    最近做了個項目,遇到一個問題,就是在創(chuàng)建形狀匹配模板時候,干擾太多,像麻繩一樣。 使用自定義區(qū)域去消除吧,因為輪廓長,邊緣干擾距離近,操作起來不方便; 使用CAD圖形創(chuàng)建模板吧,又因為產(chǎn)品隨意性比較
    的頭像 發(fā)表于 05-29 13:42 ?4488次閱讀

    OpenMV如何實現(xiàn)旋轉模板匹配

    OpenCV中模板匹配不支持旋轉角度、不支持多尺度跟多對象模板匹配,同時匹配速度比較慢,針對不支持旋轉
    的頭像 發(fā)表于 01-14 10:21 ?1730次閱讀

    OpenCV邊緣模板匹配算法原理詳解

    OpenCV中自帶的模板匹配算法,完全是像素基本的模板匹配,特別容易受到光照影響,光照稍微有所不同,該方法就會歇菜了!搞得很多OpenCV初學者剛學習到該方法時候很開心,一用該方法馬上
    的頭像 發(fā)表于 12-07 10:56 ?1104次閱讀
    OpenCV邊緣<b class='flag-5'>模板</b><b class='flag-5'>匹配</b>算法原理詳解