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);
}
三.运行效果