基于HALCON的模板匹配方法总结

合集下载

模板匹配

模板匹配

halcon模板匹配* 在一个图片中获取ROI并在此图片中匹配dev_close_window ()dev_open_window (0, 0, 600, 600, 'black', WindowHandle)* 窗口语句read_image(Image,'L:/Halcon test/mk2.jpg')*read_image(Image,'L:/Halcon test/mk3.jpg')*read_image(Image,'L:/Halcon test/mk4.jpg')* 这里有4张图片,每一张都说明一个小问题,附图分析。

gen_rectangle1 (ROI1, 57.8333, 49.5, 181.167, 342.833)* 画一个矩形选择ROI,矩形在左上角,覆盖一个完整的,无变形规定尺寸的商标,作为模板。

reduce_domain(Image,ROI1,ImageReduced1)* 大图和这个矩形的ROI相减就会得到一个左上角的商标的图案作为模板,命名ImageReduced。

create_shape_model(ImageReduced1,0,0,rad(360),0,'no_pregeneration','use_polarity',40,10,ModelID1)* 创建一个比例不变(1:1)的匹配的轮廓模型。

具体参数下个帖子说明,也可见[Halcon算子学习交流区] Halcon模版匹配算子解析。

find_shape_model(Image,ModelID1,0,rad(360),0.7,13,0.5,'interpolation',0,0.9,Row,Column,Angle,Score)* 寻找与模板的大小尺寸必须是一比一匹配的,只是角度的不同而已,若大小发生变化,则不能匹配get_shape_model_contours(ModelContours1,ModelID1,1)* 在大图中获取匹配。

halcon单目视觉模板匹配例子

halcon单目视觉模板匹配例子

在进行高质量、深度和广度兼具的文章撰写之前,我首先需要对您提出的主题进行全面评估和研究。

在本文中,我将按照您的要求,从简到繁地探讨“halcon单目视觉模板匹配例子”这一主题,以便您能更深入地理解。

在文章中,我会反复提及这一主题,并在总结回顾部分共享我的个人观点和理解。

请您耐心等待我的文章完成。

在深度了解halcon单目视觉模板匹配例子之前,我们需要先了解一些基础知识。

Halcon是一种先进的机器视觉库,它具有强大的图像处理和分析能力,可以应用于工业自动化、质量控制、医学影像等领域。

而单目视觉模板匹配则是Halcon中的重要功能之一,它能够在图像中找到指定模板的位置,从而实现对象识别和定位的功能。

通过模板匹配,我们可以实现自动化生产线上的零件检测、物体定位和跟踪等任务。

接下来,让我们以最简单的例子开始,来了解单目视觉模板匹配的基本原理。

假设我们有一张包含特定物体的模板图像,我们希望在另一张大图像中找到并定位该物体的位置。

这时,我们可以利用Halcon提供的模板匹配功能来实现这一目标。

我们需要在模板图像中提取出物体的特征,然后将其用于在大图像中进行匹配。

Halcon的模板匹配功能可以帮助我们快速准确地找到并定位物体的位置,实现自动化检测和定位的需求。

然而,现实中的应用场景往往更加复杂和多样化。

在工业生产线上,我们可能需要处理物体旋转、缩放、遮挡等情况。

这就需要我们对单目视觉模板匹配功能有更深入的理解和应用。

Halcon提供了丰富的参数和算法,可以帮助我们应对各种复杂情况。

通过设置旋转不变性参数,我们可以在一定范围内实现对旋转变换的兼容;通过使用多尺度匹配算法,我们可以处理物体尺度的变化;通过使用区域过滤器,我们可以处理部分遮挡的情况。

这些高级功能使得Halcon在工业自动化领域具有广泛的应用前景。

对于个人的理解和观点,我认为单目视觉模板匹配是机器视觉领域中一项非常重要的技术。

它可以帮助我们实现自动化生产和质量控制,提高生产效率和产品质量。

halcon find_scaled_shape_model 原理

halcon find_scaled_shape_model 原理

halcon find_scaled_shape_model 原理HALCON是一款先进的机器视觉库,提供了丰富的图像处理和分析功能。

其中之一的find_scaled_shape_model函数是一个强大的形状匹配算法,用于在图像中快速准确地找到和匹配一个已知的对象模型。

在本文中,我们将详细介绍find_scaled_shape_model函数的原理和工作流程。

同时,我们还会讨论与该函数相关的一些重要概念和技术。

原理:find_scaled_shape_model是基于模板匹配的算法。

模板匹配是一种基本的图像处理技术,用于在图像中检测并匹配一个已知的模板(或形状)。

它的原理是通过比较模板与图像中的局部区域,寻找最佳的匹配位置。

find_scaled_shape_model通过对模型的缩放进行建模,可以在不同尺度下进行匹配,从而提高匹配的鲁棒性和准确性。

其主要工作流程如下所示:1. 准备模型:首先,需要准备一个模型图像作为匹配的参考。

模型图像通常是对象的正面或侧面视图。

该模型图像应具有明确的边界和特征,以便能够在图像中准确匹配。

2. 计算形状模型:接下来,通过find_scaled_shape_model函数,使用模型图像来计算形状模型。

形状模型是一种通过对模型图像进行特征分析和建模而得到的数学描述。

它捕捉了模型的形状和结构信息,以便在后续的匹配过程中进行比较和匹配。

3. 在图像中搜索模型:一旦形状模型计算完成,find_scaled_shape_model函数可以开始在输入图像中搜索模型。

为了提高效率,可以指定一个搜索区域,限制搜索的范围。

在搜索过程中,函数将使用形状模型对图像中的局部区域进行比较,并计算出匹配分数。

匹配分数通常表示了形状模型与图像中各个局部区域的相似度。

4. 匹配处理:当搜索过程完成后,find_scaled_shape_model函数将根据匹配分数,找到与模型最相似的图像局部区域。

halcon 模板匹配结果按列排序算子

halcon 模板匹配结果按列排序算子

halcon 模板匹配结果按列排序算子
在HALCON中,可以使用算子`affine_trans_contour_xld`对模板匹配结果进行按列排序。

该算子的函数原型为`affine_trans_contour_xld(Contours : ContoursAffineTrans : HomMat2D : )`,其中`Contours`为输入的XLD轮廓,`ContoursAffineTrans`为转换后的XLD轮廓,`HomMat2D`为输入的转换矩阵。

仿射变换由`HomMat2D`中给出的齐次变换矩阵来描述,该矩阵可以使用`hom_mat2d_identity`、`hom_mat2d_scale`、`hom_mat2d_rotate`、`hom_mat2d_translate`等运算符创建,也可以是`vector_angle_to_rigid`等运算符的结果。

齐次变换矩阵的组成部分解释如下:图像的行坐标对应于定义变换矩阵的坐标系的x,列坐标对应于定义变换矩阵的坐标系的y。

这对于获得图像的右手坐标系是必要的。

特别是,这样可以确保在正确的方向上执行旋转。

注意,矩阵的(x,y)顺序与图像中坐标的通常(行、列)顺序相对应。

通过使用`affine_trans_contour_xld`算子,可以将任意仿射2D变换(如缩放、旋转、平移和倾斜)应用于轮廓中给定的XLD轮廓,并返回变换后的轮廓。

这样,就可以根据需要对模板匹配结果进行按列排序。

Halcon创建模板并进行模板匹配

Halcon创建模板并进行模板匹配

Halcon创建模板并进⾏模板匹配在进⾏图像处理时,很多时候创建模板并通过匹配模板进⾏图像基准点的分析能⼤⼤提⾼ROI的选取准确度和效率。

下⾯通过实例来讲述模板匹配的快速学习应⽤。

⾸先创建模板先读取图像,对读取的图像创建模板并保存,创建模板要挑选的是所有图像都存在的特征或区域以保证在实际处理时程序都能够正常进⾏图像分析处理。

Halcon中以draw开头的算⼦都是需要⼈在图像上⼿动绘制,代码如下:1 *读取图像2 read_image (Image, 'H:/NEW IMAGE/21.tiff')3 *在图像上⼿动绘制ROI,即选择绘制的模板区域4 draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)5 *将绘制的模板区域⽣成矩形6 gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)7 *提取出区域的图像,作为模板图像8 reduce_domain (Image, Rectangle, ImageReduced1)9 *创建模板10 create_shape_model (ImageReduced1, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)11 *将创建的模板存成指定路径的⽂件12 write_shape_model (ModelID, 'E:/modle1.shm')模板创建完后下⾯的处理程序只需要上⾯代码最后保存的那个模板⽂件,代码如下:1 *读取图像2 read_image (Image1, 'H:/NEW IMAGE/13.tiff')3 *读取模板⽂件4 read_shape_model ('E:/modle1.shm', ModelID1)5 *在图像中查找模板,并返回模板的中⼼坐标6 find_shape_model (Image1, ModelID1, -0.39, 0.78, 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row1, Column1, Angle1, Score1)7 *匹配到模板8if(|Row1|==1)9 *在图像中显⽰模板10 dev_display_shape_matching_results (ModelID1, 'red', Row1, Column1, Angle1, 1, 1, 0)11 endif以上就是简单的模板创建以及模板匹配,希望对⼤家有所帮助,谢谢。

5-HALCON_各种定位方法

5-HALCON_各种定位方法

模板参数-Optimization
相同环境下,Optimization取值不同时的运行时 间对比
◆ ◆ ◆ ◆ none point_reduction_low point_reduction_medium point_reduction_high 14.53 12.53 11.39 10.67 ms ms ms ms
◆ set_system('pregenerate_shape_models','true'/'false')
如果没有设置,默认为
◆ set_system('pregenerate_shape_models','false')
模板参数-Optimization
相同环境下,Optimization第二个参数取值不同时的运行时间对比
对比图太低
合适的对比度
对比度太高
模板参数-Contrast
参数Contrast不仅仅是对比度,根据数组元素数量不 同,其意义不同
◆ 1个元素时:128,对比度,直接提取边缘 ◆ 2个元素时:[100, 128],表示使用磁滞分割来提取边缘 ◆ 3个元素时:[100, 128, 10],前两个参数同2,最后一个参数表 示所提取边缘的最小长度为10.
multiple_scales.dev
print_check.dev
96ms
113ms
13s
1.1s
40ms
13ms
44ms
13ms
因此,建议当内存较大,就选预创建的方式,如 果CPU速度快,就可以选另外方式。
模板参数-Metric
照明与成像
背景白色

halcon模板总结-笔记

halcon模板总结-笔记
• 缩小图像域 ○ 使用reduce_domain算子 ○ reduce_domain (GrayImage, Rectangle, ImageReduced)
• 创建模板 ○ 使用create_shape_model算子 ○ create_shape_model (ImageReduced, 'auto', 0, rad(360), 'auto', 'none',
制作模板
2020-04-15 9:27
• 读取图片
○ 使用read_image算子 ○ read_image(InputImage,'./屏幕切割/y1.png')
• RGB转灰度图像
○ 使用rgb1_to_gray算子 ○ rgb1_to_gray (InputImage, GrayImage)
• 画矩形
○ write_shape_model (ModelID, halconModelName) • 在图像中找到形状模型的最佳匹配
○ find_shape_model (ImageReduced, ModelID, 0, rad(360), 0.5, 1, 0.5, 'least_squares',
0, 0.9, ModelRow, ModelColumn, Angle, Score)
• 把参数保存起来并关闭模板
○ write_tuple (Xtuple, 'Xtuple.tup') ○ clear_shape_model (ModelID)
• 总结 ○ 读取图片后利用RGB转灰度获得单通道图片 ○ 画个0度矩形来分割图片 ○ 把分割出来的图片做成模板保存起来 ○ 利用find_shape_model这个算子来进行形状匹配 ○ 重新画0度矩形来定位模板 ○ 获得模板的中心坐标、角度、长宽,并计算出两者的偏移量 ○ 保存参数

Halcon获取匹配到的模板区域

Halcon获取匹配到的模板区域

Halcon获取匹配到的模板区域在使⽤Halcon进⾏模板匹配的时候,我们使⽤find_shape_model、find_scaled_shape_model等算⼦找到模板后返回的是实例,得到的数据是模板中⼼的⾏列坐标、⾓度和缩放⽐例等数据,不是具体的区域,下⾯介绍怎么得到具体区域。

解决思路:⼀:先获取模板的轮廓,此时获取的轮廓位置在(0,0)的位置;⼆:求出模板到匹配实例的旋转矩阵;三:利⽤仿射变换得到匹配实例的轮廓;四:将轮廓转成区域;代码及注释讲解:1//获取初始模板轮廓2 get_shape_model_contours (ModelContours1, ModelID, 1)3//进⾏模板匹配找模板4 find_scaled_shape_model (Image0, ModelID, -3.14, 6.29, 0.95, 1.1, 0.90, 6, 0.5, 'least_squares', 8, 0.9, RowModel3, ColumnModel3, AngleModel3, Scale, Score1) 5if(|RowModel3|>0)//如果找到的模板数量⼤于06//显⽰找到的模板轮廓7 dev_display_shape_matching_results (ModelID, 'red', RowModel3, ColumnModel3, AngleModel3, 1, 1, 0)8//循环遍历每个找到的实例9for I := 0 to |Score1| - 1 by 110//求出初始模板到实例中间的旋转矩阵--注:初始模板的⾏列坐标和⾓度都是011 vector_angle_to_rigid (0, 0, 0, RowModel3[I], ColumnModel3[I], AngleModel3[I], HomMat2DRotate)12//给旋转矩阵添加缩放信息13 hom_mat2d_scale (HomMat2DRotate, Scale[I], Scale[I], RowModel3[I], ColumnModel3[I], HomMat2DScale)14//通过初始模板和旋转矩阵运算得到模板实例的轮廓15 affine_trans_contour_xld (ModelContours1, ModelTrans, HomMat2DScale)16//轮廓转区域17 gen_region_contour_xld (ModelTrans, Region, 'filled')18 endif。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于HALCON的模板匹配方法总结
分类:halcon学习2013-06-26 16:02 47人阅读评论(0) 收藏举报
halcon形状匹配算法
德国MVTec公司开发的HALCON机器视觉开发软件,提供了许多的功能,在这里我主要学习和研究了其中的形状匹配的算法和流程。

HDevelop开发环境中提供的匹配的方法主要有三种,即Component-Based、Gray-Value-Based、Shape-Based,分别是基于组件(或成分、元素)的匹配,基于灰度值的匹配和基于形状的匹配。

这三种匹配的方法各具特点,分别适用于不同的图像特征,但都有创建模板和寻找模板的相同过程。

这三种方法里面,我主要就第三种-基于形状的匹配,做了许多的实验,因此也做了基于形状匹配的物体识别,基于形状匹配的视频对象分割和基于形状匹配的视频对象跟踪这些研究,从中取得较好的效果,简化了用其他工具,比如VC++来开发的过程。

在VC下往往针对不同的图像格式,就会弄的很头疼,更不用说编写图像特征提取、模板建立和搜寻模板的代码呢,我想其中间过程会很复杂,效果也不一定会显著。

下面我就具体地谈谈基于HALCON的形状匹配算法的研究和心得总结。

1. Shape-Based matching的基本流程
HALCON提供的基于形状匹配的算法主要是针对感兴趣的小区域来建立模板,对整个图像建立模板也可以,但这样除非是对象在整个图像中所占比例很大,比如像视频会议中人体上半身这样的图像,我在后面的视频对象跟踪实验中就是针对整个图像的,这往往也是要牺牲匹配速度的,这个后面再讲。

基本流程是这样的,如下所示:
⑴首先确定出ROI的矩形区域,这里只需要确定矩形的左上点和右下点的坐标即可,gen_rectangle1()这个函数就会帮助你生成一个矩形,利用area_center()找到这个矩形的中心;
⑵然后需要从图像中获取这个矩形区域的图像,reduce_domain()会得到这个ROI;这之后就可以对这个矩形建立模板,而在建立模板之前,可以先对这个区域进行一些处理,方便以后的建模,比如阈值分割,数学形态学的一些处理等等;
⑶接下来就可以利用create_shape_model()来创建模板了,这个函数有许多参数,其中金字塔的级数由Numlevels指定,值越大则找到物体的时间越少,AngleStart和AngleExtent决定可能的旋转范围,AngleStep指定角度范围搜索的步长;这里需要提醒的是,在任何情况下,模板应适合主内存,搜索时间会缩短。

对特别大的模板,用Optimization来减少模板点的数量是很有用的;MinConstrast将模板从图像的噪声中分离出来,如果灰度值的波动范围是10,则MinConstrast应当设为10;Metric参数决定模板识别的条件,如果设为’use_polarity’,则图像中的物体和模板必须有相同的对比度;创建好模板后,这时还需要监视模板,用inspect_shape_model()来完成,它检查参数的适用性,还能帮助找到合适的参数;另外,还需要获得这个模板的轮廓,用于后面的匹配,get_shape_model_contours()则会很容易的帮我们找到模板的轮廓;
⑷创建好模板后,就可以打开另一幅图像,来进行模板匹配了。

这个过程也就是在新图像中寻找与模板匹配的图像部分,这部分的工作就由函数find_shape_model()来承担了,它也拥有许多的参数,这些参数都影响着寻找模板的速度和精度。

这个的功能就是在一幅图中找出最佳匹配的模板,返回一个模板实例的长、宽和旋转角度。

其中参数SubPixel决定是否精确到亚像素级,设为’interpolation’,则会精确到,这个模式不会占用太多时间,若需要更精确,则可设为’least_square’,’lease_square_high’,但这样会增加额外的时间,因此,这需要在时间和精度上作个折中,需要和实际联系起来。

比较重要的两个参数是MinSocre和Greediness,前一个用来分析模板的旋转对称和它们之间的相似度,值越大,则越相似,后一个是搜索贪婪度,这个值在很大程度上影响着搜索速度,若为0,则为启发式搜索,很耗时,若为1,则为不安全搜索,但最快。

在大多数情况下,在能够匹配的情况下,尽可能的
增大其值。

⑸找到之后,还需要对其进行转化,使之能够显示,这两个函数vector_angle_to_rigid()和affine_trans_contour_xld()在这里就起这个作用。

前一个是从一个点和角度计算一个刚体仿射变换,这个函数从匹配函数的结果中对构造一个刚体仿射变换很有用,把参考图像变为当前图像。

其详细的流程图和中间参数,如下图所示:(无法上传)
2. 基于形状匹配的参数关系与优化
在HALCON的说明资料里讲到了这些参数的作用以及关系,在上面提到的文章中也作了介绍,这里主要是重复说明一下这些参数的作用,再强调一下它们影响匹配速度的程度;在为了提高速度而设置参数之前,有必要找出那些在所有测试图像中匹配成功的设置,这时需考虑以下情况:
①必须保证物体在图像边缘处截断,也就是保证轮廓的清晰,这些可以通过形态学的一些方法来处理;
②如果Greediness值设的太高,就找不到其中一些可见物体,这时最后将其设为0来执行完全搜索;
③物体是否有封闭区域,如果要求物体在任何状态下都能被识别,则应减小MinScore 值;
④判断在金字塔最高级上的匹配是否失败,可以通过find_shape_model()减小NumLevels 值来测试;
⑤物体是否具有较低的对比度,如果要求物体在任何状态下都能被识别,则应减小MinContrast值;
⑥判断是否全局地或者局部地转化对比度极性,如果需要在任何状态下都能被识别,则应给参数Metric设置一个合适的值;
⑦物体是否与物体的其他实例重叠,如果需要在任何状态下都能识别物体,则应增加MaxOverlap值;
⑧判断是否在相同物体上找到多个匹配值,如果物体几乎是对称的,则需要控制旋转范围;
如何加快搜索匹配,需要在这些参数中进行合理的搭配,有以下方法可以参考:
①只要匹配成功,则尽可能增加参数MinScore的值;
②增加Greediness值直到匹配失败,同时在需要时减小MinScore值;
③如果有可能,在创建模板时使用一个大的NumLevels,即将图像多分几个金字塔级;
④限定允许的旋转范围和大小范围,在调用find_shape_model()时调整相应的参数;
⑤尽量限定搜索ROI的区域;
除上面介绍的以外,在保证能够匹配的情况下,尽可能的增大Greediness的值,因为在后面的实验中,用模板匹配进行视频对象跟踪的过程中,这个值在很大程度上影响到匹配的速度。

当然这些方法都需要跟实际联系起来,不同图像在匹配过程中也会有不同的匹配效果,在具体到某些应用,不同的硬件设施也会对这个匹配算法提出新的要求,所以需要不断地去尝试。

在接下来我会结合自己做的具体的实验来如何利用HALCON来进行实验,主要是在视频对象分割和视频对象的跟踪方面。

相关文档
最新文档