OpenCV-模板匹配cv::matchTemplate

作者:翟天保Steven
版权声明:版权归作者所有。如需商业转载,请联系作者授权。非商业转载请注明出处

函数原型

void matchTemplate( InputArray image, InputArray templ,OutputArray result, int method, InputArray mask = noArray());

参数说明

  1. InputArray类型的image,输入图像。
  2. InputArray类型的templ,待匹配图像。
  3. OutputArray类型的result,输出匹配结果。
  4. int类型的method,匹配方法,具体介绍见下方。
  5. InputArray类型的mask,掩膜。

匹配方法介绍

模板匹配函数中自带了6种匹配方法,其原理是以原图某点为起始点,选择模板同大小的区域进行计算,根据得到的结果选择最优的解,所以当你使用该函数时会发现,假如原图1000*1000,模板100*100,那结果图尺寸为900*900,各方法对应的公式和原理如下所示。

1.CV_TM_SQDIFF,平方差匹配法。得到的数值越小,说明越匹配。

R(x, y)=\sum(I(x+m, y+n)-T(m, n))^{2}

2.CV_TM_SQDIFF_NORMED,归一化平方差匹配法。得到的数值越小,说明越匹配。

R(x, y)=\frac{\sum(I(x+m, y+n)-T(m, n))^{2}}{\sqrt{\sum T(m, n)^{2} \sum I(x+m, y+n)^{2}}}

3.CV_TM_CCORR,相关匹配法。得到的数值越大,说明越匹配。该方法容易受背景干扰。

R(x, y)=\sum(I(x+m, y+n) \cdot T(m, n))

4.CV_TM_CCORR_NORMED,归一化相关匹配法。得到的数值越大,说明越匹配。该方法容易受背景干扰。

R(x, y)=\frac{\sum(I(x+m, y+n) \cdot T(m, n))}{\sqrt{\sum T(m, n)^{2} \sum I(x+m, y+n)^{2}}}

5.CV_TM_CCOEFF,相关系数法,也是零均值互相关法,将均值减去后,再计算相关性。得到的数值越大,说明越匹配。该方法应用性较优。

R(x, y)=\sum((I(x+m, y+n)-\bar{I}) \cdot(T(m, n)-\bar{T}))

6.CV_TM_CCOEFF_NORMED,归一化相关系数法。得到的数值越大,说明越匹配。该方法应用性较优。

R(x, y)=\frac{\sum((I(x+m, y+n)-\bar{I}) \cdot(T(m, n)-\bar{T}))}{\sqrt{\sum(T(m, n)-T)^{2} \sum(I(x+m, y+n)-I)^{2}}}

测试代码

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

using namespace cv;
using namespace std;

int main()
{
	cv::Mat src = imread("test1.jpg");
	cv::Mat sample = imread("t.png");
	// 匹配
	cv::Mat result;
	matchTemplate(src, sample, result, CV_TM_CCOEFF);
	// 归一化
	normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());
	// 获取最小值
	double minValue; double maxValue; Point minLocation; Point maxLocation;
	Point matchLocation;
	minMaxLoc(result, &minValue, &maxValue, &minLocation, &maxLocation, Mat());
	matchLocation = maxLocation;
	// 框选结果
	cv::Mat draw = src.clone();
	rectangle(draw, matchLocation, Point(matchLocation.x + sample.cols, matchLocation.y + sample.rows), Scalar(255, 0, 0), 2, 8, 0);
	
	imshow("src", src);
	imshow("sample", sample);
	imshow("draw", draw);
	waitKey(0);
	return 0;
}

测试效果

OpenCV-模板匹配cv::matchTemplate图1 原图

OpenCV-模板匹配cv::matchTemplate图2 待检测目标

OpenCV-模板匹配cv::matchTemplate图3 检测结果

如果文章对你有帮助,可以给我点个赞告诉我,我会很开心的~加油!

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2022年3月24日 上午11:38
下一篇 2022年3月24日 上午11:57

相关推荐