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

 

这种模板匹配是最基本的模板匹配。其特点只是存在平移旋转,不存在尺度变化,同时光照变化不大。这样很适合常规的灰度模板匹配。但是利用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. Visual Studio 2017 Enterprise (15.3)

    版本15.3更新在用户离线下载时更加人性化,包含了进度显示,下载出错可以输入R,进行下载的重新尝试,并在当前下载框下继续下载为完成的作业,结合 --layout 参数的离线文件的检查和修复,并且在下载 ...

  2. httping:测量网站延迟

    遇到网络问题的时候,我们一般会先通过 ping 这个工具来了解基本的情况.httping 与 ping 类似,不过它不是发送 ICMP 请求,而是发送 HTTP 请求.利用 httping,我们可以测 ...

  3. 洛谷P2756飞行员配对方案问题 P2055假期的宿舍【二分图匹配】题解+代码

    洛谷 P2756飞行员配对方案问题 P2055假期的宿舍[二分图匹配] 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架 ...

  4. Json对象与Json字符串互转(4种转换方式)(转)

    1>jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象  2> ...

  5. 深入理解ES6之—对象

    Object新方法 Object.is()方法 在js中比较两个值时,你可能会用相等运算符==或者严格相等运算符 ===.为了避免在比较时发生强制类型转换,许多开发者更倾向于使用后者. Object. ...

  6. 一种解决eclipse中安装maven出错的方法

    1.安装步骤:https://jingyan.baidu.com/article/a17d5285feb4dd8099c8f26e.html 2.安装第三步的解决办法:m2e   路径换成  http ...

  7. C语言_简单的阶乘函数

    include <stdio.h> long jc (int num); long jc2 (int num); int main() { long n; n = jc(); printf ...

  8. Mac下VirtualBox共享文件夹设置

    环境:CentOS7.2最小化安装 步骤: 先安装必要软件包 yum install -y gcc gcc-devel gcc-c++ gcc-c++-devel make kernel kernel ...

  9. hdu1698 Just a Hook 线段树

    共有Q个更新,每次更新给更新的区间一个标记,表示该区间是在哪一次被更新,最后统计答案是以最近被更新的值为答案. AC代码: #include<cstdio> const int maxn= ...

  10. 转载微信公众号 测试那点事:Jmeter乱码解决

    原文地址: http://mp.weixin.qq.com/s/4Li5z_-rT0HPPQx9Iyi5UQ  中文乱码一直都是比较让人棘手的问题,我们在使用Jmeter的过程中,也会遇到中文乱码问题 ...