opencv模板匹配

211 阅读2分钟

matchTemplate函数参数

模板匹配是通过模板在采集到的原图像进行滑动寻找与模板图像相似的目标。模板匹配不是基于直方图的方式,而是基于图像的灰度匹配。
在这里插入图片描述
6种匹配度量方法:

平方差匹配法CV_TM_SQDIFF
归一化平方差匹配法CV_TM_SQDIFF_NORMED
相关匹配法CV_TM_CCORR
归一化相关匹配法CV_TM_CCORR_NORMED
系数匹配法CV_TM_CCOEFF
化相关系数匹配法CV_TMCCOEFF_NORMED

方差匹配方法:完全匹配会得到1, 完全不匹配会得到0。
归一化方差匹配方法:完全匹配结果为0。
相关性匹配方法:完全匹配会得到很大值,不匹配会得到一个很小值或0。
归一化的互相关匹配方法:完全匹配会得到1, 完全不匹配会得到0。
相关系数匹配方法:完全匹配会得到一个很大值,完全不匹配会得到0,完全负相关会得到很大的负数。
归一化的相关系数匹配方法:完全匹配会得到1,完全负相关匹配会得到-1,完全不匹配会得到0。

关于函数中result矩阵的含义,这篇文章有总结,有疑问的可以看一看:
cvMatchTemplate中的参数"result"的几点说明

matchTemplateDemo代码

框选出模板后,按下回车键即可

int main()
{
	//改变控制台字体颜色
	system("color 02");
	VideoCapture capture(0);
	int cnt = 0;
	Mat frame;	//存储每一帧的图像
	Mat tempMat;
	Mat refMat;
	Mat resultMat;
	Mat dispMat;
	while (1)
	{
		capture >> frame;	//读取当前帧
		if (cnt == 0) {
			Rect2d r;
			r = selectROI(frame, true);	//选择一个矩形roi区域
			tempMat = frame(r);			//此区域为模板区域
			tempMat.copyTo(refMat);
			destroyAllWindows();
		}
		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());	//从结果矩阵中找到匹配度最大以及最小的值并且确定其位置
		//对于方法SQDIFF和SQDIFF_NORMED两种方法来讲,越小的值就有着更高的匹配结果
    	//而其余的方法则是数值越大匹配效果越好
		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);
	}
	return 0;
}

展示效果

这并不是演示代码的展示效果,但是差不多意思。
图片