public MatchInfo GetMatchPos(string Src, string Template)
{
MatchInfo myMatchInfo = new MatchInfo();
Image<Bgr, byte> a = new Image<Bgr, byte>(Src);
Image<Bgr, byte> b = new Image<Bgr, byte>(Template);
Image<Bgr, byte> aa = new Image<Bgr, byte>(Src);
Image<Gray, float> c = new Image<Gray, float>(a.Width, a.Height);
c = a.MatchTemplate(b, TemplateMatchingType.CcorrNormed);
double min = 0, max = 0;
Point maxp = new Point(0, 0);
Point minp = new Point(0, 0);
CvInvoke.MinMaxLoc(c, ref min, ref max, ref minp, ref maxp);
//for (int i =0;i< c.; i++) {

//}
Console.WriteLine(max + "-" + maxp.X + "," + maxp.Y);
Console.WriteLine(min + "-"+minp.X + "," + minp.Y);
CvInvoke.Rectangle(aa, new Rectangle(maxp, new Size(b.Width, b.Height)), new MCvScalar(0, 0, 255), 3);
CvInvoke.Rectangle(aa, new Rectangle(minp, new Size(b.Width+13, b.Height+13)), new MCvScalar(0, 255, 255), 3);
Image<Gray, float> c1 = c;
int getcnt = 0;
Lab1:
c1 = getNextMinLoc(c1, maxp, (int)max, b.Width, b.Height);
CvInvoke.MinMaxLoc(c1, ref min, ref max, ref minp, ref maxp);
if (max < 0.95)
{
goto Lab2;
}
getcnt++;
if (getcnt > 10) {
goto Lab2;
}
Console.WriteLine(max + "-" + maxp.X + "," + maxp.Y);
CvInvoke.Rectangle(aa, new Rectangle(maxp, new Size(b.Width, b.Height)), new MCvScalar(0, 255, 0), 3);
goto Lab1;
Lab2:
myMatchInfo.matchMax = max;
myMatchInfo.matchMin = min;
myMatchInfo.matchPicture = aa;
myMatchInfo.matchRectangle = new Rectangle(maxp, new Size(b.Width, b.Height));
myMatchInfo.matchMaxLoc = maxp;
myMatchInfo.matchMinLoc = minp;
return myMatchInfo;
}
Image<Gray, float> getNextMinLoc(Image<Gray, float> result, Point maxLoc, int maxVaule, int templatW, int templatH)
{

// 先将第一个最大值点附近模板宽度和高度的都设置为最大值防止产生干扰
int startX = maxLoc.X- (templatW>>2);//
int startY = maxLoc.Y- (templatH >> 2);//
int endX = maxLoc.X+ (templatW >> 2);//
int endY = maxLoc.Y+ (templatH >> 2);//
if (startX < 0 || startY < 0)
{
startX = 0;
startY = 0;
}
if (endX > result.Width - 1 || endY > result.Height - 1)
{
endX = result.Width - 1;
endY = result.Height - 1;
}
int y, x;
for (y = startY; y < endY; y++)
{
for (x = startX; x < endX; x++)
{
CvInvoke.cvSetReal2D(result, y, x, maxVaule);
}
}

return result;

}

C# emgu 多模板匹配的更多相关文章

  1. 使用OpenCV&&C++进行模板匹配.

    一:课程介绍 1.1:学习目标 学会用imread载入图像,和imshow输出图像. 用nameWindow创建窗口,用createTrackbar加入滚动条和其回调函数的写法. 熟悉OpenCV函数 ...

  2. halcon三种模板匹配方法

    halcon有三种模板匹配方法:即Component-Based.Gray-Value-Based.Shaped_based,分别是基于组件(或成分.元素)的匹配,基于灰度值的匹配和基于形状的匹配,此 ...

  3. opencv 模板匹配与滑动窗口(单匹配) (多匹配)

    1单匹配: 测试图片:   code: #include <opencv\cv.h> #include <opencv\highgui.h> #include <open ...

  4. opencv 在工业中的应用:模板匹配

    模板匹配在工业中经常有两个用途,一模板匹配进行产品定位,二根据匹配度来判断是OK的产品还是NG的产品.我用OPENCV做了个模板匹配定位的DEMO. (1)点击打开图像按钮打开一幅图像 (2)点击定义 ...

  5. opencv如何用模板匹配寻找目标

    首先使用: MatchTemplate 比较模板和重叠的图像区域 void cvMatchTemplate( const CvArr* image, const CvArr* templ, CvArr ...

  6. [模式识别].(希腊)西奥多里蒂斯&lt;第四版&gt;笔记8它__模板匹配

      在语音识别方面,同样的话都是同一个人,每次说的情况是不同的,难以识别.本章是定义如何适应不同的情况有不同的特性指标. 1,基于最优路径搜索的度量:①贝尔曼最优性原则和动态编程②编辑距离(The E ...

  7. OpenCV探索之路(九):模板匹配

    模板匹配的作用在图像识别领域作用可大了.那什么是模板匹配? 模板匹配,就是在一幅图像中寻找另一幅模板图像最匹配(也就是最相似)的部分的技术. 说的有点抽象,下面给个例子说明就很明白了. 在上面这幅全明 ...

  8. OpenCV 学习笔记(模板匹配)

    OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够 ...

  9. halcon 模板匹配(最简单)

    模板匹配是机器视觉工业现场中较为常用的一种方法,常用于定位,就是通过算法,在新的图像中找到模板图像的位置.例如以下两个图像.   这种模板匹配是最基本的模板匹配.其特点只是存在平移旋转,不存在尺度变化 ...

随机推荐

  1. Conda常见命令

    Anaconda,Miniconda,Conda,Pip的区别: Anaconda:用于科学计算的python发行版,里面预装好了conda,某个版本的python,众多packages,科学计算工具 ...

  2. vim命令替换操作

    替换当前行第一个 vivian为sky :s/vivian/sky/ 替换当前行所有 vivian为sky :s/vivian/sky/g 替换第 n 行开始到最后一行中,每一行的第一个vivian为 ...

  3. BZOJ2839 集合计数 容斥

    题目描述(权限题qwq) 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取法的方案数,答案模100000000 ...

  4. 快速找出网站中可能存在的XSS漏洞实践

    笔者写了一些XSS漏洞的挖掘过程记录下来,方便自己也方便他人. 一.背景 在本篇文章当中会一permeate生态测试系统为例,笔者此前写过一篇文章当中笔者已经讲解如何安装permeate渗透测试系统, ...

  5. spring问题

    1.The matching wildcard is strict ,but no declaration can be found for element 'tx:annotation-driven ...

  6. Neo4j使用

    一.删除图 在开发过程中,很多时候需要快(简)速(单)清(粗)除(暴)Neo4j中存在的海量数据节点和关系数据 在这种情况下,delete和detach从性能上都已力不从心.Neo4j官方推荐清库方法 ...

  7. Helm包管理工具(简介、安装、方法)

    认识Helm 每次我们要部署一个应用都需要写一个配置清单(维护一套yaml文件),但是每个环境又不一样.部署一套新的环境成本是真的很高.如果我们能够使用类似于yum的工具来安装我们的应用的话那就太好了 ...

  8. Java IO系列之二:NIO基本操作

    核心部分  NIO( New Input/ Output) , 引入了一种基于通道和缓冲区的 I/O 方式,NIO 是一种同步非阻塞的 IO 模型.同步是指线程不断轮询 IO 事件是否就绪,非阻塞是指 ...

  9. echo 输入背景和字体常用方法

               ECHO输出背景颜色以及文字颜色输出格式:  echo -e "\033[字背景颜色;文字颜色m字符串\033[0m"例如:        echo -e & ...

  10. linux 每个小时释放一次cache

    echo 3 > /proc/sys/vm/drop_caches;