1. C/C++

OpenCV-第二十话-模板匹配

一.写在前面

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;
}