引言:
模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域,所以模板匹配首先需要一个模板图像T(给定的子图像)和一个待检测的图像-源图像S。
工作过程相当于令模板图像在待检测图像上,从左到右,从上向下移动,然后计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。
API:
代码示例
#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int matchmethod = 0;
void Match_demo(int pos, void* userdata);
Mat src;
Mat temp;
int main()
{
//待检测图像
src = imread("F:\\visual studio\\Image\\bird.jpg");
if (src.empty())
{
cout << "Can't load the image" << endl;
return -1;
}
//模板图像
temp = imread("F:\\visual studio\\Image\\template.jpg");
if (src.empty())
{
cout << "Can't load the image" << endl;
return -1;
}
imshow("template", temp);
namedWindow("MatchResult", WINDOW_AUTOSIZE);
createTrackbar("Match method", "MatchResult", &matchmethod, 5, Match_demo);
Match_demo(0, 0);
waitKey(0);
}
void Match_demo(int pos, void* userdata)
{
//匹配结果图像的建立
int matchImage_h = src.rows - temp.rows + 1;
int matchImage_w = src.cols - temp.cols + 1;
Mat matchResult(matchImage_h, matchImage_w, CV_32FC1);
//模板匹配
matchTemplate(src, temp, matchResult, matchmethod, Mat());
//归一化
normalize(matchResult, matchResult, 0, 1, NORM_MINMAX);
//找到最值 即为匹配点
double minVal;
double maxVal;
Point minLoc;
Point maxLoc;
minMaxLoc(matchResult, &minVal, &maxVal, &minLoc, &maxLoc);
//cv::TM_SQDIFF(方差匹配方法),完全匹配为0,不匹配会返回较大值
//cv::TM_SQDIFF_NORMED(归一化方差匹配方法),完全匹配会返回0
//cv::TM_CCORR(相关性匹配方法),完全匹配会返回一个很大的值
//cv::TM_CCORR_NORMED(归一化的互相关匹配方法),完全匹配返回较大值,不匹配返回0
//cv::TM_CCOEEF(相关系数匹配方法),完全匹配会得到1,完全误匹配为-1,0表示无任何关联
//cv::TM_CCOEEF_NORMED(归一化的相关系数匹配方法),好的匹配得到正值,误匹配得到负值
Point matchLoc;
if (matchmethod == CV_TM_SQDIFF || matchmethod == CV_TM_SQDIFF_NORMED)
{
matchLoc = minLoc;
}
else
{
matchLoc = maxLoc;
}
//绘制匹配点
rectangle(matchResult, Rect(matchLoc.x, matchLoc.y, temp.cols, temp.rows), Scalar(0, 0, 255), 2, LINE_AA);
Mat dst;
src.copyTo(dst);
rectangle(dst, Rect(matchLoc.x, matchLoc.y, temp.cols, temp.rows), Scalar(0, 0, 255), 2, LINE_AA);
imshow("MatchResult", matchResult);
imshow("dst", dst);
}
效果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/170d39528a952703a2b7c29e8010f04f.png)
仅展示2种方法的匹配效果:
相关性匹配方法误差很大,也不知道是不是我不会用...有人明白的话欢迎评论