OpenCV matchTemplate 模板匹配原理及代码实现(C#)

  • 基本原理
    以模版图像为卷积核,在样本图像上从左到右,从上到下进行扫描,计算相关系数,进而查找出与模板相似的对象
    在这里插入图片描述
  • 匹配方法

1. 平方差匹配方法(TM_SQDIFF)
在这里插入图片描述
T为模板图像,I为匹配图像;在匹配图像的(x,y)位置,向右x’,向下y’ 框定识别区域,计算相关性
完全匹配时,计算值为0;匹配值越大相关性越低。

2. 归一化平方差识别方法(TM_SQDIFF_NORMED)

在这里插入图片描述
将平方差计算进行了归一化,使得计算结果为0~1
图像完全匹配时,计算结果为0;完全不匹配时,计算结果为1。

3. 相关匹配法(TM_CCORR )

在这里插入图片描述
模板与匹配图像相乘,计算结果越大,匹配结果越好;
该方法会因为图像的全局亮度改变导致计算结果改变,例如图像变亮,每个像素的灰度值都会增大,这会导致计算结果变大;

4. 归一化相关性匹配方法(TM_CCORR_NORMED )
在这里插入图片描述
5.相关系数匹配法(TM_CCOEFF)
在这里插入图片描述
该方法在进行相关匹配前,先对模板和识别区域的矩阵进行了预处理:用矩阵减去矩阵均值,这种方法解决了模板图像和识别图像亮度差异造成的影响。由计算结果逻辑可知,计算结果越大,匹配结果越好。

6.归一化相关系数匹配法(TM_CCOEFF_NORMED)

在这里插入图片描述

该方法对相关系数匹配法进行了归一化处理,计算结果为-1~1
完全匹配为1,完全不匹配为-1

  • API
public static void MatchTemplate(InputArray image, InputArray templ, OutputArray result, TemplateMatchModes method, InputArray? mask = null);

image: 识别图像
templ: 模板图像
result: 模板匹配结果
method: 匹配方法
mask: 匹配模板掩码,一般采用默认值

  • 演示
Mat templatePic = Cv2.ImRead(@"C:\Users\Aron\Desktop\01\A.jpg");
Mat testPic = Cv2.ImRead(@"C:\Users\Aron\Desktop\01\B.jpg");


Mat matchResul = new Mat();


//归一化相关系数匹配法
Cv2.MatchTemplate(testPic, templatePic, matchResul, TemplateMatchModes.CCoeffNormed);

//最大最小匹配对象的位置
Point minLoc = new Point(0, 0);
Point maxLoc = new Point(0, 0);

//最大最小配置值
double minVal;
double maxVal;

//查找最大最小值的位置及匹配的值
Cv2.MinMaxLoc(matchResul, out minVal, out maxVal, out minLoc, out maxLoc);

//框选出识别对象
//归一化相关系数匹配方法取最大值
Scalar scalar = new Scalar(0, 0, 255);
Cv2.Rectangle(testPic,maxLoc, new Point(maxLoc.X+templatePic.Cols,maxLoc.Y+templatePic.Rows), scalar, 7);

//显示相关性计算结果
Cv2.PutText(testPic, Math.Round(maxVal,4).ToString(), new Point(maxLoc.X, maxLoc.Y -50), HersheyFonts.HersheyDuplex, 2, scalar, 8);


picBox_Display.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(templatePic);
picBox_After.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(testPic);

在这里插入图片描述
在这里插入图片描述

补充说明:
本案例在.NET使用的OpenCV库为OpenCvSharp4

.NET 环境的OpenCv库

猜你喜欢

转载自blog.csdn.net/weixin_40671962/article/details/127464728