模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术。模板匹配不是基于直方图的, 而是通过在输入图像上滑动图像块(模板)同时比对相似度, 来对模板和输入图像进行匹配的一种方法。
image: 待搜索图像(大图)
templ: 搜索模板, 需和原图一样的数据类型且尺寸不能大于源图像
result: 比较结果的映射图像, 其必须为单通道, 32位浮点型图像, 如果原图(待搜索图像)尺寸为W x H, 而templ尺寸为 w x h, 则result尺寸一定是(W-w+1)x(H-h+1)
method: 指定的匹配方法, 有如下6种:
cv2.TM_SQDIFF ------平方差匹配法(最好匹配0)
cv2.TM_SQDIFF_NORMED ------归一化平方差匹配法(最好匹配0)
cv2.TM_CCORR ------相关匹配法(最坏匹配0)
cv2.TM_CCORR_NORMED ------归一化相关匹配法(最坏匹配0)
cv2.TM_CCOEFF ------系数匹配法(最好匹配1)
cv2.TM_CCOEFF_NORMED ------归一化相关系数匹配法(最好匹配1)
#include <iostream>
#include <opencv2/opencv.hpp>int main()
{std::cout << "Hello World!\n";cv::Mat image = imread("test.png", cv::IMREAD_COLOR);cv::Mat templateImage = imread("template.png", cv::IMREAD_COLOR);int result_cols = image.cols - templateImage.cols + 1;int result_rows = image.rows - templateImage.rows + 1;cv::Mat result = cv::Mat(result_cols, result_rows, CV_32FC1);cv::matchTemplate(image, templateImage, result, cv::TM_SQDIFF_NORMED); // 模板匹配cv::Mat res8U;result.convertTo(res8U, CV_8U, 255.0); // 32F转化为8U,即0~1转化为0~255imwrite("result.bmp", res8U);double minVal, maxVal;cv::Point minLoc, maxLoc, matchLoc;cv::minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());std::cout << "minValue: " << minVal << std::endl;std::cout << "maxValue: " << maxVal << std::endl;matchLoc = minLoc;cv::rectangle(image, cv::Rect(matchLoc, cv::Size(templateImage.cols, templateImage.rows)), Scalar(0, 0, 255), 2, 8, 0);imwrite("match.bmp", image);return 0;
}
模板图片和搜索图片:

相关系数图片和匹配结果图片:

参考:opencv模板匹配_wcc8848的博客-CSDN博客_基于opencv的模板匹配















