1、模板匹配原理
模板匹配是从源图像中找出一个特定特征的区域图像。
主要算法:
(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
2、模板匹配函数
void matchTemplate
( InputArray image, // 8Bit或32B
it浮点的位图
InputArray templ,// 与源图的数据类型相同,大小必须比源小。
OutputArray result,
int method, // 匹配方法
InputArray mask = noArray()
);
3、源代码
int w = srcImg1.cols - tempalteImg.cols + 1;
int h = srcImg1.rows - tempalteImg.rows + 1;
Mat result(w, h, CV_32FC1);
matchTemplate(srcImg1, tempalteImg, result, template_method);
normalize(result, result, 1, 0, NORM_MINMAX);
Point minPos;
Point maxPos;
double minVal;
double maxVal;
minMaxLoc(result, &minVal, &maxVal, &minPos, &maxPos);
Mat dest;
srcImg1.copyTo(dest);
Point Pos = maxPos;
if (template_method == CV_TM_SQDIFF || template_method == CV_TM_CCORR_NORMED)
{
Pos = minPos;
}
char* method_name[] =
{
"CV_TM_SQDIFF",
"CV_TM_SQDIFF_NORMED",
"CV_TM_CCORR",
"CV_TM_CCORR_NORMED",
"CV_TM_CCOEFF",
"CV_TM_CCOEFF_NORMED",
};
rectangle(dest, Rect(minPos.x, minPos.y, tempalteImg.cols, tempalteImg.rows), Scalar(0,0,255));
putText(dest,
method_name[template_method],
Point(20, 40),
1,
2.0,
Scalar(0, 0, 255),
2
);
imshow("template", dest);
4、工程项目源码下载
本文源码在Debug–x64下编译
ZIP包中包含源开发环境,下载解压后可直接编译运行
下载源码