void cv::matchTemplate( cv::InputArray image, // 待匹配圖像W*H cv::InputArray templ, // 模板圖像,和image類型相同, 大小 w*h cv::OutputArray result, // 匹配結果圖像, 類型 32F, 大小 (W-w+1)*(H-h+1) int method // 用於比較的方法 );
1.result數據的含義ios
模板匹配函數cvMatchTemplate依次計算模板與待測圖片的重疊區域的類似度,並將結果存入映射圖像result當中,也就是說result圖像中的每個點的值表明了一次類似度比較結果。算法
2.result的尺寸大小數組
如圖可知,模板在待測圖像上每次在橫向或是縱向上移動一個像素,並做一次比較計算,由此,橫向比較W-w+1次,縱向比較H-h+1次,從而獲得一個(W-w+1)×(H-h+1)維的結果矩陣,result便是用圖像來表示這樣的矩陣,於是圖像result的大小爲(W-w+1)×(H-h+1)。匹配結果圖像與原圖像之間的大小關係,他們之間差了一個模板大小。函數
3.如何從result中得到最佳匹配區域ui
使用函數cvMinMaxLoc(result,&min_val,&max_val,&min_loc,&max_loc,NULL);從result中提取最大值(類似度最高)以及最大值的位置(即在result中該最大值max_val的座標位置max_loc,即模板滑行時左上角的座標,相似於圖中的座標(x,y)。spa
由此獲得:rect=cvRect(max_loc.x,max_loc.y,tmp->width,tmp->height); rect表示最佳的匹配的矩形區域。
指針
1 #include "opencv2/highgui/highgui.hpp" 2 #include "opencv2/imgproc/imgproc.hpp" 3 #include <iostream> 4 using namespace cv; 5 6 7 //-----------------------------------【宏定義部分】-------------------------------------------- 8 // 描述:定義一些輔助宏 9 //------------------------------------------------------------------------------------------------ 10 #define WINDOW_NAME1 "【原始圖片】" //爲窗口標題定義的宏 11 #define WINDOW_NAME2 "【匹配窗口】" //爲窗口標題定義的宏 12 13 //-----------------------------------【全局變量聲明部分】------------------------------------ 14 // 描述:全局變量的聲明 15 //----------------------------------------------------------------------------------------------- 16 Mat g_srcImage; 17 Mat g_templateImage; 18 Mat g_resultImage; 19 int g_nMatchMethod; 20 int g_nMaxTrackbarNum = 5; 21 22 //-----------------------------------【全局函數聲明部分】-------------------------------------- 23 // 描述:全局函數的聲明 24 //----------------------------------------------------------------------------------------------- 25 void on_Matching(int, void*); 26 static void ShowHelpText(); 27 28 29 //-----------------------------------【main( )函數】-------------------------------------------- 30 // 描述:控制檯應用程序的入口函數,咱們的程序從這裏開始執行 31 //----------------------------------------------------------------------------------------------- 32 int main() 33 { 34 35 36 37 //【1】載入原圖像和模板塊 38 g_srcImage = imread("1.jpg", 1); 39 g_templateImage = imread("2.jpg", 1); 40 41 //【2】建立窗口 42 namedWindow(WINDOW_NAME1, CV_WINDOW_AUTOSIZE); 43 namedWindow(WINDOW_NAME2, CV_WINDOW_AUTOSIZE); 44 45 //【3】建立滑動條並進行一次初始化 46 createTrackbar("方法", WINDOW_NAME1, &g_nMatchMethod, g_nMaxTrackbarNum, on_Matching); 47 on_Matching(0, 0); 48 49 waitKey(0); 50 return 0; 51 52 } 53 54 //-----------------------------------【on_Matching( )函數】-------------------------------- 55 // 描述:回調函數 56 //------------------------------------------------------------------------------------------- 57 void on_Matching(int, void*) 58 { 59 //【1】給局部變量初始化 60 Mat srcImage; 61 g_srcImage.copyTo(srcImage); 62 63 //【2】初始化用於結果輸出的矩陣 64 int resultImage_cols = g_srcImage.cols - g_templateImage.cols+1 ; 65 int resultImage_rows = g_srcImage.rows - g_templateImage.rows +1; 66 g_resultImage.create(resultImage_cols, resultImage_rows, CV_8UC3); 67 68 //【3】進行匹配和標準化→g_srcImage待匹配的源圖像,g_templateImage模板圖像 69 //g_resultImage保存結果的矩陣,咱們能夠經過minMaxLoc() 肯定結果矩陣的最大值和最小值的位置. 70 //g_nMatchMethod模板匹配的算法 71 matchTemplate(g_srcImage, g_templateImage, g_resultImage, g_nMatchMethod); 72 //normalize查找全局最小和最大稀疏數組元素並返回其值及其位置 73 normalize(g_resultImage, g_resultImage, 0, 1, NORM_MINMAX, -1); 74 75 //【4】經過函數 minMaxLoc 定位最匹配的位置 76 double minValue; 77 double maxValue; 78 Point minLocation; 79 Point maxLocation; 80 Point matchLocation; 81 minMaxLoc(g_resultImage, &minValue, &maxValue, &minLocation, &maxLocation, Mat()); 82 83 //【5】對於方法 SQDIFF 和 SQDIFF_NORMED, 越小的數值有着更高的匹配結果. 而其他的方法, 數值越大匹配效果越好 84 if (g_nMatchMethod == CV_TM_SQDIFF || g_nMatchMethod == CV_TM_SQDIFF_NORMED) 85 { 86 matchLocation = minLocation; 87 } 88 else 89 { 90 matchLocation = maxLocation; 91 } 92 93 //【6】繪製出矩形,並顯示最終結果 94 rectangle(srcImage, matchLocation, Point(matchLocation.x + g_templateImage.cols, matchLocation.y + g_templateImage.rows), Scalar(0, 0, 255), 2, 8, 0); 95 rectangle(g_resultImage, matchLocation, Point(matchLocation.x + g_templateImage.cols, matchLocation.y + g_templateImage.rows), Scalar(0, 0, 255), 2, 8, 0); 96 97 imshow(WINDOW_NAME1, srcImage); 98 imshow(WINDOW_NAME2, g_resultImage); 99 100 }
void minMaxLoc(const SparseMat& src, double* minVal, double* maxVal, int* minIdx=0, int* maxIdx=0);
參數1:InputArray類型的src,輸入單通道數組(圖像)。
參數2:double*類型的minVal,返回最小值的指針。若無須返回,此值置爲NULL。
參數3:double*類型的maxVal,返回最大值的指針。若無須返回,此值置爲NULL。
參數4:Point*類型的minLoc,返回最小位置的指針(二維狀況下)。若無須返回,此值置爲NULL。
參數5:Point*類型的maxLoc,返回最大位置的指針(二維狀況下)。若無須返回,此值置爲NULL。
參數6:InputArray類型的mask,用於選擇子陣列的可選掩膜。code