基于OpenCV的模板匹配

模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术。模板匹配不是基于直方图的, 而是通过在输入图像上滑动图像块(模板)同时比对相似度, 来对模板和输入图像进行匹配的一种方法。

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 ------相关匹配法(最好匹配1,越大越匹配)
cv2.TM_CCORR_NORMED ------归一化相关匹配法(最好匹配1,越大越匹配)
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~255
	imwrite("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的模板匹配

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值