模板匹配

本文介绍了OpenCV库中6种不同的模板匹配方法,包括平方差匹配、归一化平方差匹配、相关性匹配、归一化相关性匹配、相关性系数匹配和归一化相关性系数匹配,并提供了相应的代码示例,展示了如何在C++中进行模板匹配操作,以及如何找到最佳匹配位置并显示结果。
摘要由CSDN通过智能技术生成
模板匹配
1、模板匹配
1.1 介绍

在这里插入图片描述
在这里插入图片描述
opencv中支持的比较方法有6种,分别如下:

  • 1、cv::TM_SQDIFF:该方法使用平方差进行匹配,因此最佳的匹配结果在结果为0处,值越大匹配结果越差。

  • 在这里插入图片描述

  • 2、cv::TM_SQDIFF_NORMED:该方法使用归一化的平方差进行匹配,最佳匹配也在结果为0处。

  • 在这里插入图片描述

  • 3、cv::TM_CCORR:相关性匹配方法,该方法使用源图像与模板图像的卷积结果进行匹配,因此,最佳匹配位置在值最大处,值越小匹配结果越差。

  • 在这里插入图片描述

  • 4、cv::TM_CCORR_NORMED:归一化的相关性匹配方法,与相关性匹配方法类似,最佳匹配位置也是在值最大处。

  • 在这里插入图片描述

  • 5、cv::TM_CCOEFF:相关性系数匹配方法,该方法使用源图像与其均值的差、模板与其均值的差二者之间的相关性进行匹配,最佳匹配结果在值等于1处,最差匹配结果在值等于-1处,值等于0直接表示二者不相关。

  • 在这里插入图片描述

  • 6、cv::TM_CCOEFF_NORMED:归一化的相关性系数匹配方法,正值表示匹配的结果较好,负值则表示匹配的效果较差,也是值越大,匹配效果也好。

  • 在这里插入图片描述

模板匹配api:
在这里插入图片描述
不同匹配方法的值索引:
在这里插入图片描述

2、 代码实现
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

Mat img, tmp, dst;
int method = 1;
void MatchTmp(int, void*);
int main(int argc, char** argv)
{
	img = imread("G:/testpic/img.png");
	tmp = imread("G:/testpic/tmp.png");
	if (!img.data || !tmp.data)
	{
		printf("cannot load the image");
		return -1;
	}

	imshow("src", img);
	imshow("tmp", tmp);

	namedWindow("result", WINDOW_AUTOSIZE);
	createTrackbar("num:", "result", &method, 5, MatchTmp);
	MatchTmp(0,0);

	waitKey(0);
	return 0;
}

void MatchTmp(int, void*)
{
	int width = img.cols - tmp.cols + 1;
	int high = img.rows - tmp.rows + 1;
	Mat result(width, high, CV_32FC1);

	//模板匹配
	matchTemplate(img, tmp, result, method, Mat());
	normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());

	//找最大值最小值点的位置
	double min, max;
	Point minLoc, maxLoc, tmpLoc;
	minMaxLoc(result, &min, &max, &minLoc, &maxLoc);
	if (method == TM_SQDIFF || method == TM_SQDIFF_NORMED)
	{
		tmpLoc = minLoc;
	}
	else
	{
		tmpLoc = maxLoc;
	}

	//画矩形
	img.copyTo(dst);
	rectangle(result, Rect(tmpLoc.x, tmpLoc.y, tmp.cols, tmp.rows), Scalar(0,0,255), 2, LINE_AA);
	rectangle(dst, Rect(tmpLoc.x, tmpLoc.y, tmp.cols, tmp.rows), Scalar(0,0,255), 2, LINE_AA);
	
	imshow("result", result);
	imshow("dst", dst);
}

原图:
在这里插入图片描述
tmp:
在这里插入图片描述
result:
在这里插入图片描述
dst:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值