一.写在前面
1模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。
2所以模板匹配首先需要一个模板图像T(给定的子图像)
3另外需要一个待检测的图像-源图像S
4工作方法,在带检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。
二.相关API介绍cv::matchTemplate
matchTemplate(
InputArray image,// 源图像,必须是8-bit或者32-bit浮点数图像
InputArray templ,// 模板图像,类型与输入图像一致
OutputArray result,// 输出结果,必须是单通道32位浮点数,假设源图像WxH,模板图像wxh,
则结果必须为W-w+1, H-h+1的大小。
int method,//使用的匹配方法
InputArray mask=noArray()//(optional)
)
三.代码实现
/*
OpenCV 模板匹配学习
Michael Jiang<sencom1997@outlook.com>
2019年8月1日19:44:52
*/
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
Mat src, temp, img_display, dst;
//读取图像
src = imread("D:/linus.png", IMREAD_COLOR);
//判断读取是否成功
if (src.empty()) {
printf("pic load failed!\n");
return -1;
}
//读取图像
temp = imread("D:/linus_m.png", IMREAD_COLOR);
//判断读取是否成功
if (temp.empty()) {
printf("pic load failed!\n");
return -1;
}
src.copyTo(img_display);
int result_rows = src.rows - temp.rows + 1;
int result_cols = src.cols - temp.cols + 1;
dst.create(Size(result_cols, result_rows), CV_32FC1);
matchTemplate(src,temp,dst,TM_SQDIFF);
normalize(dst, dst, 0, 1, NORM_MINMAX, -1, Mat());
double minVal, maxVal;
Point minLoc, maxLoc, matchLoc;
minMaxLoc(dst, &minVal,&maxVal,&minLoc,&maxLoc,Mat());
matchLoc = minLoc;
rectangle(img_display,matchLoc, Point(matchLoc.x + temp.cols, matchLoc.y + temp.rows), Scalar(0,0,255), 2, LINE_AA);
imshow("temp", temp);
imshow("dst", img_display);
waitKey(0);
return 0;
}