[C#]OpenCvSharp利用MatchTemplate实现多目标匹配

【效果展示】

原图

模板图

匹配结果:

【实现部分代码】

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 OpenCvSharp;

namespace FIRC
{
    public partial class Form1 : Form
    {
        public Dictionary<string, TemplateMatchModes> tmm_dict = new Dictionary<string, TemplateMatchModes>();
        public Mat src = null;//存储原图
        public Mat template = Cv2.ImRead(Application.StartupPath+"\\images\\template.jpg");
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "(图片文件)*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png"; ;
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                src= Cv2.ImRead(ofd.FileName);
                var points = FIRCMatchTemplate.MatchTemplate(src,template,tmm_dict[comboBox1.Text],0.8f);
                var resultMat = FIRCMatchTemplate.DrawImage(points,src.Clone(),template.Size());
                pictureBox1.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(resultMat);
            }
        }
      
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(src!=null)
            {
                var points = FIRCMatchTemplate.MatchTemplate(src, template, tmm_dict[comboBox1.Text], 0.8f);
                var resultMat = FIRCMatchTemplate.DrawImage(points, src.Clone(), template.Size());
                pictureBox1.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(resultMat);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            tmm_dict.Add("CCoeffNormed",TemplateMatchModes.CCoeffNormed);
            tmm_dict.Add("CCoeff", TemplateMatchModes.CCoeff);

            tmm_dict.Add("SqDiffNormed", TemplateMatchModes.SqDiffNormed);
            tmm_dict.Add("SqDiff", TemplateMatchModes.SqDiff);

            tmm_dict.Add("CCorrNormed", TemplateMatchModes.CCorrNormed);
            tmm_dict.Add("CCorr", TemplateMatchModes.CCorr);
            comboBox1.SelectedIndex = 0;
        }
    }
}

【测试环境】

vs2019,netframework4.7.2,opencvsharp4.8.0

【视频演示】

C# opencvsharp多目标模板匹配算法演示代码_哔哩哔哩_bilibili测试环境:vs2019,netframework4.7.2,opencvsharp4.8.0, 视频播放量 2、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 未来自主研究中心, 作者简介 未来自主研究中心,相关视频:资源软件库学习资料总站大全合集更新,资源软件库学习资料无敌了,C# opencvsharp实现透视变换演示,使用C++部署yolov8的onnx和bytetrack实现目标追踪,基于yolov5的单目测距视频演示,labelme json转yolo工具用于目标检测训练数据集使用教程,基于yolov8+deepsort实现目标追踪视频演示,一个软件库永久更新学习资料资源共享,[数据集介绍][目标检测]城市街道垃圾数据集VOC格式5266张,基于yolov8+deepsort+SLPNet实现车辆检测车辆识别车辆违停指定区域检测一体化系统icon-default.png?t=N7T8https://www.bilibili.com/video/BV1Mt421n7fx/

【演示源码下载地址】 

https://download.youkuaiyun.com/download/FL1623863129/89079647

### C# 使用 OpenCvSharp 进行模板匹配实现定位 为了在 C#利用 OpenCvSharp 库执行模板匹配并完成对象的精确定位,可以遵循如下方法。此过程涉及加载源图像和模板图像,随后应用 `MatchTemplate` 方法来计算两者之间的相似度矩阵。 #### 加载必要的命名空间 首先,在项目中引入必需的命名空间以便访问 OpenCvSharp 的功能: ```csharp using OpenCvSharp; ``` #### 准备工作 确保已安装 OpenCvSharp 包,并准备好待分析的目标图片以及作为参照物的小幅模板图片。 #### 实现模板匹配逻辑 下面是一个简单的例子展示如何使用 OpenCvSharp 来进行基本的模板匹配操作[^2]: ```csharp public static void TemplateMatchingExample() { // 读取原始图像和模板图像 Mat img = Cv2.ImRead("path_to_source_image", ImreadModes.Color); Mat templ = Cv2.ImRead("path_to_template_image", ImreadModes.Color); // 创建用于存储结果的地图 Size resultSize = new Size(img.Cols - templ.Cols + 1, img.Rows - templ.Rows + 1); Mat result = new Mat(resultSize, MatType.CV_32FC1); // 执行模板匹配 Cv2.MatchTemplate(img, templ, result, TemplateMatchModes.CCoeffNormed); // 寻找最佳匹配位置 double minVal, maxVal; Point minLoc, maxLoc; MinMaxLoc(result, out minVal, out maxVal, out minLoc, out maxLoc); // 绘制矩形框标记找到的位置 Rect matchRect = new Rect(maxLoc.X, maxLoc.Y, templ.Cols, templ.Rows); Cv2.Rectangle(img, matchRect, Scalar.Red, 2); // 显示带有标注的结果图 Cv2.NamedWindow("Result"); Cv2.ImShow("Result", img); Cv2.WaitKey(); } ``` 上述代码片段展示了怎样通过调用 `Cv2.MatchTemplate()` 函数来进行基于灰度值的相关性系数标准化匹配 (CCoeff Normed),这是一种常用的模板匹配方式[^4]。该函数返回一个浮点数类型的单通道数组表示每一点处的匹配得分;接着通过对这些分数求极值得到最优匹配区域的具体坐标,最后绘制边界框突出显示匹配成功的部分。 #### 结果可视化 运行这段程序将会打开一个新的窗口显示出原图上被红色边框圈起来的最佳匹配区段,从而实现了简单而直观的对象定位目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FL1623863129

你的打赏是我写文章最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值