Halcon模板匹配坐标转换关系详解

  • 预备知识
    • 仿射变换及其变换矩阵
  • Halcon中基于形状的模板匹配过程
    • 举例
    • 坐标转换原理解析
      • 第一步:创建模板
      • 第二步:设置原点
      • 第三步:匹配模板
      • 第四步:坐标转换,得到模板ROI和检测ROI

预备知识

仿射变换及其变换矩阵

本小节参考文章:https://www.cnblogs.com/shine-lee/p/10950963.html

仿射变换(affine transformation)包括平移(translation)、旋转(rotation)、缩放(scaling)、剪切(shear)、镜像( reflection),以及这些变换任意次序任意次数的组合。各种变换的图示如下:

因为基于形状的模板匹配只存在平移旋转的变换,所以以下只介绍平移和旋转。

因为只做平移和旋转变换,图形的大小和形状不会改变,只是位置发生变化,所以平移和旋转的组合变换又称刚体变换

假设变换前的二维点坐标为(x,y),变换后的点坐标为(x’,y’);

  • 平移变换矩阵形式表示为:

[ x ′ y ′ ] = [ x y ] + [ d x d y ] \left[ \begin{matrix} x' \\ y' \end{matrix} \right] = \left[ \begin{matrix} x\\ y \end{matrix} \right] + \left[ \begin{matrix} dx \\ dy \end{matrix} \right] [x′y′​]=[xy​]+[dxdy​]
其中dx,dy分别为x和y的平移量。

  • 旋转变换矩阵形式表示为:

[ x ′ y ′ ] = [ c o s θ − s i n θ s i n θ c o s θ ] ⋅ [ x y ] \left[ \begin{matrix} x' \\ y' \end{matrix} \right] = \left[ \begin{matrix} cosθ&-sinθ\\ sinθ&cosθ \end{matrix} \right]· \left[ \begin{matrix} x \\ y \end{matrix} \right] [x′y′​]=[cosθsinθ​−sinθcosθ​]⋅[xy​]
其中θ为绕原点逆时针旋转的角度。

以上是针对一个点在同一个坐标系中的变换,如果存在两个坐标系A和B,点P在A中的坐标为(x,y),在B中的坐标为(x’,y’),则存在如下关系:

[ x ′ y ′ 1 ] = [ c o s θ − s i n θ d x s i n θ c o s θ d y 0 0 1 ] ⋅ [ x y 1 ] = T R X \left[ \begin{matrix} x' \\ y'\\ 1 \end{matrix} \right] = \left[ \begin{matrix} cosθ&-sinθ&dx\\ sinθ&cosθ&dy\\ 0&0&1 \end{matrix} \right]· \left[ \begin{matrix} x \\ y\\ 1 \end{matrix} \right]= TRX ⎣⎡​x′y′1​⎦⎤​=⎣⎡​cosθsinθ0​−sinθcosθ0​dxdy1​⎦⎤​⋅⎣⎡​xy1​⎦⎤​=TRX

其中,dx,dy分别为 O A O_A OA​在B中的坐标,θ为由 O B X B O_BX_B OB​XB​转到 O A X A O_AX_A OA​XA​的角度,包含符号,逆时针为正,顺时针为负。


此处可参考文章https://blog.csdn.net/honpey/article/details/8724106?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

https://blog.csdn.net/feidaji/article/details/81358257


Halcon中基于形状的模板匹配过程

Halcon中一个完整的模板匹配过程如下:

  1. 读取并显示图像;
  2. 确定模板ROI及检测ROI;
  3. 创建模型;
  4. 匹配模板;
  5. ROI仿射变换,得到ROI位置。

举例

如上图所示,每一张图上芯片的位置和角度不固定,需要定位到绿色框内的针脚进行检测,如果以绿色框作为模板ROI,因为图片上有很多针脚,可能会匹配到其他位置,因此,以红色框作为模板ROI,蓝色框作为检测ROI。

以下是测试效果:


可以看到能够准确定位到检测ROI,图片资源是Halcon自带例程的图片,路径为:Halcon安装路径\images\board,Halcon完整代码如下:

dev_close_window ( )list_files ('D:/zxhalcon/images/board', 'files', Files)
tuple_regexp_select (Files, '\\.png$', Files)read_image (Image, Files[0])dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_display (Image)dev_set_color ('red')
gen_rectangle1 (Rectangle, 164.5, 126.5, 323, 476.5)dev_set_color ('green')
gen_rectangle1 (Rectangle1, 117.5, 138.5, 164.5, 166.5)reduce_domain (Image, Rectangle, ImageReduced)create_shape_model (ImageReduced, 4, rad(0), rad(360), 'auto', 'auto', 'use_polarity', 30, 10, ModelID)area_center (Rectangle, Area, Row, Column)set_shape_model_origin (ModelID, -Row, -Column)get_shape_model_contours (ModelContours, ModelID, 1)dev_set_color ('red')
dev_set_draw ('margin')
dev_display (ModelContours)for Index := 0 to |Files|-1 by 1read_image (Image, Files[Index])find_shape_model (Image, ModelID, 0, rad(360), 0.4, 1, 0.5, 'least_squares', 0, 0.7, Row3, Column3, Angle, Score)vector_angle_to_rigid (0, 0, 0, Row3, Column3, Angle, HomMat2D)affine_trans_contour_xld (ModelContours, ContoursAffinTrans, HomMat2D)affine_trans_region (Rectangle1, RegionAffineTrans, HomMat2D, 'false')dev_set_color ('red')dev_display (ContoursAffinTrans)dev_set_color ('green')dev_display (RegionAffineTrans)
endforclear_shape_model (ModelID)

坐标转换原理解析

上述例程中涉及到坐标的算子主要有:

  • create_shape_model
  • set_shape_model_origin
  • find_shape_model
  • vector_angle_to_rigid
  • affine_trans_contour_xld
  • affine_trans_region

第一步:创建模板

create_shape_model (ImageReduced, 4, rad(0), rad(360), 'auto', 'auto', 'ignore_local_polarity', 30, 10, ModelID)

算子原型:create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)

–Template :用于创建模板的图像,是原图的模板ROI区域;

–NumLevels:金字塔层的最大层数;

–AngleStart:模板的最小旋转角度,以弧度为单位;

–AngleExtent:旋转角度范围,必须≥0,以弧度为单位;如果超出角度范围,则模型搜索不到

–AngleStep:角度步长,以弧度为单位;

–Optimization:生成模型的优化方法;

–Metric:模板匹配的条件,在模板与图像亮暗发生反转时可使用;

–Contrast:创建模型时,模型点的对比度;

–MinContrast :在搜索的图像中,搜索对象的最小对比度,必须<Contrast;

–ModelID:模型的句柄。

算子使用时可能出现的错误:

通过帮助文档看到是模板的点数太少,当绘制的模板ROI区域太小,或模板ROI区域内特征不明显时会出现,可以扩大模板ROI区域。

第二步:设置原点

area_center (Rectangle, Area, Row, Column)
set_shape_model_origin (ModelID, -Row, -Column)

在算子get_shape_model_contours和set_shape_model_origin的帮助文档中有说明:默认情况下,模板轮廓的原点位于模型区域的重心,即通过area_center获取的模板ROI的坐标,如下图所示的坐标系 O 模 X 模 Y 模 O_模X_模Y_模 O模​X模​Y模​是模板轮廓的原始坐标系。

首先使用area_center (Rectangle, Area, Row, Column)获取 O 模 O_模 O模​在 O 图 O_图 O图​中的坐标;
然后使用set_shape_model_origin (ModelID, -Row, -Column)将 O 模 X 模 Y 模 O_模X_模Y_模 O模​X模​Y模​移动至与 O 图 X 图 Y 图 O_图X_图Y_图 O图​X图​Y图​重合,

第三步:匹配模板

find_shape_model (Image, ModelID, 0, rad(60), 0.4, 1, 0.5, 'least_squares', 0, 0.7, Row3, Column3, Angle, Score)

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

– Image :输入图像;

–ModelID:模型的句柄;

–AngleStart:模板的最小旋转角度,以弧度为单位;

–AngleExtent:旋转角度范围,必须≥0,以弧度为单位;如果超出角度范围,则模型搜索不到

–MinScore:要搜索到的模型实例的最小得分,如果低于此分数,则搜索不到;

–NumMatches:要搜索到的模型实例的个数;

–MaxOverlap:要找到的模型实例的最大重叠;

–SubPixel:确定找到的目标是否使用亚像素精度提取;

–NumLevels:搜索过程中使用的金字塔级别的数量 ;

–Greediness :搜索启发式的“贪婪度”,(0:安全但缓慢;1:快,但可能匹配不到)

–Row:找到的模型实例的行坐标,坐标值是找到模板的原点在图像坐标系中的行坐标;

–Column:找到的模型实例的列坐标,坐标值是找到模板的原点在图像坐标系中的列坐标;

–Angle:找到的模型实例的角度;

–Score: 找到的模型实例的分数。

第四步:坐标转换,得到模板ROI和检测ROI

vector_angle_to_rigid (0, 0, 0, Row3, Column3, Angle, HomMat2D)
affine_trans_contour_xld (ModelContours, ContoursAffinTrans, HomMat2D)
affine_trans_region (Rectangle1, RegionAffineTrans, HomMat2D, 'false')

计算变换矩阵
算子原型:vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)

–Row1:原始点的行坐标;

–Column1:原始点的列坐标;

–Angle1:原始点的角度;

–Row2:变换点的行坐标;

–Column2:变换点的列坐标;

–Angle2:变换点的角度;

–HomMat2D:输出的变换矩阵。

ROI坐标转换
使用算子:affine_trans_contour_xld和affine_trans_region

Halcon基于形状的模板匹配及坐标转换关系详解相关推荐

  1. halcon基于形状的模板匹配第三例:rectify_result.hdev

    这个例子其实是在比较两种ROI"还原"的方式: 模板匹配后,获得仿射变换矩阵T,则对于ROI的分析有两种: 1.全局的,将T.inv()*Img_target得到目标图片全局还原后 ...

  2. Qt与halcon联合开发实现基于形状的模板匹配

    目录 前言 一.基于形状的模板匹配是什么? 二.具体实现 1.算子介绍 2.关键代码实现 总结 前言 第一次在CSDN写博客,准备写一个简单的形状匹配算子的用法及实现的介绍. 一.基于形状的模板匹配是 ...

  3. OpenCV基于形状的模板匹配

    OpenCV基于形状的模板匹配 引言 基于形状的匹配算法 具体代码 KcgMatch.h KcgMatch.cpp main.cpp 匹配的结果 引言 在OpenCV中有个用于模板匹配的基本函数mat ...

  4. OpenCV实现基于形状的模板匹配(附源码)

    效果预览 OpenCV实现基于形状的模板匹配(多角度+不同亮度) 实例演示一: 实例演示二: 实例演示三: 实例演示四: 实例演示五: 实例演示六ÿ

  5. HALCON基于形变的模板匹配实现

    基于形变的模板匹配 先看匹配结果: 下面是HALCON的代码,用匹配助手生成的,现在得到的就是模板上61个点的坐标,还有仿射矩阵,利用仿射矩阵可以算出61个点匹配上的像素坐标. * * Matchin ...

  6. 基于形状的模板匹配(用于字符识别)研究

    一.各模板匹配方法对比 1.基于灰度的匹配一般被称为模版匹配,直接以灰度进行匹配效果不好,对光照很敏感,所以一般会以灰度归一化互相关(NCC)作为匹配依据,增强光照变化下的鲁棒性,为了降低计算量,多采 ...

  7. HALCON联合C#检测表面缺陷——基于形状的模板匹配设置流程

    接上一篇文章,上两篇文章我们把匹配助手中生成的代码导出到C#文件,导出的过程如果有不清楚的可以给我留言. 上一节我们也说过,代码是分为两个部分的,前一部分是设置模板,后一部分是检测流程. 这里多说两句 ...

  8. 【Halcon】基于形状的模板匹配的定位.md

    看到一句非常入心的话:天雨大不润无根之草,道法宽只度有缘之人! 说的就是这个理,所有的因果都要追至事物的本质.从古至今,从国家到个人,如果只是华而不实.外强中干,就算机会.机遇在你身旁,你能做的也只能 ...

  9. HALCON基于形状匹配详解

    HALCON基于形状的模板匹配详细说明 很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间.去年有过一段时间的集中学习,做了许多的练习和实验,并对基于HDevelop的形状 ...

  10. Halcon学习笔记之模板匹配-基于形状的多模板匹配

    基于形状的模板匹配在我们实际的项目中应用最广,同时在一些项目中,光是选中一个目标作为匹配的模板,效果可能还达不到我们所需要达到的要求或者我们所需要检测的目标存在多个特征需要去判别,所以这个时候可以考虑 ...

最新文章

  1. 【JAVA零基础入门系列】Day2 Java集成开发环境IDEA
  2. Android小项目之--前台界面与用户交互的对接 进度条与拖动条(附源码)
  3. 多人在线游戏服务器端开发心得(转)
  4. colease函数 mysql_SqlConnection 概述
  5. 092_元素的几种宽度和高度
  6. batch size 训练时间_深度学习 | Batch Size大小对训练过程的影响
  7. 金泰联限量稳定虚拟主机赞助计划
  8. MyBatis知多少(22)MyBatis删除操作
  9. 视觉slam学习--坐标系变换 | 欧式变换+仿射变换+射影变换
  10. oracle 存储同步,Oracle数据库知识——存储过程篇
  11. java 主线程等待_Java实现主线程等待子线程
  12. java21天打卡day17-类2
  13. mysql日期函数转换_Mysql日期函数大全 转
  14. 【重点!记忆化递归+DP】LeetCode 72. Edit Distance
  15. .net在web.config中设置网站编码格式
  16. AR.js专题-图片匹配
  17. Oracle客户端完整版下载地址
  18. django+layui图片上传(用户头像修改,实时预览)
  19. 自从有了OJ水题嗅探神器,麻麻再也不担心我刷不到题了。。
  20. 裤子尺码对照表eur40_裤子尺寸对照表,衣服尺寸对照表,服装尺寸对照表- 尺码对照表...

热门文章

  1. 【2023最新版】Windows11家庭版:安卓子系统(WSA)安装及使用教程【全网最详细】
  2. C# - Excel - Microsoft Access 数据库引擎找不到对象
  3. 快速掌握Seaborn分布图的10个例子
  4. 易查分小程序,让学生告别繁琐的查询流程
  5. eDNA暴露人类活动轨迹!你的DNA信息可能随时随地在泄露!
  6. 案例分享:Shell脚本100个案例----------------------------------小董偷懒系列
  7. 在Linux上创建你自己的虚拟专用网络:PPTP服务器配置步骤
  8. 创业小常识:创业者绝对不能干的事
  9. LeetCode1510. 石子游戏 IV
  10. 使用分而治之编写非递归合并排序算法