模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题。它是图像处理中最基本、最常用的匹配方法。模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。
先贴上简陋的界面图
代码:
Mat src = new Image<Bgr, byte>(ib_original.Image.Bitmap).Mat;
Mat temp = new Mat("模板.jpg", Emgu.CV.CvEnum.LoadImageType.AnyColor);//匹配的模板
//创建mat 存储输出匹配结果。
Mat result = new Mat(new Size(src.Width - temp.Width + 1, src.Height - temp.Height + 1),
Emgu.CV.CvEnum.DepthType.Cv32F, 1);
#region 模板匹配参数说明
//采用系数匹配法,匹配值越大越接近准确图像。
//IInputArray image:输入待搜索的图像。图像类型为8位或32位浮点类型。设图像的大小为[W, H]。
//IInputArray templ:输入模板图像,类型与待搜索图像类型一致,并且大小不能大于待搜索图像。设图像大小为[w, h]。
//IOutputArray result:输出匹配的结果,单通道,32位浮点类型且大小为[W - w + 1, H - h + 1]。
//TemplateMatchingType method:枚举类型标识符,表示匹配算法类型。
//Sqdiff = 0 平方差匹配,最好的匹配为 0。
//SqdiffNormed = 1 归一化平方差匹配,最好效果为 0。
//Ccorr = 2 相关匹配法,数值越大效果越好。
//CcorrNormed = 3 归一化相关匹配法,数值越大效果越好。
//Ccoeff = 4 系数匹配法,数值越大效果越好。
//CcoeffNormed = 5 归一化系数匹配法,数值越大效果越好。
#endregion
CvInvoke.MatchTemplate(src, temp, result, Emgu.CV.CvEnum.TemplateMatchingType.Ccoeff);
#region 归一化函数参数说明
//IInputArray src:输入数据。
//IOutputArray dst:进行归一化后输出数据。
//double alpha = 1; 归一化后的最大值,默认为 1。
//double beta = 0:归一化后的最小值,默认为 0。
#endregion
CvInvoke.Normalize(result, result, 255, 0, Emgu.CV.CvEnum.NormType.MinMax);
double max = 0, min = 0;//创建double的极值。
Point max_point = new Point(0, 0), min_point = new Point(0, 0);
#region 极值函数参数说明
//IInputArray arr:输入数组。
//ref double minVal:输出数组中的最小值。
//ref double maxVal; 输出数组中的最大值。
//ref Point minLoc:输出最小值的坐标。
//ref Point maxLoc; 输出最大值的坐标。
//IInputArray mask = null:蒙版。
#endregion
CvInvoke.MinMaxLoc(result, ref min, ref max, ref min_point, ref max_point);
CvInvoke.Rectangle(src, new Rectangle(max_point, temp.Size), new MCvScalar(0, 0, 255), 3);//绘制矩形,匹配得到的效果。
tb_result.Text = "min=" + min + ",max=" + max;
tb_result.Text += Environment.NewLine;
tb_result.Text += "最大值坐标:"+ max_point.ToString();
tb_result.Text += Environment.NewLine;
tb_result.Text += "最小值坐标:" + min_point.ToString();
ib_original.Image = src;