OPENCV C++(十二)模板匹配

正常模板匹配函数

cpp 复制代码
matchTemplate(img, templatee, resultMat, 0);//模板匹配

这里0代表的是方法,一般默认为0就ok

img是输入图像 templatee是模板 resultmat是输出

cpp 复制代码
1、cv::TM_SQDIFF:该方法使用平方差进行匹配,因此最佳的匹配结果在结果为0处,值越大匹配结果越差。

2、cv::TM_SQDIFF_NORMED:该方法使用归一化的平方差进行匹配,最佳匹配也在结果为0处。

3、cv::TM_CCORR:相关性匹配方法,该方法使用源图像与模板图像的卷积结果进行匹配,因此,最佳匹配位置在值最大处,值越小匹配结果越差。

4、cv::TM_CCORR_NORMED:归一化的相关性匹配方法,与相关性匹配方法类似,最佳匹配位置也是在值最大处。

5、cv::TM_CCOEFF:相关性系数匹配方法,该方法使用源图像与其均值的差、模板与其均值的差二者之间的相关性进行匹配,最佳匹配结果在值等于1处,最差匹配结果在值等于-1处,值等于0直接表示二者不相关。

6、cv::TM_CCOEFF_NORMED:归一化的相关性系数匹配方法,正值表示匹配的结果较好,负值则表示匹配的效果较差,也是值越大,匹配效果也好。

对于输出的说明:

就是说result图像中的每一个点的值代表了一次相似度比较结果。

如图可知,模板在待测图像上每次在横向或是纵向上移动一个像素,并作一次比较计算,由此,横向比较W-w+1次,纵向比较H-h+1次,从而得到一个(W-w+1)×(H-h+1)维的结果矩阵,result即是用图像来表示这样的矩阵,因而图像result的大小为(W-w+1)×(H-h+1)。匹配结果图像与原图像之间的大小关系,他们之间差了一个模板大小。

对输出值的归一化

cpp 复制代码
normalize(resultMat, resultMat, 0, 1, NORM_MINMAX, -1, Mat());//归一化

找出最佳匹配的位置:

cpp 复制代码
	double minVal; double maxVal; Point minLoc; Point maxLoc;
	Point matchLoc;
	minMaxLoc(resultMat, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
	matchLoc = minLoc;

我们这里选择了最小值的位置,因为我们选的第一种方法也就是值越小越好,其他方法有可能是选最大的位置!!

在图像画出匹配最佳:

cpp 复制代码
	Mat dispmat;
	img.copyTo(dispmat);
	rectangle(dispmat, matchLoc, Point(matchLoc.x + templatee.cols, matchLoc.y + templatee.rows),CV_RGB(0,255,0), 2, 8, 0);

	imshow("dispmat", dispmat);
	waitKey(0);
	destroyAllWindows();

结果显示



利用opencv自带选取roi+模板匹配,进行简单的人脸追踪识别

选取roi

cpp 复制代码
	if (cnt == 0) {
			Rect2d r;
			r = selectROI(frame, true);
			tempMat = frame(r);
			tempMat.copyTo(refMat);
			destroyAllWindows();
		}

完整代码:

cpp 复制代码
	VideoCapture cap(0);
	Mat frame;
	Mat tempMat;
	Mat refMat;
	Mat dispMat;
	Mat resultMat;

	int cnt = 0;
	while (1) {
		
		cap >> frame;
		if (cnt == 0) {
			Rect2d r;
			r = selectROI(frame, true);
			tempMat = frame(r);
			tempMat.copyTo(refMat);
			destroyAllWindows();
		}
		imshow("template", refMat);
		int match_method = 0;
		matchTemplate(frame, refMat, resultMat, match_method);
		normalize(resultMat, resultMat, 0, 1, NORM_MINMAX, -1, Mat());
		double minVal; double maxVal; Point minLoc; Point maxLoc;
		Point matchLoc;
		minMaxLoc(resultMat, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
		if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED)
		{
			matchLoc = minLoc;
		}
		else
		{
			matchLoc = maxLoc;
		}
		frame.copyTo(dispMat);


		rectangle(dispMat, matchLoc, Point(matchLoc.x + refMat.cols, matchLoc.y + refMat.rows), Scalar::all(0), 2, 8, 0);
		cnt++;
		//imshow("template", refMat);
		imshow("dispMat", dispMat);
		waitKey(30);

至此opencv基础学习到此结束 后期学习一些进阶自学内容。

************************************************----***********************************************************

相关推荐
知来者逆4 分钟前
研究大语言模型在心理保健智能顾问的有效性和挑战
人工智能·神经网络·机器学习·语言模型·自然语言处理
云起无垠14 分钟前
技术分享 | 大语言模型赋能软件测试:开启智能软件安全新时代
人工智能·安全·语言模型
老艾的AI世界27 分钟前
新一代AI换脸更自然,DeepLiveCam下载介绍(可直播)
图像处理·人工智能·深度学习·神经网络·目标检测·机器学习·ai换脸·视频换脸·直播换脸·图片换脸
翔云API1 小时前
PHP静默活体识别API接口应用场景与集成方案
人工智能
爱吃喵的鲤鱼1 小时前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++
浊酒南街1 小时前
吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.9-4.10
人工智能·深度学习·神经网络·cnn
Tony聊跨境1 小时前
独立站SEO类型及优化:来检查这些方面你有没有落下
网络·人工智能·tcp/ip·ip
懒惰才能让科技进步1 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
7年老菜鸡1 小时前
策略模式(C++)三分钟读懂
c++·qt·策略模式
Qspace丨轻空间2 小时前
气膜场馆:推动体育文化旅游创新发展的关键力量—轻空间
大数据·人工智能·安全·生活·娱乐