OpenCV-学习历程27 - 模板匹配(Template Match)

OPENCV系列博客主要记录自己学习OPENCV的历程,以及存储已经实现的代码,以备后续回顾使用,代码中包含了主要的备注。

 一.模板匹配原理:  (实际上就是使用模板图片,在目标图像中,寻找与模板图片最为相似的地方)

 

 二. 模板匹配相关API(建议使用归一化的方法)

 

 二. 代码实现

#include <opencv2/opencv.hpp>
#include <iostream>

#include <math.h>
using namespace std;
using namespace cv;

/*This project is to do the template matching in OpenCV learning*/

Mat src,temp,dst;
int match_method = TM_SQDIFF;
int max_track = 5;								//用于指定trackbar的范围

const char* INPUT_T  = "input image" ;		    //设定图片窗口名称
const char* OUTPUT_T = "Output image";
const char* match_T = "Matching image";
const char* TEMP_T = "Template image";

void Match_Demo(int,void*);					   // 声明Matching子函数

int main(int argc, char**argv) {
	//Step1  读取并显示原始图片,Temp图像
	src = imread("E:/OpenCVLearning/Project/source_image/sample.jpg");
	temp = imread("E:/OpenCVLearning/Project/source_image/temp.jpg");

	if (src.empty() || temp.empty()) {
		printf("could not load image...\n");
		return -1;
		}
	namedWindow(INPUT_T,CV_WINDOW_AUTOSIZE);
	namedWindow(TEMP_T, CV_WINDOW_AUTOSIZE);
	imshow(INPUT_T,src);
	imshow(TEMP_T,temp);

	//Step2 创建trackbar并且,根据bar的数值不同,选取模板匹配的方法
	namedWindow(OUTPUT_T, CV_WINDOW_AUTOSIZE);
	const char* trackbar_title = "Matching Method";
	createTrackbar(trackbar_title, OUTPUT_T, &match_method, max_track,Match_Demo);  //(trackbar名称,trackbar所在窗口,方法,极大值,执行子函数名)
	Match_Demo(0, 0);

	waitKey(0);
	return 0;
}

void Match_Demo(int, void*) {
	int width = src.cols - temp.cols + 1;
	int height = src.rows - temp.rows + 1; //指定输出长宽的值
	 
	Mat result(width,height,CV_32FC1);     //注意,输出值必须为32位Float

	matchTemplate(src,temp,result,match_method,Mat()); //匹配模板函数  --> 注意match_method是trackbar指定的参数
	normalize(result, result,0,1,NORM_MINMAX,-1,Mat()); //g归一化

	Point minLoc;      //Min location
	Point maxLoc;	   //Max location

	double min, max;
	src.copyTo(dst);  //将原图复制一份到dst以便于显示重叠位置


	Point temLoc;

	minMaxLoc(result,&min,&max,&minLoc,&maxLoc,Mat());                    //查找匹配区域的最大和最小坐标,并保存
	if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED) {  //不同匹配方法,匹配的位置:最大值和最小值
		temLoc = minLoc;
	}
	else {
		temLoc = maxLoc;											     //确定矩形中间位置
	}
	rectangle(dst,Rect(temLoc.x,temLoc.y, temp.cols,temp.rows),Scalar(0,0,255),2,8);				//将矩形绘制在输出图像中
	rectangle(result, Rect(temLoc.x, temLoc.y, temp.cols, temp.rows), Scalar(0, 0, 255), 2, 8);

	imshow(OUTPUT_T,result);
	imshow(match_T, dst);
}

.运行效果

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值