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.Windows.Forms;
using OpenCvSharp;
using OpenCvSharp.Extensions;

namespace OpenCvSharp_MatchTemplate_多目标匹配
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = new Bitmap("test.png");
            String tempImg_path = ("t1.png");
            String srcImg_path = ("test.png");
            Bitmap bitmap = Recoganize(srcImg_path, tempImg_path, 0.95, 1, "target", 10);
            pictureBox2.Image = bitmap;
        }

        Bitmap Recoganize(String srcImg_path, String tempImg_path, double threshold = 0.5, double compressed = 0.5, string name = "target", int space = 10)
        {
            DateTime beginTime = DateTime.Now;            //获取开始时间  
            // 新建图变量并分配内存
            Mat srcImg = new Mat();
            // 读取要被匹配的图像
            srcImg = Cv2.ImRead(srcImg_path);
            // 更改尺寸
            Cv2.Resize(srcImg, srcImg, new OpenCvSharp.Size((int)srcImg.Cols * compressed, (int)srcImg.Rows * compressed));
            // 初始化保存保存匹配结果的横纵坐标列表
            List<int> Xlist = new List<int> { };
            List<int> Ylist = new List<int> { };

            int order = 0;
            Mat tempImg = Cv2.ImRead(tempImg_path);
            Cv2.Resize(tempImg, tempImg, new OpenCvSharp.Size((int)tempImg.Cols * compressed, (int)tempImg.Rows * compressed));
            Mat result = srcImg.Clone();

            int dstImg_rows = srcImg.Rows - tempImg.Rows + 1;
            int dstImg_cols = srcImg.Cols - tempImg.Cols + 1;
            Mat dstImg = new Mat(dstImg_rows, dstImg_cols, MatType.CV_32F, 1);
            Cv2.MatchTemplate(srcImg, tempImg, dstImg, TemplateMatchModes.CCoeffNormed);

            int count = 0;
            for (int i = 0; i < dstImg_rows; i++)
            {
                for (int j = 0; j < dstImg_cols; j++)
                {
                    float matchValue = dstImg.At<float>(i, j);
                    if (matchValue >= threshold && Xlist.Count == 0)
                    {
                        count++;
                        Cv2.Rectangle(result, new Rect(j, i, tempImg.Width, tempImg.Height), new Scalar(0, 255, 0), 2);
                        Cv2.PutText(result, name, new OpenCvSharp.Point(j, i - (int)20 * compressed), HersheyFonts.HersheySimplex, 0.5, new Scalar(0, 0, 0), 1);
                        Xlist.Add(j);
                        Ylist.Add(i);
                    }

                    if (matchValue >= threshold && Xlist.Count != 0)
                    {
                        for (int q = 0; q < Xlist.Count; q++)
                        {
                            if (Math.Abs(j - Xlist[q]) + Math.Abs(i - Ylist[q]) < space)
                            {
                                order = 1;
                                break;
                            }
                        }
                        if (order != 1)
                        {
                            count++;
                            Cv2.Rectangle(result, new Rect(j, i, tempImg.Width, tempImg.Height), new Scalar(0, 255, 0), 2);
                            Cv2.PutText(result, name, new OpenCvSharp.Point(j, i - (int)20 * compressed), HersheyFonts.HersheySimplex, 0.5, new Scalar(0, 0, 0), 1);
                            Xlist.Add(j);
                            Ylist.Add(i);
                        }
                        order = 0;
                    }
                }
            }
            Console.WriteLine("目标数量:{0}", count);
            DateTime endTime = DateTime.Now;              //获取结束时间  
            TimeSpan oTime = endTime.Subtract(beginTime); //求时间差的函数  
            Console.WriteLine("程序的运行时间:{0} 毫秒", oTime.TotalMilliseconds);
            return result.ToBitmap();
        }

    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OpenCvSharp;
using OpenCvSharp.Extensions;

namespace OpenCvSharp_MatchTemplate_多目标匹配
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = new Bitmap("test.png");
            String tempImg_path = ("t1.png");
            String srcImg_path = ("test.png");
            Bitmap bitmap = Recoganize(srcImg_path, tempImg_path, 0.95, 1, "target", 10);
            pictureBox2.Image = bitmap;
        }

        Bitmap Recoganize(String srcImg_path, String tempImg_path, double threshold = 0.5, double compressed = 0.5, string name = "target", int space = 10)
        {
            DateTime beginTime = DateTime.Now;            //获取开始时间  
            // 新建图变量并分配内存
            Mat srcImg = new Mat();
            // 读取要被匹配的图像
            srcImg = Cv2.ImRead(srcImg_path);
            // 更改尺寸
            Cv2.Resize(srcImg, srcImg, new OpenCvSharp.Size((int)srcImg.Cols * compressed, (int)srcImg.Rows * compressed));
            // 初始化保存保存匹配结果的横纵坐标列表
            List<int> Xlist = new List<int> { };
            List<int> Ylist = new List<int> { };

            int order = 0;
            Mat tempImg = Cv2.ImRead(tempImg_path);
            Cv2.Resize(tempImg, tempImg, new OpenCvSharp.Size((int)tempImg.Cols * compressed, (int)tempImg.Rows * compressed));
            Mat result = srcImg.Clone();

            int dstImg_rows = srcImg.Rows - tempImg.Rows + 1;
            int dstImg_cols = srcImg.Cols - tempImg.Cols + 1;
            Mat dstImg = new Mat(dstImg_rows, dstImg_cols, MatType.CV_32F, 1);
            Cv2.MatchTemplate(srcImg, tempImg, dstImg, TemplateMatchModes.CCoeffNormed);

            int count = 0;
            for (int i = 0; i < dstImg_rows; i++)
            {
                for (int j = 0; j < dstImg_cols; j++)
                {
                    float matchValue = dstImg.At<float>(i, j);
                    if (matchValue >= threshold && Xlist.Count == 0)
                    {
                        count++;
                        Cv2.Rectangle(result, new Rect(j, i, tempImg.Width, tempImg.Height), new Scalar(0, 255, 0), 2);
                        Cv2.PutText(result, name, new OpenCvSharp.Point(j, i - (int)20 * compressed), HersheyFonts.HersheySimplex, 0.5, new Scalar(0, 0, 0), 1);
                        Xlist.Add(j);
                        Ylist.Add(i);
                    }

                    if (matchValue >= threshold && Xlist.Count != 0)
                    {
                        for (int q = 0; q < Xlist.Count; q++)
                        {
                            if (Math.Abs(j - Xlist[q]) + Math.Abs(i - Ylist[q]) < space)
                            {
                                order = 1;
                                break;
                            }
                        }
                        if (order != 1)
                        {
                            count++;
                            Cv2.Rectangle(result, new Rect(j, i, tempImg.Width, tempImg.Height), new Scalar(0, 255, 0), 2);
                            Cv2.PutText(result, name, new OpenCvSharp.Point(j, i - (int)20 * compressed), HersheyFonts.HersheySimplex, 0.5, new Scalar(0, 0, 0), 1);
                            Xlist.Add(j);
                            Ylist.Add(i);
                        }
                        order = 0;
                    }
                }
            }
            Console.WriteLine("目标数量:{0}", count);
            DateTime endTime = DateTime.Now;              //获取结束时间  
            TimeSpan oTime = endTime.Subtract(beginTime); //求时间差的函数  
            Console.WriteLine("程序的运行时间:{0} 毫秒", oTime.TotalMilliseconds);
            return result.ToBitmap();
        }

    }
}

下载 

Demo下载

相关推荐

  1. 目标跟踪之目标跟踪

    2024-03-30 07:58:04       41 阅读
  2. Elasticsearch 索引条件过滤:字段匹配

    2024-03-30 07:58:04       54 阅读
  3. VBS中的匹配检查

    2024-03-30 07:58:04       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-30 07:58:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-30 07:58:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-30 07:58:04       82 阅读
  4. Python语言-面向对象

    2024-03-30 07:58:04       91 阅读

热门阅读

  1. Redis 过期删除策略 And 内存淘汰策略 !!!

    2024-03-30 07:58:04       40 阅读
  2. Docker从入门到放弃

    2024-03-30 07:58:04       37 阅读
  3. 2024年github开源top100中文

    2024-03-30 07:58:04       38 阅读
  4. Qt学习建议

    2024-03-30 07:58:04       34 阅读
  5. linux正则表达式之*

    2024-03-30 07:58:04       38 阅读
  6. 机器视觉学习(九)—— 边缘检测

    2024-03-30 07:58:04       33 阅读
  7. BIM自动化简介

    2024-03-30 07:58:04       45 阅读
  8. VUE——mixins混入

    2024-03-30 07:58:04       42 阅读
  9. 如何避免公网IP安全风险

    2024-03-30 07:58:04       39 阅读
  10. MongoDB聚合运算符:$last

    2024-03-30 07:58:04       44 阅读