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();
}
}
}
C# OpenCvSharp MatchTemplate 多目标匹配的更多相关文章
- 机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配) 2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)
1. cv2.matchTemplate(src, template, method) # 用于进行模板匹配 参数说明: src目标图像, template模板,method使用什么指标做模板的匹配 ...
- OpenCv单模版多目标匹配
OpenCv单模版多目标匹配 单模版匹配出现的问题 一. 关于单模版匹配,我一开始用的是光线较暗的图,结果根据模版匹配到的位置并不正确. 我后来想用阈值把图形的特征提取出来,在把模版的特征和原图的特征 ...
- Unity-Animator深入系列---目标匹配Target Matching
回到 Animator深入系列总目录 一开始会理所当然的觉得,匹配是这样的: 但结果却是这样的(右边的Cube是匹配目标): 感觉这个接口应该是专门为攀爬之类的动画准备的,属于被动匹配位置,移动整个对 ...
- Makefile:1: *** 多个目标匹配。 停止。
以下是我自己写的Makefile 文件: .SUFFIXES:.c .o CC = gcc SRCS = stat.c OBJS = $(SRCS:.c=.o) EXEC = test start:$ ...
- OpenCvSharp 通过特征点匹配图片
现在的手游基本都是重复操作,一个动作要等好久,结束之后继续另一个动作.很麻烦,所以动起了自己写一个游戏辅助的心思. 这个辅助本身没什么难度,就是通过不断的截图,然后从这个截图中找出预先截好的能代表相应 ...
- Makefile:(实验)多个目标匹配时会采用最完整匹配的目标
结论源自实验测试,如果有疏漏希望指出 当Makefile中存在多个匹配的目标时,Makefile会采用哪个匹配的目标呢? 测试的Makefile如下: .PHONY: all clean quick_ ...
- Makefile 多个目标匹配的问题
在windows下直接使用mingw32-make # ZTHREAD_A the static link library file of ZThread ZTHREAD_A = F:/ZJ/tool ...
- 使用Opencv中matchTemplate模板匹配方法跟踪移动目标
模板匹配是一种在图像中定位目标的方法,通过把输入图像在实际图像上逐像素点滑动,计算特征相似性,以此来判断当前滑块图像所在位置是目标图像的概率. 在Opencv中,模板匹配定义了6种相似性对比方式: C ...
- OpenCV---模板匹配matchTemplate
作用有局限性,必须在指定的环境下,才能匹配成功,是受到很多因素的影响,所以有一定的适应性 模板匹配是一种最原始.最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是 ...
- 使用OpenCV&&C++进行模板匹配.
一:课程介绍 1.1:学习目标 学会用imread载入图像,和imshow输出图像. 用nameWindow创建窗口,用createTrackbar加入滚动条和其回调函数的写法. 熟悉OpenCV函数 ...
随机推荐
- virtualapp启动流程源码分析
virtualapp启动流程分析 1. 首先是启动本身,执行Vpp 的attachBaseContext @Override protected void attachBaseContext(Cont ...
- Java JVM——3.运行时数据区概述及线程
运行时数据区概述 在JVM 中的位置 内部划分 当我们通过前面的:类的加载 → 验证 → 准备 → 解析 → 初始化 这几个阶段完成后,执行引擎就会对我们的类进行使用,同时执行引擎将会使用到我们的运行 ...
- go值接收者和指针接收者的区别
方法的接收者 package main import ( "fmt" ) type Person struct { Name string Age int } func (p Pe ...
- 文心一言 VS 讯飞星火 VS chatgpt (203)-- 算法导论15.3 2题
二.对一个16个元素的数组,画出2.3.1节中MERGE-SORT过程运行的递归调用树.解释备忘技术为什么对MERGE-SORT这种分治算法无效.需要写代码的时候,请用go语言. 文心一言,代码不完整 ...
- java字节、位移以及进制转换
数据存储方式 众所周知,java中的数据都是以二进制的形式存储在计算机中的,但是我们看到的数据怎么是10进制的,因为java提供了很多进制自动转换的方式. 位移 向左位移是*2的幂次,一般都是正数操作 ...
- hibernate-delete(Entity)的顺序问题
hibernate为我们提供了删除直接根据实体参数删除数据的方法: HibernateTemplate().delete(entity); public void delete(final Objec ...
- 【Azure App Service】同一个App Service下创建多个测试站点的方式
问题描述 在一个App Service中,部署多个应用,每个应用相互独立,类似与IIS中在根目录下创建多个子应用的情况. 问题解答 可以的.通过App Service Configuration页面, ...
- 【Azure 应用服务】使用App Service for Linux/Container时,如果代码或Container启动耗时大于了230秒,默认会启动失败。
问题描述 使用App Service for Linux/Container时,从Docker的日志中,我们可以看见有 warmup 行为,而此行为默认时间为230秒,如果超出了这个时间,就会导致Co ...
- 彩虹猫IDA分析记录
目录 彩虹猫分析 概述 无参启动 带/main参数启动 带/watchdog参数启动 MBR引导程序和动画程序 第一段 引导代码 第二段 动画代码 其他函数 扭曲桌面 扰乱鼠标 钩子函数 桌面绘制图标 ...
- 从零开始写 Docker(四)---使用 pivotRoot 切换 rootfs 实现文件系统隔离
change-rootfs-by-pivot-root.png 本文为从零开始写 Docker 系列第四篇,在mydocker run 基础上使用 pivotRoot 系统调用切换 rootfs 实现 ...