matchTemplate
函数是用来比较模板图片和目标图片之间的相似度,它返回的是一副灰度图像,其每个像素值表示模板在对应位置和尺度上与目标图像的匹配程度。
模板匹配API:
void matchTemplate (InputArray image,
InputArray templ,
OutputArray result,
int method,
InputArray mask = noArray() )
参数解析:
InputArray image:需要进行模板匹配的目标图像,它必须是8-bit 或32-bit的浮点型;
InputArray templ:模板图像,尺寸不能大于目标图像且类型要相同;
OutputArray result:对比的结果图像,如果目标图像尺寸大小是W x H,模板图像是w x h,那么结果图像的大小是W-w+1 x H-h+1 且它的类型是32-bit的浮点型;
int method:
- TM_SQDIFF:平方差匹配
- TM_SQDIFF_NORMED:归一化平方差匹配
- TM_CCORR:相关匹配
- TM_CCORR_NORMED:归一化相关匹配
- TM_CCOEFF:相关系数匹配
- TM_CCOEFF_NORMED:归一化相关系数匹配
扩展:
当待匹配区域的颜色比模板颜色亮时,使用 TM_SQDIFF
模式可以得到更好的匹配效果;而当待匹配区域与模板之间存在遮挡或者镜像反转等情况时,TM_CCOEFF
模式可能更适合。
InputArray mask = noArray() :掩膜,不使用模板为Mat();
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
Mat soure_image = imread("C:/picture/hepingjingying.jpg");
Mat template_image = imread("C:/picture/player01.jpg");
int match_method = CV_TM_SQDIFF;
int max_track = 5;
void Math_demo(int, void*);
int main(int argc, char** agcv)
{
if (soure_image.empty()||template_image.empty())
{
std::cout << "Could not load image !";
return -1;
}
namedWindow("result image",CV_WINDOW_AUTOSIZE);
createTrackbar("Match Algo Type","result image",&match_method,max_track,Math_demo);
Math_demo(0, 0);
waitKey();
return 0;
}
void Math_demo(int pos, void* userdata)
{
Mat result_image;
matchTemplate(soure_image, template_image, result_image, match_method, Mat());
normalize(result_image, result_image, 0, 1, NORM_MINMAX, -1, Mat());
Point minLoc, maxLoc,temLoc;
double min, max;
minMaxLoc(result_image, &min, &max, &minLoc, &maxLoc,Mat());
if (match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED)
temLoc = minLoc;
else
temLoc = maxLoc;
rectangle(soure_image, Rect(temLoc.x, temLoc.y, template_image.cols, template_image.rows), Scalar(0, 0, 255), 2, 0);
imshow("result image", result_image);
namedWindow("source image", CV_WINDOW_AUTOSIZE);
imshow("source image", soure_image);
}