引言
使用常见的SIFT、SURF等基于特征的方法进行图像拼接,在特征匹配、以及图像配准环节只有图像重叠区域的特征点起作用,非重叠区域会造成大量的冗余,增加特征点提取、匹配过程的计算量。通过提取图像的重叠区域,只在重叠区域进行计算可以降低计算量,提高算法的效率。
可以通过模板匹配法或者相位相关法获取图像的重叠区域,本文将介绍模板匹配法,相位相关法后续也会介绍,代码语言为c++。
matchTemplate函数参数详解
void cv::matchTemplate (
InputArray image,
InputArray templ,
OutputArray result,
int method,
InputArray mask=noArray()
);
该方法通过遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目
image
用于搜索的输入图像(原图), 8U 或 32F。
templ
用于匹配的模板(匹配图),和image类型相同
result
用于存储匹配之后的位置信息(结果),图像为单通道32F类型,图像的大小(W−w+1)×(H−h+1) 其中W、H分别为image的宽高,w、h为temple的宽和高
method
用于指定模板匹配的方法,opencv一共提供了六种模板匹配的方法。
enum cv::TemplateMatchModes {
cv::TM_SQDIFF = 0,
cv::TM_SQDIFF_NORMED = 1,
cv::TM_CCORR = 2,
cv::TM_CCORR_NORMED = 3,
cv::TM_CCOEFF = 4,
cv::TM_CCOEFF_NORMED = 5
}
mask
模板的掩膜,和templ的类型相同,只有TM_SQDIFF 、 TM_CCORR_NORMED两种方法支持,默认为空(无掩膜)
使用实战
目的是在image图像中找到templ末班对应的区域
image templ
代码
Mat src = imread("E:/imgStitch/images/s1.png", 1);//输入图像
Mat templ = imread("E:/imgStitch/images/t1.png", 1);//待匹配模板
double minVal; double maxVal; Point minLoc; Point maxLoc;
Point matchLoc;
Mat ftmp;
//最后一个参数代表选用的方法
matchTemplate(src, templ, ftmp, 0);
normalize(ftmp, ftmp, 1, 0, NORM_MINMAX);
minMaxLoc(ftmp, &minVal, &maxVal, &minLoc, &maxLoc);
//选择不同的匹配方法,并根据不同的方法找到最佳匹配点,绘制模板区域
rectangle(src, Rect(minLoc.x, minLoc.y, templ.cols, templ.rows), 1, 8, 0);
//rectangle(src, Rect(maxLoc.x, maxLoc.y, templ.cols, templ.rows), 1, 8, 0);
imshow("result", src);
结果展示
本文仅展示TM_SQDIFF 、TM_SQDIFF_NORMED 两种方法,其余方法只需改动对应的输入参数,即method的参数,个方法的对应关系参考matchTemplate函数参数详解部分,根据自己的实验结果选取合适的方法。
TM_SQDIFF
matchTemplate(src, templ, ftmp, 0);
TM_SQDIFF_NORMED
matchTemplate(src, templ, ftmp, 1);