模板匹配是机器视觉工业现场中较为常用的一种方法,常用于定位,就是通过算法,在新的图像中找到模板图像的位置。例如以下两个图像。

 

这种模板匹配是最基本的模板匹配。其特点只是存在平移旋转,不存在尺度变化,同时光照变化不大。这样很适合常规的灰度模板匹配。但是利用opencv不太好解决角度的问题,同时速度上也达不到工业需求,因此,halcon的用途就来了。下面我详细介绍模板匹配的过程:

1 首先是选择区域。也就是ROI。我们先建一个矩形区域,以矩形的中点作为参考点。

//矩形区域	gen_rectangle1(&Rectangle, startpoint.y, startpoint.x, h + startpoint.y, w + startpoint.x);
//矩形中心点 area_center(Rectangle, &Area, &RowRef, &ColumnRef);
//设置ROI reduce_domain(ImageHalcon, Rectangle, &ImageReduced);

  2 新建模型。

create_ncc_model(ImageReduced, "auto", HTuple(-45).Rad(), HTuple(90).Rad(), "auto", "use_polarity", &ModelID);

  创建的NCC模型,这种模型是最简单的,只适用于光照变化不大,且不存在尺度变化的。建

立的模型以 ModelID 标识

3 模板匹配。载入待匹配的图像ImageSearch和之前的mode。

	find_ncc_model(ImageSearch, ModelID, HTuple(-45).Rad(), HTuple(90).Rad(), 0.5, 1, 0.5, "true", 0, &Row, &Column, &Angle,
&Score);

    4 匹配分析

if(Score.Num()>0)//如果score大于零 表明匹配正确
{
// 获取仿射变换矩阵HomMat2d,可以直接获取
vector_angle_to_rigid(RowRef, ColumnRef, 0, Row, Column, Angle, &HomMat2D);
affine_trans_region(Rectangle, &RegionAffineTrans, HomMat2D, "false");
// [a b c] [ a b]
//[ d e f] [ d e]为旋转 [c f]T 为平移
//
double a, b, c, d, e, f;
e = HomMat2D[0].D();
d = HomMat2D[1].D();
f = HomMat2D[2].D();
b = HomMat2D[3].D();
a = HomMat2D[4].D();
c = HomMat2D[5].D(); double angle;
angle = Angle[0].D() * 180 / 3.1415926;
//angleoff = 5*3.14159/180;
angleoff = Angle[0].D();
//ROI参考点中心在待匹配图像中的位置
centerpoint.x = Column[0].I();
centerpoint.y = Row[0].I();
endcenter = centerpoint;
cvCircle(m_testimage, centerpoint, 4, cvScalar(0, 0, 255), 2, 8, 0);
//当然,仿射变换矩阵我们可以直接通过旋转和平移求得
a = cos(angleoff);
b = sin(angleoff);
d = -sin(angleoff);
e = cos(angleoff);
c = endcenter.x - (a*startcenter.x + b*startcenter.y);
f = endcenter.y - (d*startcenter.x + e*startcenter.y); HTuple x1, y1, x2, y2;
x1 = 573;
y1 = 407;
//我们可以通过仿射变换矩阵,将模板图像中的一个点映射到待匹配图像中的点
Halcon::affine_trans_point_2d(HomMat2D, y1, x1, &y2, &x2);
CvPoint2D32f p1, p2;
p1.x = x2[0].D();
p1.y = y2[0].D(); x1 = 625;
y1 = 480; Halcon::affine_trans_point_2d(HomMat2D, y1, x1, &y2, &x2);
p2.x = x2[0].D();
p2.y = y2[0].D(); p1.x = (int)p1.x;
p1.y = (int)p1.y; p2.x = (int)p2.x;
p2.y = (int)p2.y; DispImage(ImageSearch); Halcon::disp_obj(RegionAffineTrans, HalHwndView1);
CString str;
str.Format("角度为:%.4f 度 :(%f , %f)", angle, xoff, yoff); cvLine(m_testimage, cvPoint(p1.x, p1.y), cvPoint(p2.x, p1.y), cvScalar(255, 0, 0));
cvLine(m_testimage, cvPoint(p1.x, p1.y), cvPoint(p1.x, p2.y), cvScalar(255, 0, 0));
cvLine(m_testimage, cvPoint(p2.x, p1.y), cvPoint(p2.x, p2.y), cvScalar(255, 0, 0));
cvLine(m_testimage, cvPoint(p1.x, p2.y), cvPoint(p2.x, p2.y), cvScalar(255, 0, 0)); str.Format("角度为:%.4f 度 已经匹配ROI的中心:(%d , %d)",angle, centerpoint.x,centerpoint.y);
GetDlgItem(IDC_STATIC_SWINFO)->SetWindowText(str);
cvNamedWindow("匹配结果",0);
cvShowImage("匹配结果",m_testimage); }else
{
CString str="没有匹配成功";
GetDlgItem(IDC_STATIC_SWINFO)->SetWindowText(str);
}

  

halcon 模板匹配(最简单)的更多相关文章

  1. halcon模板匹配

    在机器视觉应用中,经常需要对图像进行仿射变换.1.在基于参考的视觉检测中,由于待检图像与参考图像或多或少都会存在几何变化(平移.旋转.缩放等),所以在做比较之前一般都要对待检图像进行仿射变换以对齐图像 ...

  2. halcon 模板匹配 -- 转化 vector_angle_to_rigid

    ********************************模板匹配 ********************create_shape_model创建模板,这个函数有许多参数,其中金字塔的级数由N ...

  3. Halcon 模板匹配实战代码(一)

    模板图片:目标是获取图像左上角位置的数字 直接想法,直接用一个框将数字框出来,然后对图片进行模板匹配(不可行,因为图像中的数字不是固定的) 所以需要选择图像中的固定不变的区域来作为模板,然后根据模板区 ...

  4. 重新看halcon模板匹配

    工业中模板匹配有很多需求. 代码如下: read_image (Image, 'J:/测试图片/test1/1.bmp') get_image_size (Image, Width, Height) ...

  5. halcon 模板匹配 -- find_shape_model

    find_shape_model(Image : :  //搜索图像 ModelID, //模板句柄 AngleStart,  // 搜索时的起始角度 AngleExtent, //搜索时的角度范围, ...

  6. halcon 模板匹配 -- create_shape_model

    create_shape_model(Template : : //reduce_domain后的模板图像 NumLevels,//金字塔的层数,可设为“auto”或0—10的整数 AngleStar ...

  7. Atitit opencv模板匹配attilax总结

    Atitit opencv模板匹配attilax总结 找一幅图像的匹配的模板,可以在一段视频里寻找出我们感兴趣的东西,比如条形码的识别就可能需要这样类似的一个工作提取出条形码区域(当然这样的方法并不鲁 ...

  8. Halcon编程-基于形状特征的模板匹配

    halcon软件最高效的一个方面在于模板匹配,号称可以快速进行柔性模板匹配,能够非常方便的用于缺陷检测.目标定位.下面以一个简单的例子说明基于形状特征的模板匹配.      为了在右图中,定位图中的三 ...

  9. halcon三种模板匹配方法

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

随机推荐

  1. CF518D. Ilya and Escalator [概率DP]

    CF518D. Ilya and Escalator 题意:n个人,每秒p的概念队首的人进入电梯,求t秒后期望人数 直接使用期望定义 \(f[i][j]\) i秒后电梯中j个人的概率 注意n个人的时候 ...

  2. 汇编之EBP的认识。

    说到EBP就不能忽略了ESP.ESP是一个指针,始终执行堆栈的栈顶.而EBP就是那个所谓的堆栈了. 先看几个例子吧. push ebp ; 把ebp,堆栈的0地址压入堆栈 mov ebp,esp ; ...

  3. 2017人生总结(MECE分析法)

    试着用MECE分析法对人生的整个规划做一下总结.作为技术人员,其实除了编码架构能力之外,分析问题的能力的重要程度也会随着职业发展越来越重要.<美团点评技术博客>说这几天要在黄金时段头版头条 ...

  4. Visual Studio 2017 for Mac 连接Git的奇怪问题

    VS for Mac连接Git的时候遇到个奇怪的问题, 无法将已存在的解决方案绑定并提交到GitHub中去. VS版本7.3.3 问题复现 以为自己操作有问题, 新建项目测试一下, 新建的时候没有勾选 ...

  5. python中的变量,运算符

    范例: name = 'Crossin' myVar = 123 price = 5.99 visible = True “=”的作用是把右边的值赋予给左边的变量. python中有四种较为常见的数据 ...

  6. shell编程之运算符(3)

    declare声明变量类型 declare[+/-][选项]变量名 选项: - : 给变量设定类型属性 + : 取消变量的类型属性 -a : 将变量声明为数组型 -i : 将变量声明为整数型(inte ...

  7. PHPUnit 手册

    PHPUnit 手册 Sebastian Bergmann 版权 © 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 ...

  8. C控制语句:分支和跳转

    小技巧:程序return前加个getchar();可以让程序停住.%%可以打印使printf()中打印出%号 #include<stdio.h>#define SPACE ''int ma ...

  9. Js比较对Object类型进行排序

    <script> var data=[{name:"121",age:"18",year:"2018"},{name:" ...

  10. 第二十章 Django数据库实战

    第二十章 Django数据库实战 第一课 获取单表单数据的三种方式: urls.py中的路由代码: path('busniess',views.busniess), views.py中代码: def ...