参考:https://blog.csdn.net/xjjatdna/article/details/86586276
public static void TemplateMache(string srcImg, string tempImg)
{
using (Mat tempImage = CvInvoke.Imread(tempImg, ImreadModes.AnyColor))
using (Mat srcImage = CvInvoke.Imread(srcImg, ImreadModes.AnyColor))
{
//创建mat 存储输出匹配结果。
Mat result = new Mat(new Size(srcImage.Width - tempImage.Width + 1, srcImage.Height - tempImage.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(srcImage, tempImage, 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(srcImage, new Rectangle(max_point, tempImage.Size), new MCvScalar(0, 0, 255), 3);//绘制矩形,匹配得到的效果。
}
}
模板图片:
匹配图片: