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;

}

最新文章

  1. RabbitMQ简介
  2. SQL Server备份脚本
  3. bzoj1787 [Ahoi2008]Meet 紧急集合
  4. sublime text3安装相关知识粗略整理
  5. python(7)&ndash;类的多态实现
  6. 【转】Android中的颜色设置
  7. Java 测试Hibernate+Mysql简单的数据存储
  8. make TARGET_PRODUCT=am335xevm OMAPES=4.x rowboat_clean 出现sgx相关的错误
  9. 深圳尚学堂:Swift中的“!”和“?”
  10. SQL基本之增删查改操作
  11. linux使用shell脚本停止java进程
  12. 键盘ascll码表
  13. 【运维】Dell R710如何开启VT服务
  14. 如何停止处于stopping状态的windows服务
  15. 两场CF
  16. Java 反编译工具 —— JAD 的下载地址(Windows版/Linux版/Mac OS 版)
  17. JS下对日期进行比较
  18. python-Lock锁线程同步和互斥
  19. DPDK l3fwd
  20. hdu1166 敌兵布阵 线段树(区间更新)

热门文章

  1. [Cordova 之 入门篇]
  2. Vue.js 2.x笔记:安装与起步(1)
  3. JavaScript继承总结
  4. js 实现数据结构 -- 链表
  5. .Net Core 环境下构建强大且易用的规则引擎
  6. Spring cloud zuul跨域(二)
  7. pjb fabu
  8. 【CERC2016】【BZOJ4792】村庄 搜索
  9. Python 目录指引
  10. win10的MySQL客户端连接centos7虚拟机的mysql服务端连接不上解决办法