模板匹配介绍
我们需要2幅图像:
原图像 (I):
在这幅图像里,我们希望找到一块和模板匹配的区域
模板 (T):
将和原图像比照的图像块
-
模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。
-
所以模板匹配首先需要一个模板图像T(给定的子图像)
-
另外需要一个待检测的图像-源图像S
-
工作方法,在带检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。
模板匹配原理
我们的目标是检测最匹配模板的原图像的区域:
为了确定匹配模板区域, 我们不得不滑动模板图像和原图像进行比较 :
对于 模板(T) 覆盖在 原图像 (I) 上的每个位置,你把度量值保存 到 结果图像矩阵 ( R ) 中. 在 R 中的每个位置 (x,y) 都包含匹配度量值:
上图(右)就是
TM_CCORR_NORMED
方法处理后的结果图像 R . 最白的位置代表最高的匹配. 正如您所见, 黑色框住的位置很可能是结果图像矩阵中的最大数值, 所以这个区域 (以这个点为顶点,长宽和模板图像一样大小的矩阵) 被认为是匹配的.
实际上
, 我们使用函数
minMaxLoc
来定位在矩阵 R 中的最大值点 (或者最小值, 根据函数输入的匹配参数) .
void minMaxLoc(InputArray src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray())
-
src:输入图像。
-
minVal:在矩阵 src中存储的最小值,可输入NULL表示不需要。
-
maxVal :在矩阵 src中存储的最大值,可输入NULL表示不需要。
-
minLoc:在结果矩阵中最小值的坐标,可输入NULL表示不需要,Point类型。
-
maxLoc:在结果矩阵中最大值的坐标,可输入NULL表示不需要,Point类型。
-
mask:可选的掩模
模板匹配介绍 – 匹配算法介绍:
OpenCV中提供了六种常见的匹配算法如下:
总结如下:
相关API介绍cv::matchTemplate
matchTemplate(
InputArray image,// 源图像,必须是8-bit或者32-bit浮点数图像
InputArray templ,// 模板图像,类型与输入图像一致
OutputArray result,// 输出结果,必须是单通道32位浮点数,假设源图像WxH,模板图像wxh, 则结果必须为W-w+1, H-h+1的大小。
int method,//使用的匹配方法
InputArray mask=noArray()//(optional)
)
程序代码
#include
#include
using namespace std;
using namespace cv;
// 定义一些全局变量, 例如原图像(img), 模板图像(templ) 和结果图像(result) ,
// 还有匹配方法以及窗口名称:
Mat img, templ, result;
char* image_window = "Source Image";
char* result_window = "Result window";
int match_method = TM_SQDIFF;
int max_Trackbar = 5;
void MatchingMethod( int, void* );
int main( int argc, char** argv )
{
// 1. 载入原图像和模板块
img = imread("E:/Experiment/OpenCV/Pictures/TargetSearch.jpg");
templ = imread("E:/Experiment/OpenCV/Pictures/Target.jpg");
imshow("模板图像",templ);
// 创建窗口
namedWindow( image_window, CV_WINDOW_AUTOSIZE );
namedWindow( result_window, CV_WINDOW_AUTOSIZE );
// 2. 创建滑动条并输入将被使用的匹配方法. 一旦滑动条发生改变,回调函数 MatchingMethod 就会被调用.
char* trackbar_label = "模板匹配方式";
createTrackbar( trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod );
MatchingMethod( 0, 0 );
waitKey(0);
return 0;
}
void