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

 

这种模板匹配是最基本的模板匹配。其特点只是存在平移旋转,不存在尺度变化,同时光照变化不大。这样很适合常规的灰度模板匹配。但是利用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. DaemonSet 典型应用场景 - 每天5分钟玩转 Docker 容器技术(129)

    Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本.DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本. DaemonS ...

  2. CentOS7 修改网卡名称为eth0

    前言 无论是RHEL 7.还是CentOS 7都使用了NetworkManager.service来进行网络管理,当然network服务还是可以继续使用的,但也将会是过渡期的残留品了. 除此之外7版本 ...

  3. pinvoke 数据交互笔记

    intptr to array string string[]  _outputStrArray=null;  int channelCount = 0;///返回数组大小            In ...

  4. [翻译] 编写高性能 .NET 代码--第二章 GC -- 配置选项

    配置选项 在基于"less rope to hang yourself with"思想下,.NET 框架没有给开发提供很多太多的配置选项.但在大多数情况下,GC会跟你的硬件配置,及 ...

  5. bzoj1150 [CTSC2007]数据备份Backup 双向链表+堆

    [CTSC2007]数据备份Backup Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2727  Solved: 1099[Submit][Stat ...

  6. HDU - 1213 dfs求联通块or并查集

    思路:给定一个无向图,判断有几个联通块. AC代码 #include <cstdio> #include <cmath> #include <algorithm> ...

  7. php-fpm问题

    这个问题怎么说呢?之前遇到这个问题内心是奔溃的.因为我压根不知道是哪里出问题啦.不过,在我努力探索下,最终还是解决了问题. so请记住,坚持不一定成功,但放弃一定失败. 简单描述一下问题: 1.本地的 ...

  8. Request processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of type: class cn.e3mall.pojo.TbItem

    这个异常是缺少json相关的包 把以下依赖补上就好: <!-- Jackson Json处理工具包 --><dependency> <groupId>com.fas ...

  9. 安装VMware Workstation提示the msi failed的解决办法

    有朋友安装VMware Workstation时出现报错,提示the msi failed等信息,原来他以前安装过绿色版.优化版的VM,但删掉后重装VM就会有这样的报错提示,如果你也遇到了相同的困扰, ...

  10. 区块链 PoW 与 PoS 的纷争

    最近在研究区块链,可能会有一些非前端文章,感兴趣的可以关注关注哟. 有关注区块链的,肯定会经常看到这两个名词 -- PoW 与 PoS.但是很多人对他们的含义的理解存在很多偏差.那么他们的含义与区别是 ...