函数原型
void matchTemplate( InputArray image, InputArray templ,OutputArray result, int method, InputArray mask = noArray());
参数说明
- InputArray类型的image,输入图像。
- InputArray类型的templ,待匹配图像。
- OutputArray类型的result,输出匹配结果。
- int类型的method,匹配方法,具体介绍见下方。
- InputArray类型的mask,掩膜。
匹配方法介绍
模板匹配函数中自带了6种匹配方法,其原理是以原图某点为起始点,选择模板同大小的区域进行计算,根据得到的结果选择最优的解,所以当你使用该函数时会发现,假如原图1000*1000,模板100*100,那结果图尺寸为900*900,各方法对应的公式和原理如下所示。
1.CV_TM_SQDIFF,平方差匹配法。得到的数值越小,说明越匹配。
2.CV_TM_SQDIFF_NORMED,归一化平方差匹配法。得到的数值越小,说明越匹配。
3.CV_TM_CCORR,相关匹配法。得到的数值越大,说明越匹配。该方法容易受背景干扰。
4.CV_TM_CCORR_NORMED,归一化相关匹配法。得到的数值越大,说明越匹配。该方法容易受背景干扰。
5.CV_TM_CCOEFF,相关系数法,也是零均值互相关法,将均值减去后,再计算相关性。得到的数值越大,说明越匹配。该方法应用性较优。
6.CV_TM_CCOEFF_NORMED,归一化相关系数法。得到的数值越大,说明越匹配。该方法应用性较优。
测试代码
#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; }
测试效果
图1 原图
图2 待检测目标
图3 检测结果
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!