在日常工程应用中,我们通常通过halcon的 shape-based matching(形状匹配)进行各种定位,
如以前文章介绍的这样,理解各个参数并灵活应用通常就能得到很好的匹配效果和匹配速度,
当待匹配物体有轻微变形时,并不影响得到的匹配结果,然后当待匹配物体有较大变形时,如
塑料产品在成形时变形、纺织产品的花纹因为褶皱变形等,要想得到精确的定位结果就显得捉襟见肘,
 
如下图所示,印刷品有较大变形,在用shape-based matching时,定位结果就不尽如人意,因为
shape-based matching本身得到的匹配结果只是一个点(row,col),我们根据匹配结果通过仿射变换
将模板转换到匹配位置时就这个熊样。
 
怎么办?怎么办?如果有一种匹配模式,匹配结果可以根据待匹配物体自动进行变形多好!
如下图所示,简直完美,有木有?有木有!这就是我们今天要介绍的local deformable matching (局部变形匹配)
 

 
 
local deformable matching的基本流程和 shape-based matching相似:
所以在此之前闭上眼睛好好感受一下, shape-based matching掌握的怎么样,要不要回顾一下历史文章,相似参数不做介绍。
 
(1)create_local_deformable_model 创建变形模板

ScaleMin、ScaleMax、ScaleStep:
指定行列最小最大变形尺度例(0.9,1.1,0.01)用于指定相对于原图的变形范围
 
(2)find_local_deformable_model 匹配
ImageRectified :
匹配到的变形后模板图像
VectorField: 
变形矢量区,里面存储了匹配区域每个点变形后的位置,之所以叫vector是因为每个点为存储了行列坐标(x,y),动态图中的网格就是以此算出的.
返回的区域大小是创建模板时domain的最小外界矩形大小,当然你可以通过ParamName参数中的expand_border扩展区域等到更大的区域。
DeformedContours:
匹配到的轮廓,非模板轮廓而是经过变形得出的轮廓,动态图中的绿色轮廓即是此
ResultType:'deformed_contours', 'image_rectified', 'vector_field'可指定需要得出的结果分别对应ImageRectified VectorFiedl DeformedContours,
ParamName:
deformation_smoothness:平滑的度,对于变形越大参数越大
expand_border:扩展ImageRecfified VectorField 区域
 
附注:生成变形网格的函数,此函数隔10个像素取值
gen_warped_mesh (VectorField, WarpedMesh, )
gen_empty_obj (WarpedMesh)
count_obj (VectorField, Number)
for Index := to Number by
select_obj (VectorField, ObjectSelected, Index)
*把vector转换成存储行坐标和列坐标图像
vector_field_to_real (ObjectSelected, DRow, DCol)
get_image_size (VectorField, Width, Height) *取行坐标
for ContR := 0.5 to Height[] - by Step
Col1 := [0.5:Width[] - ]
tuple_gen_const (Width[] - , ContR, Row1)
get_grayval_interpolated (DRow, Row1, Col1, 'bilinear', GrayRow)
get_grayval_interpolated (DCol, Row1, Col1, 'bilinear', GrayCol)
gen_contour_polygon_xld (Contour, GrayRow, GrayCol)
concat_obj (WarpedMesh, Contour, WarpedMesh)
endfor
*取列坐标
for ContC := 0.5 to Width[] - by Step
Row1 := [0.5:Height[] - ]
tuple_gen_const (Height[] - , ContC, Col1)
get_grayval_interpolated (DRow, Row1, Col1, 'bilinear', GrayRow)
get_grayval_interpolated (DCol, Row1, Col1, 'bilinear', GrayCol)
gen_contour_polygon_xld (Contour, GrayRow, GrayCol)
concat_obj (WarpedMesh, Contour, WarpedMesh)
endfor
endfor
return ()
 
总结:一句话形容halcon的局部变形匹配功能,那就是“屌炸天”,本人也在多个项目中应用取得了极其好的效果。
然而本片文章只是浅尝辄止,更深层次的应用还需要各位看官动手实践,夜深了~窗外下着雨,各位晚安。
 
关注微信:halconhub,每日获取halcon精华文章
 

halcon之屌炸天的变形匹配(1)的更多相关文章

  1. halcon之屌炸天的自标定(2)

    自 halcon之屌炸天的自标定(1)发出以后,有朋友看了文章也应用到了自己的测量项目中,效果奇好,成功搞定了20um的需求,可喜可贺.   在halcon之屌炸天的自标定(1)中我提到了一片论文: ...

  2. halcon之屌炸天的自标定(1)

      本次先对halcon的自标定做个整体介绍,了解屌炸天的自标定在实际应用中的应用与实现方法,具体的编程细节将在后续的文章中介绍. halcon提供了一种自标定的算子,它可以在不用标定板的情况下,标定 ...

  3. halcon应用案例探究

    14.1  Access 1. get_region_chain 功能:一个对象的轮廓(contour)作为链式码. 2. get_region_contour 功能:查询一个目标的轮廓(contou ...

  4. halcon三种模板匹配方法

    halcon有三种模板匹配方法:即Component-Based.Gray-Value-Based.Shaped_based,分别是基于组件(或成分.元素)的匹配,基于灰度值的匹配和基于形状的匹配,此 ...

  5. halcon——缺陷检测常用方法总结(模板匹配(定位)+差分)

    引言 机器视觉中缺陷检测分为一下几种: blob分析+特征 模板匹配(定位)+差分 光度立体:halcon--缺陷检测常用方法总结(光度立体) - 唯有自己强大 - 博客园 (cnblogs.com) ...

  6. Halcon中模板匹配方法的总结归纳

    基于组件的模板匹配: 应用场合:组件匹配是形状匹配的扩展,但不支持大小缩放匹配,一般用于多个对象(工件)定位的场合. 算法步骤: 1.获取组件模型里的初始控件 gen_initial_componen ...

  7. (转)基于形状匹配的Halcon算子create_shape_model

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

  8. HALCON形状匹配讲解

    HALCON形状匹配讲解 https://blog.csdn.net/linnyn/article/details/50663328 https://blog.csdn.net/u014608071/ ...

  9. halcon学习之产品检测

    Rinspect_gasket_local_deformable.hdev   检测垫圈局部变形   *这个例子演示了如何利用局部变形匹配(local deformable matching)来寻找出 ...

随机推荐

  1. HTTPS握手

    作用 内容加密 建立一个信息安全通道,来保证数据传输的安全: 身份认证 确认网站的真实性 数据完整性 防止内容被第三方冒充或者篡改 https的采用了对称加密和非对称加密.握手过程中采用非对称加密,得 ...

  2. JAVA参数没有引用传递,只有值传递

    原文章地址:http://www.cnblogs.com/clara/archive/2011/09/17/2179493.html 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性, ...

  3. MegaCli 监控raid状态 限戴尔服务器

    MegaCli 监控raid状态 MegaCli是一款管理维护硬件RAID软件,可以通过它来了解当前raid卡的所有信息,包括 raid卡的型号,raid的阵列类型,raid 上各磁盘状态,等等.通常 ...

  4. python通过os.walk() 遍历出多级目录下所有文件绝对路径

    代码如下 将遍历出来的路径全部添加到列表中: def get_all_abs_path(source_dir): path_list = [] for fpathe, dirs, fs in os.w ...

  5. mysql 数据操作 单表查询 having 过滤

    SELECT 字段1,字段2... FROM 库名.表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 1.首先找到表 库.表 ...

  6. Spark Core (一) 什么是RDD的Transformation和Action以及Dependency(转载)

    1. Spark的RDD RDD(Resilient Distributed Datasets),弹性分布式数据集,是对分布式数据集的一种抽象. RDD所具备5个主要特性: 一组分区列表 计算每一个数 ...

  7. [py]python中的==和is的区别

    is比较id id(a) == id(b) == id(c) a is d #false ==比较值 a==b #true 举个例子:a = 1 b = a c = 1 d = 1.0 这里有3个对象 ...

  8. CSU 1642 Problem B[难][前缀和]

    Description 已知两个正整数a和b,求在a与b之间(包含a和b)的所有整数的十进制表示中1出现的次数. Input 多组数据(不超过100000组),每组数据2个整数a,b.(1≤a,b≤1 ...

  9. Xcel 测试版使用手册

    基于无任何文笔可言,所以直接上使用方法吧. 1.引用dll,如何引用dll请谷歌. 2.使用 //实例化对象 LT.XMLExcel.XlsxOption xOption = new LT.XMLEx ...

  10. Educational Codeforces Round 57 Solution

    A. Find Divisible 签到. #include <bits/stdc++.h> using namespace std; int t, l, r; int main() { ...