opencv學習筆記25-模板匹配matchTemplate

只用來記錄學習筆記

匹配算法:
在這裏插入圖片描述

Mat src, temp,dst;
int match_method = CV_TM_SQDIFF;
int max_track = 5;
const char* input_title = "input";
const char* output_title = "output";
const char* match_title = "template match-demo";
void Match_Demo(int, void*);
int main(int argc, char** argv) {
	src = imread("C:/Users/Administrator/Pictures/d503.jpg");//源圖像
	temp = imread("C:/Users/Administrator/Pictures/d503_s.jpg");//模板圖像
	if (src.empty()|| temp.empty()) {
		cout << "no image" << endl;
		return -1;
	}
	namedWindow(input_title, CV_WINDOW_AUTOSIZE);
	namedWindow(output_title, CV_WINDOW_AUTOSIZE);
	namedWindow(match_title, CV_WINDOW_AUTOSIZE);
	imshow(input_title, src);
	const char* trackbar_title = "Match Algo Type";//定義滑塊的名稱
	createTrackbar(trackbar_title, output_title, &match_method, max_track, Match_Demo);//通過滑塊改變匹配算法
	Match_Demo(0, 0);

	waitKey(0);
	return 0;
}
void Match_Demo(int, void*) {
	int width = src.cols - temp.cols + 1;//定義寬  matchTemplate規定要這麼定義的
	int height = src.rows - temp.rows + 1;//定義高 matchTemplate規定要這麼定義的
	Mat result(width, height, CV_32FC1); //新建result,matchTemplate規定只能單通道32位浮點數

	matchTemplate(src, temp, result,match_method);//匹配算法
// src:源圖像,必須是8-bit或者32-bit浮點數圖像
// temp:模板圖像,類型與輸入圖像一致
//result: 輸出結果,必須是單通道32位浮點數,假設源圖像WxH,模板圖像wxh,則結果必須爲W - w + 1, H - h + 1的大小。
//match_method:使用的匹配方法
//InputArray mask = noArray():(optional)可以不寫,也可以寫成Mat()

	normalize(result,result,0,1,NORM_MINMAX,-1,Mat()); //將result歸一化爲0-1

	Point minLoc;
	Point maxLoc;
	double min, max;
	src.copyTo(dst); //複製,src複製給dst
	Point temLoc;
	minMaxLoc(result, &min, &max, &minLoc, &maxLoc, Mat());//在一個數組中找到全局最小值和全局最大值
	//result:輸入圖像。
	//&min:最小值,可輸入NULL表示不需要。
	//&max :最大值,可輸入NULL表示不需要。
	//&minLoc:最小值的位置,可輸入NULL表示不需要,Point類型。
	//&maxLoc:最大值的位置,可輸入NULL表示不需要,Point類型。
	//mask:可有可無的掩模。
	
	if (match_method == CV_TM_SQDIFF || match_method == CV_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_title, result);
	imshow(match_title, dst);
}

在這裏插入圖片描述
效果圖:
在這裏插入圖片描述

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