在折腾中成长,在折腾中永生。

接着玩模板匹配,最近主要研究了3个课题。

1、创建模型的Optimization选项模拟(2022.5.16日)

  这两天又遇到一个做模板匹配隐藏的高手,切磋起来后面就还是和halcon比,于是有看了下create_shape_model这个函数,前面一直忙实现细节,对halcon的Optimization这个参数真的没怎么在意,几天一看,原来这里面还隐藏了比较深的细节。halcon原始的英文描述如下:

  For particularly large models, it may be useful to reduce the number of model points by setting Optimization to a value different from 'none'. If Optimization = 'none', all model points are stored. In all other cases, the number of points is reduced according to the value of Optimization. If the number of points is reduced, it may be necessary in find_shape_model to set the parameter Greediness to a smaller value, e.g., 0.7 or 0.8. For small models, the reduction of the number of model points does not result in a speed-up of the search because in this case usually significantly more potential instances of the model must be examined. If Optimization is set to 'auto', create_shape_model automatically determines the reduction of the number of model points.

   Optionally, a second value can be passed in Optimization. This value determines whether the model is pregenerated completely or not. To do so, the second value of Optimization must be set to either 'pregeneration' or 'no_pregeneration'. If the second value is not used (i.e., if only one value is passed), the mode that is set with set_system('pregenerate_shape_models',...) is used. With the default value ('pregenerate_shape_models' = 'false'), the model is not pregenerated completely. The complete pregeneration of the model normally leads to slightly lower runtimes because the model does not need to be transformed at runtime. However, in this case, the memory requirements and the time required to create the model are significantly higher. It should also be noted that it cannot be expected that the two modes return exactly identical results because transforming the model at runtime necessarily leads to different internal data for the transformed models than pregenerating the transformed models. For example, if the model is not pregenerated completely, find_shape_model typically returns slightly lower scores, which may require setting a slightly lower value for MinScore than for a completely pregenerated model. Furthermore, the poses obtained by interpolation may differ slightly in the two modes. If maximum accuracy is desired, the pose of the model should be determined by least-squares adjustment.

  翻译成中文的核心意思是,对于大的模板图像,将改参数设置而为非"none"的其他值,可以降低匹配时需要的模型点的数量,从而提高速度,当然,如果模型点数量降低了,在调用find_shape_model 时最好把那个贪婪值稍微吊的小一点,比如改成0.7或者0.8,以便保证稳定性。当然,这个操作对于小模型可能作用不大。一般情况下,可以设置为"atuo",这样create_shape_model 自动绝对如何来降低取样点数。

   另外,这个函数还可以有第二个类型的值和前面的模型点数量集合,即pregeneration和no_pregeneration选项,这个是关键。 默认情况是no_pregeneration,当选择pregeneration时,create_shape_model就会和我现在的实现方式一样,对每层金字塔以及金字塔内不同角度均计算特征点数据,因此,这个创建函数就会比较慢和占用大量的内存。但是带来的好处就是find_shape_model函数可能执行时间会快一些。no_pregeneration选项只会计算未旋转模板的相关信息,在find_shape_model时候会对信息进行转换,因此创建时非常快。特别注意,两个选项得到的匹配结果会有轻微的不同。比如说,如果使用no_pregeneration,find_shape_model 函数的得分可能要稍微低一点。 所以,我目前实现的相当于使用了pregeneration选项的halcon功能。

  具体来说:optimization 有7种选项可以选择

   List of values: 'auto', 'no_pregeneration', 'none', 'point_reduction_high', 'point_reduction_low', 'point_reduction_medium', 'pregeneration'

  我们看到point_reduction相关的有point_reduction_high point_reduction_low point_reduction_medium选项,我在想内部肯定是某个固定的方式减少模型点数量,这个我们也可以模拟,比如分别取1/8,1/4,1/2等等,经过测试,这个在提高速度的同时,对结果的准确度和精度基本没有什么影响。

2、no_pregeneration选项的模拟(2022.5.18日)

  这个很早以前就已经在考虑了,目前已经有过几种尝试,均已失败告终,记录如下。

(1)create_shape_model 只记录每层金字塔未旋转模板图像的模型点特征和位置(整形位置),然后在find_shape_model 时,旋转特征点的坐标,并且四舍五入位置坐标,使用0度模型点特征和这个坐标位置的查找图中特征做匹配。

(2)create_shape_model 只记录每层金字塔未旋转模板图像的模型点特征和位置(整形位置),然后在find_shape_model 时,旋转特征点的坐标,使用0度模型点特征和查找图中这个坐标位置周边的领域的双线性插值中特征做匹配。

(3)create_shape_model 只记录每层金字塔未旋转模板图像的模型点特征和位置(亚像素特征值和位置),然后在find_shape_model 时,旋转特征点的坐标,使用0度模型点特征和查找图中这个坐标位置周边的领域的双线性插值中特征做匹配。

  测试结果均会出现目标丢失,如下所示:

 3、3D的亚像素插值(2022.5.23)

  最近在看一篇台湾人开源的基于NCC的模板匹配代码,详见:https://github.com/DennisLiu1993/Fastest_Image_Pattern_Matching,在其代码中看到3D(X坐标,Y坐标和角度)的亚像素计算方法, 在后续和作者的沟通中,作者提供了该算法的论文出处。其详细的推到过程见下图:

 编码上其实也很简单,主要是一些矩阵的乘法、转置和求逆等。

  他实际上就是在3*3*3的空间内拟合曲面,在编码时,我们需要在初步求得的X和Y坐标以及角度值3领域范围内(X加减1,Y加减1,Angle加减AngleStep)计算出27个得分值后进行矩阵运算即可。

其实我一直在找这方面的资料,终于找到了,本来希望能得到一个比以前的2D或1D亚像素更为精确的结果,不过实际测试起来还是有点失望的。 

以一个我常用的测试图中一个结果为例说明(使用基于边缘的匹配算法):

                                                                                                    

                                      

      不使用亚像素时的结果                      使用3D亚像素时的结果                                                            使用2D亚像素时的结果

  这个图理论的准确得分应该是1,不过由于中间的浮点计算误差,导致得分无限接近于1,因此在不使用亚像素时得到的结果其实是精确值,当使用3D亚像素后,我们看到了X和Y坐标结果有了很大的偏移,这个明显是错误的。

  后面为了分析这个问题,我一直在查找3D亚像素插值的代码,以为是代码写错了,后面用同样的数据,使用matlab计算,得到的结果也是一样的,说明不是代码问题,于是我打印出了对应的27个点的得分,如下所示:

Score  X - 1   X    X + 1           X - 1   X    X + 1            X - 1   X    X + 1

  Y - 1    0.9891  0.9213  0.7208   |   0.9274  0.9720  0.9080    |    0.9855  0.9324  0.7223

  Y    0.9579  0.8836  0.6884   |   0.9491  0.9999  0.9562    |    0.9522  0.8850  0.6925

  Y + 1   0.8395  0.7772  0.6303      |   0.8922  0.9662  0.9717    |    0.7830  0.7373  0.5660

         Angle - AngleStep                 Angle                 Angle+ AngleStep

  我们仔细的观察数据,发现只有在角度为 Angle时,(X,Y)点的得分为环绕最大值,而在其他角度时,得分的中心感觉都有点向左上角偏移,因此3D插值后的结果也会向左上角偏移,计算结果是符合数据的特性的。

后面想一想啊,基于边缘的查找啊和边缘的位置有着非常紧密的关系,稍微旋转一个角度,边缘的位置就有可能有一两个像素的偏移,这样就会导致得分又较为明显的差异,出现这个情况应该是正常点的。

后面我把基于NCC的用3D的亚像素插值试了一下,结果就好很多了,这个也很正常,因为NCC的相似度计算是基于全图的,旋转一个角度后,有多个点作用于结果得分值。

因此,个人最后还是认为,在基于边缘的匹配中可以使用2D的亚像素作用于X和Y坐标,使用1D的亚像素作用于角度。

最新版的一个测试DEMO: 带蒙版的模板匹配

如果想时刻关注本人的最新文章,也可关注公众号或者添加本人微信:  laviewpbt

【工程应用七】接着折腾模板匹配算法 (Optimization选项 + no_pregeneration模拟 + 3D亚像素插值)的更多相关文章

  1. 【工程应用一】 多目标多角度的快速模板匹配算法(基于NCC,效果无限接近Halcon中........)

    愿意写代码的人一般都不太愿意去写文章,因为代码方面的艺术和文字中的美学往往很难兼得,两者都兼得的人通常都已经被西方极乐世界所收罗,我也是只喜欢写代码,让那些字母组成美妙的歌曲,然后自我沉浸在其中自得其 ...

  2. OpenCV模板匹配算法详解

    1 理论介绍 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目标.OpenCV ...

  3. Solon Web 开发,七、视图模板与Mvc注解

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  4. 【工程应用五】 opencv中linemod模板匹配算法诸多疑惑和自我解读。

    研究这个前前后后也有快两三个月了,因为之前也一直在弄模板匹配方面的东西,所以偶尔还是有不少朋友咨询或者问你有没有研究过linemod这个算法啊,那个效率啥的还不错啊,有段时间一直不以为然,觉得我现在用 ...

  5. Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化

    模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则 ...

  6. 【图像配准】基于灰度的模板匹配算法(一):MAD、SAD、SSD、MSD、NCC、SSDA、SATD算法

    简介: 本文主要介绍几种基于灰度的图像匹配算法:平均绝对差算法(MAD).绝对误差和算法(SAD).误差平方和算法(SSD).平均误差平方和算法(MSD).归一化积相关算法(NCC).序贯相似性检测算 ...

  7. python+selenium七:下拉框、选项框、select用法

    # from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsimpo ...

  8. Flask初级(七)flash模板循环,判断

    Project name :Flask_Plan templates:templates static:static 继续前面的代码 修改Flask_Plan.py @app.route('/') d ...

  9. P5282 【模板】快速阶乘算法(多项式运算+拉格朗日插值+倍增)

    题面 传送门 前置芝士 优化后的\(MTT\)(四次\(FFT\)) 题解 这里有多点求值的做法然而被\(shadowice\)巨巨吊起来打了一顿,所以来学一下倍增 成功同时拿到本题最优解和最劣解-- ...

  10. opencvSGBM半全局立体匹配算法的研究(1)

    转载请说明出处:http://blog.csdn.net/zhubaohua_bupt/article/details/51866567 这段时间对opencvSGBM半全局立体匹配算法进行了比較仔细 ...

随机推荐

  1. 谈一谈IOC、DI

    Inversion of control(控制反转) 原来由类库主动去创建对象的方式变为容器装配的方式,装配的方式:设置配置文件. 对象由IOC容器管理,包括创建.释放.存在形式.生命周期的管理等. ...

  2. @import和link的区别

    @import和link的区别 1.link语法结构    <link href="CSSurl路径" rel="stylesheet" type=&qu ...

  3. Java Base64、AES、SHA1、MD5加密算法

    package com.example.decript; import java.io.UnsupportedEncodingException; import java.security.Inval ...

  4. 常用颜色的RGB值

    RGB颜色表 白色:rgb(255,255,255) 黑色:rgb(0,0,0) 红色:rgb(255,0,0) 绿色:rgb(0,255,0) 蓝色:rgb(0,0,255) 青色:rgb(0,25 ...

  5. 检查mysql数据库是否存在坏表脚本

    #!/bin/bash #此脚本的主要用途是检测mysql服务器上所有的db或者单独db中的坏表 #变量说明 pass mysql账户口令 name mysql账号名称 data_path mysql ...

  6. 如何快速的将Centos6.7快速升级3.10.9

    参考文档:http://www.xiexianbin.cn/linux/2015/10/15/quickly-upgrade-centos6.5-kernel-from-2.6.32-to-3.10. ...

  7. Skew Join与Left Semi Join相关

    Skew Join 真实数据中数据倾斜是一定的, hadoop 中默认是使用 hive.exec.reducers.bytes.per.reducer = 1000000000 也就是每个节点的red ...

  8. Kindeditor+web.py+SAE Storage 实现文件上传 - 开源中国社区

    Kindeditor+web.py+SAE Storage 实现文件上传 - 开源中国社区 Kindeditor+web.py+SAE Storage 实现文件上传

  9. ASP.NET缓存中Cache过期的三种策略

    原文:ASP.NET缓存中Cache过期的三种策略 我们在页面上添加三个按钮并双击按钮创建事件处理方法,三个按钮使用不同的过期策略添加ASP.NET缓存. <asp:Button ID=&quo ...

  10. 【转】Python基础语法

    [转]Python基础语法 学习一门编程语言,通常是学习该语言的以下几个部分的内容: 基础语法:如,变量的声明与调用.基本输出语句.代码块语法.注释等: 数据类型:通常都为 数字.字符串.布尔值.数组 ...