花老湿学习OpenCV:模板匹配

引言:

模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域,所以模板匹配首先需要一个模板图像T(给定的子图像)和一个待检测的图像-源图像S。

工作过程相当于令模板图像在待检测图像上,从左到右,从上向下移动,然后计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。

API: 

代码示例

#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int matchmethod = 0;
void Match_demo(int pos, void* userdata);

Mat src;
Mat temp;
int main()
{
	//待检测图像
	src = imread("F:\\visual studio\\Image\\bird.jpg");
	if (src.empty())
	{
		cout << "Can't load the image" << endl;
		return -1;
	}
	//模板图像
	temp = imread("F:\\visual studio\\Image\\template.jpg");
	if (src.empty())
	{
		cout << "Can't load the image" << endl;
		return -1;
	}
	imshow("template", temp);

	namedWindow("MatchResult", WINDOW_AUTOSIZE);
	createTrackbar("Match method", "MatchResult", &matchmethod, 5, Match_demo);
	Match_demo(0, 0);
	waitKey(0);
}


void Match_demo(int pos, void* userdata)
{
	//匹配结果图像的建立
	int matchImage_h = src.rows - temp.rows + 1;
	int matchImage_w = src.cols - temp.cols + 1;
	Mat matchResult(matchImage_h, matchImage_w, CV_32FC1);
	
	//模板匹配
	matchTemplate(src, temp, matchResult, matchmethod, Mat());
	//归一化
	normalize(matchResult, matchResult, 0, 1, NORM_MINMAX);

	//找到最值 即为匹配点
	double minVal;
	double maxVal;
	Point minLoc;
	Point maxLoc;
	minMaxLoc(matchResult, &minVal, &maxVal, &minLoc, &maxLoc);

	//cv::TM_SQDIFF(方差匹配方法),完全匹配为0,不匹配会返回较大值
	//cv::TM_SQDIFF_NORMED(归一化方差匹配方法),完全匹配会返回0
	//cv::TM_CCORR(相关性匹配方法),完全匹配会返回一个很大的值
	//cv::TM_CCORR_NORMED(归一化的互相关匹配方法),完全匹配返回较大值,不匹配返回0
	//cv::TM_CCOEEF(相关系数匹配方法),完全匹配会得到1,完全误匹配为-1,0表示无任何关联
	//cv::TM_CCOEEF_NORMED(归一化的相关系数匹配方法),好的匹配得到正值,误匹配得到负值
	Point matchLoc;
	if (matchmethod == CV_TM_SQDIFF || matchmethod == CV_TM_SQDIFF_NORMED)
	{
		matchLoc = minLoc;
	}
	else
	{
		matchLoc = maxLoc;
	}
	
	//绘制匹配点
	rectangle(matchResult, Rect(matchLoc.x, matchLoc.y, temp.cols, temp.rows), Scalar(0, 0, 255), 2, LINE_AA);
	
	Mat dst;
	src.copyTo(dst);
	rectangle(dst, Rect(matchLoc.x, matchLoc.y, temp.cols, temp.rows), Scalar(0, 0, 255), 2, LINE_AA);

	imshow("MatchResult", matchResult);
	imshow("dst", dst);
}

效果如下:

模板图像

 

 仅展示2种方法的匹配效果:

 

 相关性匹配方法误差很大,也不知道是不是我不会用...有人明白的话欢迎评论

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值