MatchTemplate的函数原型为
Image<Gray, float> MatchTemplate(Image<TColor, TDepth> template, TemplateMatchingType method);
其中TemplateMatchingType 共有6种检测方式
1、平方差匹配 Sqdiff
最好匹配为0.匹配越差,匹配值越大。
2、相关匹配 Ccorr
数值越大表示匹配程度较高,0为最坏的匹配效果。
3相关匹配Ccoeff
1为完美匹配,-1表示最差的匹配,0表示没有任何相关性(随机序列).
4、标准平方差匹配SqdiffNormed
最小值表示最好的匹配
5、标准相关匹配CcorrNormed
最大值为最好匹配
6、标准相关匹配CcoeffNormed
最大值为最好匹配
原理:
通过图像块一次移动一个像素 (从左往右,从上往下)的. 在每一个位置, 都进行一次度量计算来说明图像块和原图像的特定区域的相似度。
用法如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using Emgu.Util;
using Emgu.CV.UI;
namespace EmguCVHist
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Image<Bgr, byte> a = new Image<Bgr, byte ("738b4710b912c8fc453a8235fe039245d7882178.jpg");
Image<Bgr, byte> b = new Image<Bgr, byte>("QQ截图20150827003943.png");
Image<Gray, float> c = new Image<Gray, float>(a.Width, a.Height);
c = a.MatchTemplate(b, TemplateMatchingType.CcorrNormed);
double min=0, max=0;
Point maxp = new Point(0, 0);
Point minp = new Point(0, 0);
CvInvoke.MinMaxLoc(c, ref min, ref max, ref minp, ref maxp);
Console.WriteLine(min + " " + max);
//CvInvoke.Normalize(c, c);
CvInvoke.Rectangle(a, new Rectangle(maxp, new Size(b.Width, b.Height)), new MCvScalar(0, 0, 255), 3);
imageBox1.Image = a;
}
}
}
效果图:中间为运行图