[TOC]

概述

文章参考:https://blog.csdn.net/guduruyu/article/details/69231259

概述

模板匹配通常被用于目标检测、相似度分析中,opencv2和opencv3中提供了一个专门用于模板匹配的函数——cv::matchTemplate(),下面就对该函数进行详细的介绍。

先从一个实际的例子入手,如下分别是一幅测试图片和一个右眼的模板图片(这里为了方便,是直接从原图上切下来的),通过模板匹配的方法找到测试图片眼睛的位置。
img

img

测试代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <opencv2/opencv.hpp>

int main()
{
//加载源图像和模板图像
cv::Mat image_source = cv::imread("lena.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat image_template = cv::imread("template.jpg", cv::IMREAD_GRAYSCALE);

cv::Mat image_matched;

//模板匹配
cv::matchTemplate(image_source, image_template, image_matched, cv::TM_CCOEFF_NORMED);

double minVal, maxVal;
cv::Point minLoc, maxLoc;
//寻找最佳匹配位置
cv::minMaxLoc(image_matched, &minVal, &maxVal, &minLoc, &maxLoc);

cv::Mat image_color;
cv::cvtColor(image_source, image_color, CV_GRAY2BGR);
cv::circle(image_color,
cv::Point(maxLoc.x + image_template.cols/2, maxLoc.y + image_template.rows/2),
20,
cv::Scalar(0, 0, 255),
2,
8,
0);

cv::imshow("source image", image_source);
cv::imshow("match result", image_matched);
cv::imshow("target", image_color);
cv::waitKey(0);

return 0;
}

从测试代码中可以看出cv::matchTemplate()的具体调用方法如下:

1
2
3
4
5
6
void cv::matchTemplate(
cv::InputArray image, // 用于搜索的输入图像, 8U 或 32F, 大小 W-H
cv::InputArray templ, // 用于匹配的模板,和image类型相同, 大小 w-h
cv::OutputArray result, // 匹配结果图像, 类型 32F, 大小 (W-w+1)-(H-h+1)
int method // 用于比较的方法
);

该函数第一个参数是源图像,第二个参数是模板图像,第三个参数是匹配的结果图像,第四个参数是用于指定比较的方法。