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);
}

程序運行結果:
在這裏插入圖片描述

謝謝大家的閱讀!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章