模板匹配
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: