opencv 模板匹配_详细剖析模板匹配
點(diǎn)擊上方“新機(jī)器視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
模板匹配介紹
我們需要2幅圖像:
原圖像 (I):?在這幅圖像里,我們希望找到一塊和模板匹配的區(qū)域
模板 (T):?將和原圖像比照的圖像塊
模板匹配就是在整個(gè)圖像區(qū)域發(fā)現(xiàn)與給定子圖像匹配的小塊區(qū)域。
所以模板匹配首先需要一個(gè)模板圖像T(給定的子圖像)
另外需要一個(gè)待檢測的圖像-源圖像S
工作方法,在帶檢測圖像上,從左到右,從上向下計(jì)算模板圖像與重疊子圖像的匹配度,匹配程度越大,兩者相同的可能性越大。
模板匹配原理
我們的目標(biāo)是檢測最匹配模板的原圖像的區(qū)域:
為了確定匹配模板區(qū)域, 我們不得不滑動模板圖像和原圖像進(jìn)行比較 :
對于 模板(T) 覆蓋在 原圖像 (I) 上的每個(gè)位置,你把度量值保存 到 結(jié)果圖像矩陣 ( R ) 中. 在 R 中的每個(gè)位置 (x,y) 都包含匹配度量值:
上圖(右)就是?TM_CCORR_NORMED?方法處理后的結(jié)果圖像 R . 最白的位置代表最高的匹配. 正如您所見, 黑色框住的位置很可能是結(jié)果圖像矩陣中的最大數(shù)值, 所以這個(gè)區(qū)域 (以這個(gè)點(diǎn)為頂點(diǎn),長寬和模板圖像一樣大小的矩陣) 被認(rèn)為是匹配的.
實(shí)際上, 我們使用函數(shù)?minMaxLoc?來定位在矩陣 R 中的最大值點(diǎn) (或者最小值, 根據(jù)函數(shù)輸入的匹配參數(shù)) .
void?minMaxLoc(InputArray src,?double* minVal,?double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray())src:輸入圖像。
minVal:在矩陣 src中存儲的最小值,可輸入NULL表示不需要。
maxVal :在矩陣 src中存儲的最大值,可輸入NULL表示不需要。
minLoc:在結(jié)果矩陣中最小值的坐標(biāo),可輸入NULL表示不需要,Point類型。
maxLoc:在結(jié)果矩陣中最大值的坐標(biāo),可輸入NULL表示不需要,Point類型。
mask:可選的掩模
模板匹配介紹 – 匹配算法介紹:
OpenCV中提供了六種常見的匹配算法如下:
計(jì)算平方不同 :計(jì)算出來的值越小,越相關(guān)?TM_SQDIFF = 0
計(jì)算相關(guān)性:計(jì)算出來的值越大,越相關(guān)?TM_CCORR = 2
計(jì)算相關(guān)系數(shù):計(jì)算出來的值越大,越相關(guān)?TM_CCOEFF = 4
計(jì)算歸一化平方不同 :計(jì)算出來的值越接近0,越相關(guān)?TM_SQDIFF_NORMED = 1
計(jì)算歸一化相關(guān)性:計(jì)算出來的值越接近1,越相關(guān)?TM_CCORR_NORMED = 3
計(jì)算歸一化相關(guān)系數(shù):計(jì)算出來的值越接近1,越相關(guān)?TM_CCOEFF_NORMED = 5
總結(jié)如下:
相關(guān)API介紹cv::matchTemplate
matchTemplate(InputArray image,// 源圖像,必須是8-bit或者32-bit浮點(diǎn)數(shù)圖像
InputArray templ,// 模板圖像,類型與輸入圖像一致
OutputArray result,// 輸出結(jié)果,必須是單通道32位浮點(diǎn)數(shù),假設(shè)源圖像WxH,模板圖像wxh, 則結(jié)果必須為W-w+1, H-h+1的大小。
int?method,//使用的匹配方法
InputArray mask=noArray()//(optional)
)
程序代碼
#include?#include?
using?namespace?std;
using?namespace?cv;
// 定義一些全局變量, 例如原圖像(img), 模板圖像(templ) 和結(jié)果圖像(result) ,?
// 還有匹配方法以及窗口名稱:
Mat img, templ, result;
char* image_window =?"Source Image";
char* result_window =?"Result window";
int?match_method = TM_SQDIFF;
int?max_Trackbar =?5;
void?MatchingMethod(?int,?void* );
int?main(?int?argc,?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);
?return?0;
}
void?MatchingMethod(?int,?void* ){
?// 將被顯示的原圖像
?Mat 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;
?// 創(chuàng)建了一幅用來存放匹配結(jié)果的輸出圖像矩陣. 仔細(xì)看看輸出矩陣的大小(它包含了所有可能的匹配位置)
?result.create( result_cols, result_rows, CV_32FC1 );
?// 執(zhí)行模板匹配操作,并對結(jié)果進(jìn)行歸一化:
?matchTemplate( img, templ, result, match_method );
?normalize( result, result,?0,?1, NORM_MINMAX,?-1, Mat() );
?// 通過函數(shù) minMaxLoc 定位最匹配的位置
?double?minVal, maxVal;?
?Point minLoc, maxLoc;
?Point matchLoc;
?
?//通過使用函數(shù) minMaxLoc ,我們確定結(jié)果矩陣 R 的最大值和最小值的位置.
?minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );//尋找result中最大值,最小值,及它們所在的位置
?// 對于方法 SQDIFF 和 SQDIFF_NORMED, 越小的數(shù)值代表更高的匹配結(jié)果. 而對于其他方法, 數(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;
}
運(yùn)行結(jié)果
本文主要借鑒”Madcola“和”Micheal超“兩位大神的文章。兩位大神的博客主頁是:
https://www.cnblogs.com/skyfsm/(Madcola)
https://blog.csdn.net/qq_42887760(Micheal超)
轉(zhuǎn)自:小白學(xué)視覺
?End?
聲明:部分內(nèi)容來源于網(wǎng)絡(luò),僅供讀者學(xué)術(shù)交流之目的。文章版權(quán)歸原作者所有。如有不妥,請聯(lián)系刪除。
總結(jié)
以上是生活随笔為你收集整理的opencv 模板匹配_详细剖析模板匹配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java ajax无权限跳转_如何在aj
- 下一篇: python 截取字符串6位_在Pyth