《OpenCV3编程入门》学习笔记9 直方图与匹配(五)模板匹配
9.5 模板匹配
基本思想:
??在一幅圖像中尋找與另一幅模板圖像最匹配的部分,通過在輸入圖像上滑動圖像塊,對實際的圖像塊和輸入圖像進行匹配。
9.5.1 模板匹配:matchTemplate()函數
1.作用:
??匹配出和模板重疊的圖像區域
2.函數原型:
void matchTemplate(InputArray image, InputArray templ, OuputArray result, int method)
3.參數說明:
(1)帶搜索圖像,8位或32位浮點型
(2)搜索模板,與原圖像數據類型相同,尺寸不大于原圖像
(3)比較結果的映射圖像,單通道32位浮點型圖像,如果圖像尺寸為W*H,而templ尺寸為w*h,則參數一定為(W-w+1)*(H-h+1).
(4)指定的匹配方法,6種方法越來越準確,計算量越來越大:
??1)平方差匹配法 method=TM_SQDIFF
????匹配越差,匹配值越大,最好匹配為0
????????????????
??2)歸一化平方差匹配法 method=TM_SQDIFF_NORMED
??????????????
??3)相關匹配法 method=TM_CCORR
????采用模板和圖像間的乘法操作,較大的數表示匹配程度較高,最壞匹配為0
????????????????
??4)歸一化相關匹配法 method=TM_CCORR_NORMED
?????????????
??5)系數匹配法 method=TM_CCOEFF
????將模板對其均值的相對值與圖像對其均值的相關值進行匹配,1表示完美匹配,-1表示糟糕匹配,0表示無相關性(隨機序列)
????????????????
????其中:
???????????????
???????????
??6)歸一化相關系數匹配法 method=TM_CCOEFF_NORMED
??????????????
9.5.2 綜合示例
/*程序說明:模板匹配,滑動條選擇匹配方法
*/
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
//定義輔助宏
#define WINDOW_NAME1 "【原始圖窗口】"
#define WINDOW_NAME2 "【效果圖窗口】"
//全局變量
Mat g_srcImage, g_templateImage, g_dstImage;
int g_nMatchmethod;
int g_nMaxTrackbarNum = 5;
//全局函數
void on_Matching(int, void*);
void ShowHelpText();int main()
{//顯示幫助文字ShowHelpText();//載入原圖和模板塊g_srcImage = imread("1.jpg", 1);g_templateImage = imread("2.jpg", 1);//創建窗口namedWindow(WINDOW_NAME1, WINDOW_AUTOSIZE);namedWindow(WINDOW_NAME2, WINDOW_AUTOSIZE);//創建滑動條并初始化createTrackbar("方法", WINDOW_NAME1, &g_nMatchmethod, g_nMaxTrackbarNum, on_Matching);on_Matching(0, 0);waitKey(0);return 0;
}
void on_Matching(int, void*)
{//[【1】給局部變量初始化Mat srcImage;g_srcImage.copyTo(srcImage);//【2】初始化用于結果輸出的矩陣int dstImage_cols = g_srcImage.cols - g_templateImage.cols + 1;int dstImage_rows = g_srcImage.rows - g_templateImage.rows + 1;g_dstImage.create(dstImage_cols, dstImage_rows, CV_32FC1);//【3】進行匹配和標準化matchTemplate(g_srcImage, g_templateImage, g_dstImage, g_nMatchmethod);normalize(g_dstImage, g_dstImage, 0, 1, NORM_MINMAX, -1, Mat());//【4】通過函數minMaxLoc定位最匹配的位置double minValue, maxValue;Point minLocation, maxLocation, matchLocation;minMaxLoc(g_dstImage, &minValue, &maxValue, &minLocation, &maxLocation, Mat());//【5】對于方法SQDIFF和SQDIFF_NORMED,越小的數值匹配越好,而其余方法數值越大匹配越好if (g_nMatchmethod == TM_SQDIFF || g_nMatchmethod == TM_SQDIFF_NORMED){matchLocation = minLocation;}else{matchLocation = maxLocation;}//【6】繪制矩形,顯示結果rectangle(srcImage, matchLocation, Point(matchLocation.x + g_templateImage.cols, matchLocation.y + g_templateImage.rows), Scalar(0, 0, 255), 2, 8, 0);rectangle(g_dstImage, matchLocation, Point(matchLocation.x + g_templateImage.cols, matchLocation.y + g_templateImage.rows), Scalar(0, 0, 255), 2, 8, 0);imshow(WINDOW_NAME1, srcImage);imshow(WINDOW_NAME2, g_dstImage);
}
void ShowHelpText()
{printf("\n\t歡迎來到【模板匹配】示例程序~\n");printf("\n\t請調整滑動條觀察圖像效果\n");printf("\n\t滑動條對應的方法數值說明:\n");printf("\t\t方法【0】- 平方差匹配法(TM_SQDIFF)\n");printf("\t\t方法【1】- 歸一化平方差匹配法(TM_SQDIFF_NORMED)\n");printf("\t\t方法【2】- 相關匹配法(TM_CCORR)\n");printf("\t\t方法【3】- 歸一化相關匹配法(TM_CCORR_NORMED)\n");printf("\t\t方法【4】- 系數匹配法(TM_CCOEFF)\n");printf("\t\t方法【5】- 歸一化相關系數匹配法(TM_CCOEFF_NORMED)\n");
}
運行效果:
總結
以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记9 直方图与匹配(五)模板匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上海欢乐谷飞行影院一次多少时间
- 下一篇: 《OpenCV3编程入门》学习笔记10