Cv2.MatchTemplate
方法通过在输入图像中滑动模板图像并计算每个位置的匹配度来查找模板的位置。匹配度通常使用平方差或相关性等指标来度量,具体取决于所选择的匹配方法。
Cv2.MatchTemplate 模板匹配
void Cv2.MatchTemplate(InputArray image,
InputArray templ,
OutputArray result,
TemplateMatchModes method,
InputArray mask = null)
-
image
:输入图像,你希望在其中查找模板的图像。通常,这是一幅较大的图像。 -
templ
:要查找的模板图像,你希望在输入图像中匹配的部分。 -
result
:输出结果图像,它将包含匹配度信息。这是一个单通道浮点型图像。 -
method
:匹配方法,一个枚举值,用于选择不同的匹配算法。常用的选项有:TemplateMatchModes.SqDiff
:平方差匹配。返回最小平方差的位置。TemplateMatchModes.CCoeffNormed
:相关性匹配。返回最大相关性的位置。
-
mask
(可选):用于指定模板匹配的掩码图像。如果不需要,可以设置为 null。
返回值:result
参数包含匹配度信息图像,你可以使用此图像来获取匹配的位置
Cv2.MinMaxLoc() 查找图像中最小和最大值及其位置
public static void MinMaxLoc(Mat src,
out double minVal,
out double maxVal,
out Point minLoc,
out Point maxLoc,
Mat mask = null);
-
src
:输入图像,通常是一个单通道图像(灰度图像)。 -
minVal
:输出参数,用于存储图像中的最小值。 -
maxVal
:输出参数,用于存储图像中的最大值。 -
minLoc
:输出参数,用于存储最小值的位置。 -
maxLoc
:输出参数,用于存储最大值的位置。 -
mask
(可选参数):用于指定感兴趣区域的掩码图像。如果不需要使用掩码,可以将其设置为null
。
二、源代码
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 模板匹配
{
class Program
{
static void Main(string[] args)
{
// 定义输入图像路径和模板图像路径
string srcImgPath = "C:/Users/CGW/Desktop/digits/0.1.jpg";
string tempImgPath = "C:/Users/CGW/Desktop/digits/0.4.jpg";
// 读取输入图像和模板图像
Mat srcImage = Cv2.ImRead(srcImgPath, ImreadModes.AnyColor);
Mat tempImage = Cv2.ImRead(tempImgPath, ImreadModes.AnyColor);
// 创建用于存储模板和匹配结果的图像
Mat result = new Mat();
// 使用模板匹配方法进行匹配,这里使用归一化相关系数匹配法
Cv2.MatchTemplate(srcImage, tempImage, result,TemplateMatchModes.CCoeffNormed);
// 获取匹配结果中的最小值、最大值以及对应的位置
double minVal, maxVal;
OpenCvSharp.Point minLoc, maxLoc;
Cv2.MinMaxLoc(result, out minVal, out maxVal, out minLoc, out maxLoc);
// 获取最佳匹配的位置
OpenCvSharp.Point matchLoc = maxLoc;
// 在输入图像上用绿色矩形框标记匹配的位置
Cv2.Rectangle(srcImage, matchLoc, new OpenCvSharp.Point(matchLoc.X + tempImage.Cols, matchLoc.Y + tempImage.Rows), Scalar.Green, 2);
// 显示模板和匹配结果的图像
Cv2.ImShow("模板", tempImage);
Cv2.ImShow("Matched Result", srcImage);
Cv2.WaitKey(0);
// 释放图像对象,关闭显示窗口
srcImage.Release();
tempImage.Release();
result.Release();
Cv2.DestroyAllWindows();
Cv2.DestroyAllWindows();
}
}
}
三、结果显示