OpenCVSharp 模板匹配亚像素代码
时间: 2023-10-13 20:11:50 浏览: 224
以下是使用 OpenCVSharp 进行模板匹配并获取亚像素级匹配位置的示例代码:
```csharp
using System;
using System.Drawing;
using OpenCvSharp;
public class TemplateMatchingExample
{
public static void Main()
{
// 读取模板和原始图像
Mat template = Cv2.ImRead("template.png", ImreadModes.GrayScale);
Mat image = Cv2.ImRead("image.png");
// 进行模板匹配
Mat result = new Mat();
Cv2.MatchTemplate(image, template, result, TemplateMatchModes.CCoeffNormed);
// 获取最大匹配位置
double minVal, maxVal;
Point minLoc, maxLoc;
Cv2.MinMaxLoc(result, out minVal, out maxVal, out minLoc, out maxLoc);
// 获取亚像素级匹配位置
Mat subImage = image.SubMat(new Rect(maxLoc.X, maxLoc.Y, template.Cols, template.Rows));
Cv2.MatchTemplate(subImage, template, result, TemplateMatchModes.CCoeffNormed);
Point2f[] corners = Cv2.MinMaxLoc(result, out minVal, out maxVal, out minLoc, out maxLoc, new Mat());
PointF matchLoc = new PointF(maxLoc.X + corners[0].X, maxLoc.Y + corners[0].Y);
// 绘制匹配位置
Cv2.Rectangle(image, new Rect((int)matchLoc.X, (int)matchLoc.Y, template.Cols, template.Rows), Scalar.Red, 2);
// 显示结果
Cv2.ImShow("Result", image);
Cv2.WaitKey(0);
}
}
```
其中,`template.png` 和 `image.png` 分别是模板图像和原始图像。模板匹配使用的算法是 `TemplateMatchModes.CCoeffNormed`,这是一种基于归一化互相关的方法。然后使用 `MinMaxLoc` 函数获取最大匹配位置,并在原始图像上绘制矩形框。最后,使用 `SubMat` 函数提取出亚像素级匹配区域,并再次进行模板匹配,以获取亚像素级匹配位置。
阅读全文