C# 图像模板匹配并标注
01
—
需求
这个是粉丝在我的技术群提的一个需求
1、 模板匹配 :
功能:
(1)在一张大图像中,选取一小块区域作为模板
(2)可在大图像中匹配到模板图像和位置。
模板匹配是图像处理中最基本、最常用的匹配方法。目前我司用hacon去做的,还进行了二次封装,可以设置图片的旋转角度等信息,这个设计公司机密,这里我就用opencv(NET封装版叫emgucv)去实现这个功能。
02
—
功能演示
03
—
核心代码
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using PropertyChanged;
using System;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Windows.Media;
using System.Windows.Media.Imaging;namespace Caliburn.Micro.Hello
{[AddINotifyPropertyChangedInterface]public class MatchTemplateViewModel: IViewModel{public ImageSource TemplateImage { get; set; }public string TemplateImagePath { get; set; }public ImageSource MarkImage { get; set; }public string MarkImagePath { get; set; }public string ResultString { get; set; }public void MatchTemplate(){Mat src = CvInvoke.Imread(TemplateImagePath, LoadImageType.AnyColor);//从本地读取图片Mat result = src.Clone();Mat tempImg = CvInvoke.Imread(MarkImagePath, LoadImageType.AnyColor);int matchImg_rows = src.Rows - tempImg.Rows + 1;int matchImg_cols = src.Cols - tempImg.Cols + 1;Mat matchImg = new Mat(matchImg_rows, matchImg_rows, DepthType.Cv32F, 1); //存储匹配结果#region 模板匹配参数说明采用系数匹配法,匹配值越大越接近准确图像。IInputArray image:输入待搜索的图像。图像类型为8位或32位浮点类型。设图像的大小为[W, H]。IInputArray templ:输入模板图像,类型与待搜索图像类型一致,并且大小不能大于待搜索图像。设图像大小为[w, h]。IOutputArray result:输出匹配的结果,单通道,32位浮点类型且大小为[W - w + 1, H - h + 1]。TemplateMatchingType method:枚举类型标识符,表示匹配算法类型。Sqdiff = 0 平方差匹配,最好的匹配为 0。SqdiffNormed = 1 归一化平方差匹配,最好效果为 0。Ccorr = 2 相关匹配法,数值越大效果越好。CcorrNormed = 3 归一化相关匹配法,数值越大效果越好。Ccoeff = 4 系数匹配法,数值越大效果越好。CcoeffNormed = 5 归一化系数匹配法,数值越大效果越好。#endregionCvInvoke.MatchTemplate(src, tempImg, matchImg, TemplateMatchingType.CcoeffNormed);#region 归一化函数参数说明IInputArray src:输入数据。IOutputArray dst:进行归一化后输出数据。double alpha = 1; 归一化后的最大值,默认为 1。double beta = 0:归一化后的最小值,默认为 0。#endregionCvInvoke.Normalize(matchImg, matchImg, 0, 1, NormType.MinMax, matchImg.Depth); //归一化double minValue = 0.0, maxValue = 0.0;Point minLoc = new Point();Point maxLoc = new Point();#region 极值函数参数说明IInputArray arr:输入数组。ref double minVal:输出数组中的最小值。ref double maxVal; 输出数组中的最大值。ref Point minLoc:输出最小值的坐标。ref Point maxLoc; 输出最大值的坐标。IInputArray mask = null:蒙版。#endregionCvInvoke.MinMaxLoc(matchImg, ref minValue, ref maxValue, ref minLoc, ref maxLoc);StringBuilder tb_result = new StringBuilder();tb_result.Append("min=" + minValue + ",max=" + maxValue);tb_result.Append(Environment.NewLine);tb_result.Append("最小值坐标:\n" + minLoc.ToString());tb_result.Append(Environment.NewLine);tb_result.Append("最大值坐标:\n" + maxLoc.ToString());ResultString = tb_result.ToString();//Console.WriteLine(tb_result);CvInvoke.Rectangle(src, new Rectangle(maxLoc, tempImg.Size), new MCvScalar(0, 0, 255), 3);//绘制矩形,匹配得到的效果。CvInvoke.Imshow("result", src);CvInvoke.WaitKey(0);}/// <summary>/// 加载模板图片/// </summary>public void LoadTemplateImage(){TemplateImage = LoadImage(ImageLoadType.TemplateImage);}/// <summary>/// 加载标记图片/// </summary>public void LoadMarkImage(){MarkImage = LoadImage(ImageLoadType.MarkImage);}public ImageSource LoadImage(ImageLoadType imageType ){OpenFileDialog openFileDialog1 = new OpenFileDialog();openFileDialog1.Filter = "图片|*.jpg;*.jpeg;*.bmp;*.png;*.gif";openFileDialog1.FilterIndex = 1;//当前使用第二个过滤字符串openFileDialog1.RestoreDirectory = true;//对话框关闭时恢复原目录openFileDialog1.Multiselect = false;openFileDialog1.Title = "选择文件";ImageSource iSouce = null;try{if (openFileDialog1.ShowDialog() == DialogResult.OK){iSouce = LoadImageFreeze(openFileDialog1.FileName);//加载显示完成需要释放switch(imageType){case ImageLoadType.MarkImage:MarkImagePath = openFileDialog1.FileName;break;case ImageLoadType.TemplateImage:TemplateImagePath = openFileDialog1.FileName; break;default: break;}return iSouce;}return null;}catch (Exception ex){Console.WriteLine($"[MatchTemplateViewModel]:Load() execute error:{ex}");return null;}}/// <summary>/// 图片加载显示完成后释放/// </summary>/// <param name="imagePath"></param>/// <returns></returns>public static BitmapImage LoadImageFreeze(string imagePath){try{BitmapImage bitmap = new BitmapImage();if (File.Exists(imagePath)){bitmap.BeginInit();bitmap.CacheOption = BitmapCacheOption.OnLoad;using (Stream ms = new MemoryStream(File.ReadAllBytes(imagePath))){bitmap.StreamSource = ms;bitmap.EndInit();bitmap.Freeze();}}return bitmap;}catch (Exception){return null;}}}
}
04
—
说明
界面分别加载模板图片和标记图片,然后点击匹配按钮进行匹配,匹配结果在模板图片上用矩形标注,并把位置信息显示在界面上
①在NUGET上安装emgucv库:我这里适应的是3.1。0.1,注意emgucv每个版本不兼容
②模板匹配接口MatchTemplate说明,详细注释代码里面都有
#region 模板匹配参数说明采用系数匹配法,匹配值越大越接近准确图像。IInputArray image:输入待搜索的图像。图像类型为8位或32位浮点类型。设图像的大小为[W, H]。IInputArray templ:输入模板图像,类型与待搜索图像类型一致,并且大小不能大于待搜索图像。设图像大小为[w, h]。IOutputArray result:输出匹配的结果,单通道,32位浮点类型且大小为[W - w + 1, H - h + 1]。TemplateMatchingType method:枚举类型标识符,表示匹配算法类型。Sqdiff = 0 平方差匹配,最好的匹配为 0。SqdiffNormed = 1 归一化平方差匹配,最好效果为 0。Ccorr = 2 相关匹配法,数值越大效果越好。CcorrNormed = 3 归一化相关匹配法,数值越大效果越好。Ccoeff = 4 系数匹配法,数值越大效果越好。CcoeffNormed = 5 归一化系数匹配法,数值越大效果越好。#endregionCvInvoke.MatchTemplate(src, tempImg, matchImg, TemplateMatchingType.CcoeffNormed);
③外部加载 图片,加载显示完成后释放,返回BitmapImage 可以直接赋值给wpf控件的ImageSource
public static BitmapImage LoadImageFreeze(string imagePath){try{BitmapImage bitmap = new BitmapImage();if (File.Exists(imagePath)){bitmap.BeginInit();bitmap.CacheOption = BitmapCacheOption.OnLoad;using (Stream ms = new MemoryStream(File.ReadAllBytes(imagePath))){bitmap.StreamSource = ms;bitmap.EndInit();bitmap.Freeze();}}return bitmap;}catch (Exception){return null;}}
C# 图像模板匹配并标注相关推荐
- 利用OpenCV的函数matchTemplate()实现在图像中寻找、检索、搜索模板图像【图像模板匹配】
利用OpenCV的函数matchTemplate()实现在图像中寻找.检索.搜索模板图像[图像模板匹配] 在博文 https://www.hhai.cc/thread-220-1-1.html 中我们 ...
- Java OpenCV-4.0.0 图像处理22 图像模板匹配
Java OpenCV-4.0.0 图像处理22 图像模板匹配 参考链接:https://blog.csdn.net/qq_34814092/article/details/95813654 Java ...
- 基于空间相关的图像模板匹配及MATLAB实现
应用背景:机器的模式识别所要解决的问题,就是用机器代替人去认识图像和找出一幅图像中人们感兴趣的目标物.如何找到目标物即图像的区域呢,这里介绍在空间域使用模板在图像中寻找与模板匹配的区域. 基本原理:在 ...
- 多线程加速图像模板匹配
多线程加速图像模板匹配 2010年09月05日 多线程加速图像模板匹配 首先这是个没有什么很好的结局的故事.所以下面这点文字不是为了表现一个怎么怎么好的结果,而是整个让人头疼的过程. 多线程加速算法的 ...
- 【OpenCV 4开发详解】图像模板匹配
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- 《三英战吕布》 - 图像模板匹配 【Python-Open_CV系列(八)】
<三英战吕布>- 图像模板匹配[Python_Open_CV系列(八)] 文章目录 1.什么是模板匹配? 及 模板匹配方法matchTemplate() 介绍 素材准备 2.单模板匹配 2 ...
- python opencv屏幕找图_使用Python+OpenCV进行图像模板匹配(Match Template)实例-找到百度首页按钮并点击...
意图:准备一张小图,在电脑屏幕上找到小图坐标,并点击. 1 安装 opencv 和 numpy: pip3 install opencv-python 上述命令将 opencv 和 numpy都安装 ...
- opencv基础--图像模板匹配
参考:https://blog.csdn.net/ivanhawking/article/details/83182692(该链接附载链接有处理多目标,旋转,缩放等匹配的方法) 1.概述 图像匹配是指 ...
- matlab 图像模板匹配,基于MATLAB模板匹配的车牌识别系统
一.课题名称[Q1321814823] 基于MATLAB模板匹配的车牌识别系统 二.课题背景 随着汽车数量的增加,城市交通状况日益受到人们的重视,如何进行有效的交通管理更是成为了人们关注的焦点.针对此 ...
最新文章
- 关于 hashcode 和 equals
- linux at shell,shell 用at命令来计划执行作业
- 哪一类功率放大电路效率最高_最简单逆变器电路讲解计算,电工电子动手学技术,电路好案例推荐...
- nignx部署Vue单页面刷新路由404问题解决
- 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )
- join和countDownLatch原理及区别详解
- 数组|leetcode59.螺旋矩阵II
- CometD:Java Web应用程序的Facebook类似聊天
- MongoDB数据库设计备忘
- 教你轻松截获 Selenium 中的 Ajax 数据
- 机器人最大的人类士人禾力积木_奇妙的机器人世界15(二)
- ashx获取input file 文件_前端战五渣学前端——FileReader预览本地文件
- 《趣学JavaScript——教孩子学编程》——第1章 认识JavaScript1.1 认识JavaScript
- Linux学习笔记---更新软件源
- 使用CROS解决跨域问题
- 2020年最好用的手机是哪一款_2020年千元机中性能最好的4款手机,印象最让你深刻的是哪一款?...
- 如何设置PDFjs 页面标题
- 不要上网更新计算机系统的补丁程序,360安全卫士更新补丁后系统不能联网怎么办...
- 小米网络信号测试软件,iQOO和小米9网络测试 iQOO和小米9谁的信号会更好一些
- dfs深度优先搜索问题