Halcon:模版匹配

一:函数介绍

1.创建模板

create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)

Template :模板图像

NumLevels:图像金字塔级数,该值越小,模板匹配耗时越长,可设置自动-‘Auto’可使用get_shape_model_params来获取模板所有参数,包括级数。

AngleStart:模板起始角度。

AngleExtent:模板角度幅度,若目标有旋转,模板需做不同角度。

AngleStep:角度步长,可设置自动-‘Auto’。

注:若选择预生产模式,不同角度的模板在创建模板时生成。否则在匹配find_shape_model时生成,这样无疑会耗费更长的模板匹配时间。

Optimization:模板点储存模式,设为’none’时,全点储存,若选择点较少时,匹配分值可能较低。当设为’auto’时,点数自动减少。当模板较小时,较少点数并不会降低模板匹配时间,因为将有更多的可能的实例必须被检查。所以当模板较大时,可较少点数,用于提速。

Metric:图像与模板中对比度差异不大时,选择'use_polarity';设为'ignore_global_polarity',只有对比度相反的对象才会被发现,且模板与噪声区分开来。在可提取完整模板信息的前提下,设置偏大,可减少噪声提取。

ModelID:输出创建模板ID。

 

2.查找模板

find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)

Image:搜索图像

ModelID:模板ID

AngleStart:搜索起始角度

AngleExtent:搜索角度幅度。匹配时,从图像Image中搜索设定角度范围内的模板

MinScore:最小匹配分值,大于该分值才可被搜索到.参数MinScore定义模板匹配时至少有个什么样的质量系数才算是在图像中找到模板。MinScore设置的越大,搜索的就越快。如果模板在图像中没有被遮挡,MinScore可以设置为0.8这么高甚至0.9。

NumMatches:匹配个数。若满足匹配分值的结果个数大于该值NumMatches,则返回质量系数最好的结果;若满足匹配分值的结果个数小于等于该值NumMatches,则返回的所有满足匹配分值的结果;设为0时,返回所有满足分值的结果。

MaxOverlap:如果模型具有对称性,会在搜索图像的同一位置和不同角度上找到多个与目标匹配的区域。参数MaxOverlap是0到1之间的,定义了找到的两个目标区域最多重叠的系数,以便于把他们作为两个不同的目标区域分别返回。如果找到的两个目标区域彼此重叠并且大于MaxOverlap,仅仅返回效果最好的一个。重叠的计算方法是基于找到的目标区域的任意方向的最小外接矩形(看smallest_rectangle2)。如果MaxOverlap=0, 找到的目标区域不能存在重叠, 如果MaxOverla p=1,所有找到的目标区域都要返回。

SubPixel:精度控制,该参数的选择影响定位结果参数(位置,角度,缩放比例)。精度越高速度越慢。None(不使用亚像素-100%)-'interpolation'(差值亚像素-100%-0.079)-'least_squares_high'(最小二乘亚像素-120%-0.025)-'least_squares_high'(最小二乘亚像素-131%-0.014)- 'least_squares_very_high'(最小二乘亚像素-142%-0.013),【方法(解释-耗时-角度误差)】

NumLevels:搜索时使用金字塔层数.如果NumLevels=0,使用创建模板时金字塔的层数。

Greediness:用于控制定位加速。该值越大,速度越快,找丢模板的几率也越大。推荐值0.7-0.9.

 

二、Shape-Based matching的基本流程

   HALCON提供的基于形状匹配的算法主要是针对感兴趣的小区域来建立模板,对整个图像建立模板也可以,但这样除非是对象在整个图像中所占比例很大,比如像视频会议中人体上半身这样的图像,我在后面的视频对象跟踪实验中就是针对整个图像的,这往往也是要牺牲匹配速度的,这个后面再讲。基本流程是这样的,如下所示:
    1. 首先确定出ROI的矩形区域,这里只需要确定矩形的左上点和右下点的坐标即可,gen_rectangle1()这个函数就会帮助你生成一个矩形,利用area_center()找到这个矩形的中心; 
    2. 然后需要从图像中获取这个矩形区域的图像,reduce_domain()会得到这个ROI;这之后就可以对这个矩形建立模板,而在建立模板之前,可以先对这个区域进行一些处理,方便以后的建模,比如阈值分割,数学形态学的一些处理等等;

    3. 接下来就可以利用create_shape_model()来创建模板了,这个函数有许多参数,其中金字塔的级数由Numlevels指定,值越大则找到物体的时间越少,AngleStart和AngleExtent决定可能的旋转范围,AngleStep指定角度范围搜索的步长;这里需要提醒的是,在任何情况下,模板应适合主内存,搜索时间会缩短。对特别大的模板,用Optimization来减少模板点的数量是很有用的;MinConstrast将模板从图像的噪声中分离出来,如果灰度值的波动范围是10,则MinConstrast应当设为10;Metric参数决定模板识别的条件,如果设为’use_polarity’,则图像中的物体和模板必须有相同的对比度;创建好模板后,这时还需要监视模板,用inspect_shape_model()来完成,它检查参数的适用性,还能帮助找到合适的参数;另外,还需要获得这个模板的轮廓,用于后面的匹配,get_shape_model_contours()则会很容易的帮我们找到模板的轮廓;


    4. 创建好模板后,就可以打开另一幅图像,来进行模板匹配了。这个过程也就是在新图像中寻找与模板匹配的图像部分,这部分的工作就由函数find_shape_model()来承担了,它也拥有许多的参数,这些参数都影响着寻找模板的速度和精度。这个的功能就是在一幅图中找出最佳匹配的模板,返回一个模板实例的长、宽和旋转角度。其中参数SubPixel决定是否精确到亚像素级,设为’interpolation’,则会精确到,这个模式不会占用太多时间,若需要更精确,则可设为’least_square’,’lease_square_high’,但这样会增加额外的时间,因此,这需要在时间和精度上作个折中,需要和实际联系起来。比较重要的两个参数是MinSocre和Greediness,前一个用来分析模板的旋转对称和它们之间的相似度,值越大,则越相似,后一个是搜索贪婪度,这个值在很大程度上影响着搜索速度,若为0,则为启发式搜索,很耗时,若为1,则为不安全搜索,但最快。在大多数情况下,在能够匹配的情况下,尽可能的增大其值。


    5. 找到之后,还需要对其进行转化,使之能够显示,这两个函数vector_angle_to_rigid()和affine_trans_contour_xld()在这里就起这个作用。前一个是从一个点和角度计算一个刚体仿射变换,这个函数从匹配函数的结果中对构造一个刚体仿射变换很有用,把参考图像变为当前图像。

 

三、基于形状匹配的参数关系与优化                       

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

如何加快搜索匹配,需要在这些参数中进行合理的搭配,有以下方法可以参考:
     ①  只要匹配成功,则尽可能增加参数MinScore的值;
     ②  增加Greediness值直到匹配失败,同时在需要时减小MinScore值;
     ③  如果有可能,在创建模板时使用一个大的NumLevels,即将图像多分几个金字塔级;
     ④  限定允许的旋转范围和大小范围,在调用find_shape_model()时调整相应的参数;
     ⑤  尽量限定搜索ROI的区域;
    除上面介绍的以外,在保证能够匹配的情况下,尽可能的增大Greediness的值,因为在后面的实验中,用模板匹配进行视频对象跟踪的过程中,这个值在很大程度上影响到匹配的速度。
    当然这些方法都需要跟实际联系起来,不同图像在匹配过程中也会有不同的匹配效果,在具体到某些应用,不同的硬件设施也会对这个匹配算法提出新的要求,所以需要不断地去尝试。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java基础英语---第二十六天

Terminate [ tə:mineit ] 结束 Instantiation [in,stnʃieiʃən] 实例化 Instance declared [diklεəd] 公然的 Access [ əkses ] 进入,接近,入口,通道 Accessible [əksesəbl] 可进入的 invoke [invəuk] 调用 board [bɔ:d] 木板,甲板 MainBoard card [kɑ:d] …

ASP.NET Core部署到Linux服务器(CentOS7 x64)

前言 本文主要讲解如何一步步将ASP.NET Core网站发布到Linux服务器,文中会讲解具体步骤及需要避免的各种问题。 目录 一、环境介绍 二、创建及发布ASP.NET Core网站项目 三、服务器软件安装(.NET Core SDK) 四、在服务器上部署ASP.NET Core网…

redux进一步优化

1. 将原来的 mapStateToDispatch 中的函数提取出来,放在组件中, 如原来的: function mapStateToProps(state, ownProps) {return {hasMore:state.getIn([tabs,hasMore]),} } function mapDispatchToProps(dispatch) {return {addTabList:(i…

C# : 调用C++动态库(dll)

在实际软件开发过程中,由于公司使用了多种语言开发,在C#中可能需要实现某个功能,而该功能可能用其他语言已经实现了,那么我们可以调用其他语言写好的模块吗?还有就是,由于C#开发好的项目,我们可…

Python3.5以上版本lxml导入etree报错Unresolved reference

Web抓取Web站点使用HTML描述,这意味着每个web页面是一个结构化的文档。有时从中 获取数据同时保持它的结构是有用的。web站点不总是以容易处理的格式, 如 csv 或者 json 提供它们的数据。 这正是web抓取出场的时机。Web抓取是使用计算机程序将web页面数据…

linux设置history历史记录

#说明export HISTSIZE1000 #设置历史记录显示1000行export HISTTIMEFORMAT%F %T #设置历史记录格式 999 2017-08-15 10:58:32 #修改vim /etc/profilesed -i "s/\(HISTSIZE\).*/\11000/" /etc/profilesed -i "/HISTSIZE/aexport HISTTIMEFORMAT%F %T " /et…

STL-容器库101--array【C11】

1. 原型 C11提供 template < class T, size_t N > class array;T&#xff1a; 元素类型&#xff0c;以 array::value_type 作为别名使用&#xff1b;N&#xff1a; array中元素大小&#xff1b; 固定size的序列容器&#xff1b;初始化时&#xff0c; array对象不保存任何…

C#:向C++封送结构体数组

在使用第三方的非托管API时&#xff0c;我们经常会遇到参数为指针或指针的指针这种情况&#xff0c; 一般我们会用IntPtr指向我们需要传递的参数地址&#xff1b; 但是当遇到这种一个导出函数时,我们如何正确的使用IntPtr呢&#xff0c; extern "C" __declspec(dll…

其它综合-CentOS7 忘记root密码

CentOS7 忘记root密码 长时间不用的 CentOS 机器再次开机的时候忽然忘记了密码&#xff0c;总不能就重装一台吧&#xff0c;还有好多服务在机器上&#xff0c;于是决定重置root的密码。   如果是已经开启的机器&#xff0c;需要进行关闭&#xff0c;重新启动。在启动选择内核…

left join on and 与 left join on where的区别

数据库在通过连接两张或多张表来返回记录时&#xff0c;都会生成一张中间的临时表&#xff0c;然后再将这张临时表返回给用户。 在使用left jion时&#xff0c;on和where条件的区别如下&#xff1a; 1、 on条件是在生成临时表时使用的条件&#xff0c;它不管on中的条件是否为真…

spring boot高性能实现二维码扫码登录(中)——Redis版

前言 本打算用CountDownLatch来实现&#xff0c;但有个问题我没有考虑&#xff0c;就是当用户APP没有扫二维码的时候&#xff0c;线程会阻塞5分钟&#xff0c;这反而造成性能的下降。好吧&#xff0c;现在回归传统方式&#xff1a;前端ajax每隔1秒或2秒发一次请求&#xff0c;去…

C# :socket 通讯基础使用实例

们在讲解Socket编程前&#xff0c;先看几个和Socket编程紧密相关的概念&#xff1a; TCP/IP层次模型当然这里我们只讨论重要的四层 01&#xff0c;应用层(Application)&#xff1a;应用层是个很广泛的概念&#xff0c;有一些基本相同的系统级TCP/IP应用以及应用协议&#xff0…

IBM发表论文:可能已找到处理量子计算退相干的方法

在《自然》杂志最近发表的一篇论文中&#xff0c;IBM和其他机构的研究人员设计了两种量子算法&#xff0c;利用变分量子电路和量子核估计器来训练一种支持向量机分类器。这两种算法背后的关键思想是使用量子状态空间作为特征空间表示&#xff0c;有效地构建映射&#xff0c;从原…

PHP + NGINX 控制视频文件播放,并防止文件下载

最简单的方法是使用NGINX的 internal 功能 server { listen 80; server_name www.xxx.com;  location / { index index.php index.html index.htm; root /xxx; if (!-e $request_filename) { rewrite ^/index.php(.*)$ /index.php?s$…

可视化调试工具

rosrun rqt_console rqt_console # 查看日志消息&#xff0c;可filter、highlight指定级别。 rosrun rqt_logger_level rqt_logger_level # 可设在日志记录器的严重级别 rosrun rqt_topic rqt_topic # 显示topic调试信息 rosrun rqt_publisher rqt_publisher # 在界面中管理ro…

C#:委托基础与事件

通过以下思维导图&#xff0c;学习委托的基本概念&#xff0c;后面着重讲解委托的运用&#xff0c;希望通过最简单的方式收获更多的知识。 1.委托的各种写法 1、委托 委托名new 委托&#xff08;会调用的方法名); 委托名&#xff08;参数&#xff09;; 2、委托 委托名 会调用…

Git Bash关键命令

1.默认目录是C:\Users\用户名 2.切换目录&#xff1a;$cd c:\\windows 3.切换到上级目录&#xff1a;cd ..&#xff0c;中间有空格 4.列出某目录所有文件&#xff0c;相当于DOS下的dir&#xff1a;ls c:\\windows 5.查看配置信息&#xff1a;git config --list 以下是显示信息 …

C#:invoke 与 BeginInvoke使用区别

invoke和begininvoke 区别 一直对invoke和begininvoke的使用和概念比较混乱&#xff0c;这两天看了些资料&#xff0c;对这两个的用法和原理有了些新的认识和理解。 首先说下&#xff0c;invoke和begininvoke的使用有两种情况&#xff1a; 1. control中的invoke、begininvoke。…

Django基本命令

Django基本命令 1.创建一个Django 项目 django_admin.py startproject mysite当前目录下会生成mysite的工程&#xff0c;目录结构如下&#xff1a; manage.py ----- Django项目里面的工具&#xff0c;通过它可以调用django shell和数据库等。settings.py ---- 包含了项目的默认…

Git忽略规则.gitignore梳理

对于经常使用Git的朋友来说&#xff0c;.gitignore配置一定不会陌生。废话不说多了&#xff0c;接下来就来说说这个.gitignore的使用。首先要强调一点&#xff0c;这个文件的完整文件名就是".gitignore"&#xff0c;注意最前面有个“.”。 一般来说每个Git项目中都需…