Opencv 学习笔记(六)模板匹配

菜鸟一枚,
这是我的第六个博客,
刚刚入门opencv,
想将自己的学习过程分享给大家!!!
代码:

#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>    //Opencv highgui 模块
#include <opencv2/imgproc/imgproc.hpp>    //Opencv 图像处理头文件

using namespace cv;

#define WINDOW_NAME1 "原始图片"
#define WINDOW_NAME2 "效果窗口"

Mat src;
Mat result;
Mat temp;

int numethod;

void matching(int, void*);

int main()
{
	src = imread("D:/opencv/opencvSRC/动物合集.jpg");   //载入待检测图
	temp = imread("D:/opencv/opencvSRC/动物合集之一.jpg");   //载入模板图

	namedWindow(WINDOW_NAME1, CV_WINDOW_AUTOSIZE);
	namedWindow(WINDOW_NAME2, CV_WINDOW_AUTOSIZE);
	imshow("模板",temp);
	createTrackbar("方法", WINDOW_NAME1, &numethod, 5, matching);   //创建方法滑动条

	matching(0, 0);

	waitKey(0);
	return 0;
}

void matching(int,void*)
{

	Mat dst;
	src.copyTo(dst);
	int width = src.cols - temp.cols + 1;
	int height= src.rows - temp.rows + 1;
	Mat result(height, width, CV_32FC1);   //规定结果必须是这种形式

	matchTemplate(src, temp, result, numethod);    //进行模板匹配
	normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());  //结果需要进行归一化

	Point minloc;     
	Point maxloc;
	
	double max;
	double min;

	Point matchloc;
	minMaxLoc(result, &min, &max, &minloc, &maxloc, Mat());   //定位最佳匹配位置


    //对于方法SQDIFF和SQDIFF_NORMED,越小数值有着越高的匹配结果,而其余方法,数值越大有着更高的匹配结果
	if (numethod == TM_SQDIFF || numethod == TM_SQDIFF_NORMED)    
	{
		matchloc = minloc;
	}
	else
	{
			matchloc = maxloc;
	}
	rectangle(dst, Rect(matchloc.x,matchloc.y, temp.cols,temp.rows), Scalar(0, 0, 255), 2, 8);
	rectangle(result, Rect(matchloc.x, matchloc.y, temp.cols, temp.rows), Scalar(0, 0, 255), 2, 8);

	imshow(WINDOW_NAME1, dst);
	imshow(WINDOW_NAME2, result);
}

程序运行结果:
在这里插入图片描述

谢谢大家的阅读!!!

发布了28 篇原创文章 · 获赞 15 · 访问量 1069

猜你喜欢

转载自blog.csdn.net/qq_43765237/article/details/105081360