opencv学习-模板匹配

Posted 殇堼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv学习-模板匹配相关的知识,希望对你有一定的参考价值。

模板匹配

minMaxLoc函数

功能:从一个矩阵中找出全局的最大值和最小值。

void minMaxLoc( const Mat& src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, const Mat& mask=Mat() );

参数解释
参数1:InputArray类型的src,输入单通道数组(图像)。
参数2:double类型的minVal,返回最小值的指针。若无须返回,此值置为NULL。
参数3:double
类型的maxVal,返回最大值的指针。若无须返回,此值置为NULL。
参数4:Point类型的minLoc,返回最小位置的指针(二维情况下)。若无须返回,此值置为NULL。
参数5:Point
类型的maxLoc,返回最大位置的指针(二维情况下)。若无须返回,此值置为NULL。
参数6:InputArray类型的mask,用于选择子阵列的可选掩膜。

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

Mat src; Mat templ; Mat result;
char* src_window = "【输入图像】";
char* result_window = "【结果窗口】";

int match_method;
int max_Trackbar = 5;

// 函数声明
void MatchingMethod(int, void*);

int main()
{
	src = imread("D:/images/lena.png");
	templ = imread("D:/images/template.png");
	if (!src.data || !templ.data)
	{
		cout << "could not load image !";
		return -1;
	}

	// 创建窗口
	namedWindow(src_window, WINDOW_AUTOSIZE);
	namedWindow(result_window, WINDOW_AUTOSIZE);

	imshow(src_window, src);

	// 创建滑动条
	char* trackbar_label = "Method";
	createTrackbar(trackbar_label, src_window, &match_method, max_Trackbar, MatchingMethod);

	MatchingMethod(0, 0);

	waitKey(0);
	return 0;
}

void MatchingMethod(int, void*)
{
	// 将被显示的原图像
	Mat src_display;
	src.copyTo(src_display);

	// 创建输出结果的矩阵,32为浮点数
	int result_cols = src.cols - templ.cols + 1;
	int result_rows = src.rows - templ.rows + 1;
	result.create(result_cols, result_rows, CV_32FC1);

	// 进行匹配和标准化
	matchTemplate(src, templ, result, match_method);
	normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());//归一化

	// 通过函数 minMaxLoc 定位最匹配的位置
	double minVal; double maxVal;
	Point minLoc; Point maxLoc;
	Point matchLoc;

	minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());

	// 对于方法 SQDIFF 和 SQDIFF_NORMED, 越小的数值代表更高的匹配结果. 而对于其他方法, 数值越大匹配越好
	if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED)
	{
		matchLoc = minLoc;
	}
	else
	{
		matchLoc = maxLoc;
	}

	rectangle(src_display, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar(0, 0, 255), 2, 8, 0);
	rectangle(result, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar(0, 0, 255), 2, 8, 0);

	imshow(src_window, src_display);
	imshow(result_window, result);

	return;
}

简化

#include<opencv2\\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;

int main() {
	Mat img, temp, output;
	img = imread("D:/images/lena.png");
	temp = imread("D:/images/template.png");
	if (img.empty() || temp.empty()) {
		print("请确认是图像输入是否存在");
		return -1;
	}
	//模板匹配
	matchTemplate(img, temp, output, TM_CCOEFF_NORMED);
	//寻找匹配结果中的最大和最小值以及坐标位置
	double minval, maxval;
	Point minLoc, maxLoc;
	minMaxLoc(output, &minval, &maxval, &minLoc, &maxLoc);

	//绘制最佳匹配区域
	rectangle(img,Rect(minLoc.x,maxLoc.y,temp.cols,temp.rows),Scalar(0,0,255),1,4);

	imshow("原图",img);
	imshow("模板", temp);
	imshow("模板匹配后", output);
	waitKey(0);
	return 0;
}

以上是关于opencv学习-模板匹配的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV中一种尺度不变的模板匹配方案

opencv学习之路(21)模板匹配及应用

opencv学习-模板匹配

opencv学习记录之模板匹配

Android 中的 OpenCV 模板匹配示例

OpenCV模板匹配参数