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

 

这种模板匹配是最基本的模板匹配。其特点只是存在平移旋转,不存在尺度变化,同时光照变化不大。这样很适合常规的灰度模板匹配。但是利用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. USACO 状压DP练习[3]

    1725 题意:$m*n:\ m,n \le 12$的牧场,有的格子不能选,相邻不能同时选,求方案数 $f[i][j]$前$i$行当前行选的集合为$j$ #include <iostream&g ...

  2. BZOJ 3585: mex [主席树]

    3585: mex Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 787  Solved: 422[Submit][Status][Discuss] ...

  3. iterator和for of 循环

    JavaScript 原有的表示"集合"的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Map和Set.这样就有了四种数据集合,用户还可以组合使用它们, ...

  4. .NET图表控件(LightningChart )的用法

    概述 LightningChart (LightningChart Ultimate) 软件开发工具包是微软Visual Studio 的一个插件,专攻大数据可视化呈现问题,用于 WPF(Window ...

  5. 阿里云学习之API网关

    注:此处仅供api的创建做一个补充参考,API网关的优缺点及创建过程中的参数详情,请参考阿里云开放文档:https://helpcdn.aliyun.com/document_detail/29478 ...

  6. WPF ----在UserControl的xaml里绑定依赖属性

    场景:在定义wpf 用户控件的时候,希望使用时设置自定义的属性来改变用户控件里的状态或内容等. 下面直接上实例代码: 用户控件的后台代码,定义依赖属性 public partial class MyU ...

  7. memcached 的实践操作

    memcached安装和使用   yum install -y libevent  memcached  libmemcached   启动命令:   /etc/init.d/memcached st ...

  8. NOIP 总结

    NOIP 总结 实在不知道写什么标题 决定还是把我的noip总结贴上来,毕竟保存还是挺麻烦的. 扯淡 联赛考完有三个星期了,成绩也出了一个星期左右了. 终于还是决定动笔写一点联赛的总结. Day1 可 ...

  9. 菜鸟之旅——.NET垃圾回收机制

    .NET的垃圾回收机制是一个非常强大的功能,尽管我们很少主动使用,但它一直在默默的在后台运行,我们仍需要意识到它的存在,了解它,做出更高效的.NET应用程序:下面我分享一下我对于垃圾回收机制(GC)的 ...

  10. js在函数中未定义的变量的处理

    <html> <head> <script type="text/javascript"> var z=1; function abc(){ x ...