【halcon知识】应用仿射变换

news2024/11/27 18:41:27

一、说明

        无论什么样的变换,都离不开齐次变换矩阵。一般地,先准备一个空的齐次变换矩阵,这个矩阵随便填写:1)填入旋转类参数就是旋转矩阵,2——填入仿射参数就可进行仿射变换,3)填入透视变换,就能进行透视变换。本文专门谈谈halcon的关于局部图像进行线性变换是如何进行的。

二、方法说明

2.1 hom_mat2d_identity — 生成通用二维变换的齐次变换矩阵

        对于方法 hom_mat2d_identity,只有一个输出HomMat2DIdentity,就是生成一个齐次变换矩阵。此矩阵为单位矩阵。该方法实际上可以用其它手段替代,此处仅仅是方便用户生成矩阵而已。

        hom_mat2d_identity (HomMat2DIdentity)

        以上代码执行过后, HomMat2DIdentity就被赋值为:

                HomMat2DIdentity=\begin{pmatrix} 1 & 0& 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{pmatrix}

 2.2 hom_mat2d_rotate — 生成通用二维旋转变换的齐次变换矩阵

        hom_mat2d_rotate方法用来产生旋转变换矩阵:

    hom_mat2d_rotate( : : HomMat2D, Phi, Px, Py : HomMat2DRotate)

参数表: 

参数说明参数性质
HomMat由hom_mat2d_identity生成的一个单位矩阵输入。输入
Phi旋转的角度输入
Px旋转中心x坐标输入
Py选装中心的y坐标输入
 hom_mat2d_rotate由上列参数对单位阵赋值,最后得到的旋转齐次变换矩阵输出

 2.3  affine_trans_image — 生成通用二维仿射变换的齐次变换矩阵

        affine_trans_image — 对图像应用任意仿射二维变换。 注意,所有变换都是一个矩阵相乘的结果。因此,旋转、仿射、透视变换,都可以用该方法实现。(只是换换矩阵而已)

affine_trans_image(Image : ImageAffinTrans : HomMat2D, Interpolation, AdaptImageSize : )

 参数表:

参数描述性质
ImageFilled输入图像输入
ImageAffinTrans,输出图像输出
HomMat2DRotate,齐次变换矩阵,这个也是在修改单位阵获得的。输入
Interpolation间隙填充:'bilinear', 'constant', 'nearest_neighbor', 'weighted'输入
AdaptImageSize

值为“true”时,将调整大小,以便在右边缘或下边缘不会发生裁剪。值为“false”时,目标图像的大小与输入图像的大小相同。请注意,与 AdaptImageSize 无关,图像总是在左边缘和上边缘被裁剪,即,在变换后具有负坐标的所有图像部分都被裁剪。

输入

2.4 模板的旋转匹配

        best_match_rot_mg — 通过旋转搜索模板和金字塔的最佳匹配。

best_match_rot_mg(Image : : TemplateID, AngleStart, AngleExtend, MaxError, SubPixel, NumLevels : Row, Column, Angle, Error)

        best_match_rot_mg的参数表:

参数描述性质数据类型
Image (input_object)输入单通道图像(-array) → object (byte),在图像内部有模式图输入btype
TemplateID模式对象索引号输入int
AngleStart角度的起始(默认-0.39)建议值:-3.14, -1.57, -0.79, -0.39, -0.20, 0.0输入real
AngleExtend角度的旋转步长:(默认0.79)6.28, 3.14, 1.57, 0.79, 0.39 输入real
MaxError

灰度最大平均差别(默认40灰度级)建议值: 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 9.0, 11.0, 15.0, 17.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0

输入real
SubPixel是否亚像素 'false', 'true';默认: 'false'输入string
NumLevels(input_control)  integer 旋转等级数,默认3;建议123456;输入int
row

 point.y(-array) → (real) 最佳匹配点的行坐标

输出real
Column

 point.x(-array) → (real) 最佳匹配点的列坐标

输出real
Angle angle.rad(-array) → (real) ,模板旋转角度输出real
Error real(-array) → (real)  最佳匹配的灰度值的平均散度。输出real

三、仿射变换的齐次坐标矩阵形成

        上面说到,齐次变换矩阵,都是由三维单位矩阵转化而成,三维齐次单位矩阵由  获得,那么这个矩阵如何随客户的意愿,改造成不同的仿射矩阵呢?如下例完成

hom_mat2d_identity(Matrix1)
hom_mat2d_scale(Matrix1,0.5,0.5,256.0,256.0,Matrix2)
hom_mat2d_rotate(Matrix2,3.14,256.0,256.0,Matrix3)
hom_mat2d_translate(Matrix3,-128.0,-128.0,Matrix4)

        而且,所有的操作,本质上就是矩阵乘法。如:

        hom_mat2d_scale( : : HomMat2D, Sx, Sy, Px, Py : HomMat2DScale)

        就是:

        Matrix2=Matrix1\times \bigl(\begin{smallmatrix} S_x &0 &p_x \\ 0& S_y&P_y \\0&0 & 1\end{smallmatrix}\bigr)

        其它类推。

        (这里我不明白,halcon给用户一个直接赋值的方法,难道不可吗?非要增加理解成本。)

四、实验和结果

        如果参数值正确,则运算符 best_match_rot_mg 返回值 2 (H_MSG_TRUE)。如果输入为空(没有输入图像可用),可以通过 set_system('no_object_result',<Result>) 设置action。如有必要,会引发异常。

dev_close_window ()
read_image (For6, 'for6')
get_image_size (For6, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowID)
fill_interlace (For6, ImageFilled, 'odd')
* gen_rectangle1 (Rectangle, 266, 390, 348, 435)
gen_rectangle1 (Rectangle, 78, 292, 129, 402)
* gen_rectangle1 (Rectangle, 258, 214, 296, 258)
area_center (Rectangle, Area, Row, Column)
reduce_domain (ImageFilled, Rectangle, ImageReduced)
pi := acos(0.0) * 2
* Preparing a pattern for template matching with rotation
create_template_rot (ImageReduced, 4, -pi, 2 * pi, pi / 16, 'sort', 'original', TemplateID)
write_template (TemplateID, 'testt')
* Deallocation of the memory of a template
clear_template (TemplateID)
* Reading saved template from file
read_template ('testt', TemplateID)
dev_set_color ('red')
for Phi := -180 to 180 by 5
  hom_mat2d_identity (HomMat2DIdentity)
  hom_mat2d_rotate (HomMat2DIdentity, rad(Phi), 256, 256, HomMat2DRotate)
  * Apply an arbitrary affine transformation to the image
  affine_trans_image (ImageFilled, ImageAffinTrans, HomMat2DRotate, 'constant', 'false')
  * add_noise_white (ImageAffinTrans, ImageAffinTrans, 30)
  * Searching the best matching of a template and a pyramid with rotation
  best_match_rot_mg (ImageAffinTrans, TemplateID, -pi, 2 * pi, 40, 'true', 4, Row, Column, Angle, Error)
  disp_arrow (WindowID, Row, Column, Row - cos(Angle) * 50, Column - sin(Angle) * 50, 1)
  AngleDeg := deg(Angle)
  DiffAngle := abs(AngleDeg - Phi)
endfor
clear_template (TemplateID)

输入图像:

结果显示:

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

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

相关文章

Kali-linux攻击WordPress和其他应用程序

今天越来越多的企业利用SAAS&#xff08;Software as a Service&#xff09;工具应用在他们的业务中。例如&#xff0c;他们经常使用WordPress作为他们网站的内容管理系统&#xff0c;或者在局域网中使用Drupal框架。从这些应用程序中找到漏洞&#xff0c;是非常有价值的。 为…

[JAVA数据结构]堆

目录 1.堆的概念 2.堆的创建 3.堆的插入与删除 3.1堆的插入 3.2堆的删除 1.堆的概念 如果有一个关键码的集合K {k0&#xff0c;k1&#xff0c; k2&#xff0c;…&#xff0c;kn-1}&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中&#xff0c;…

【Linux】远程桌面连接服务器报错:未启用对服务器的远程访问......

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录 前述操作环境说明&#xff1a;远程报…

<数据结构>NO4.带头双向循环链表

文章目录 前言1. 头文件2. 函数实现1&#xff09;创建哨兵位节点2&#xff09;新增一个节点3&#xff09;打印链表4&#xff09;头插5&#xff09;尾插6&#xff09;头删7&#xff09;尾删8&#xff09;查找9&#xff09;pos前插入10&#xff09;删除pos处节点11&#xff09;销…

Redis 缓存穿透、缓存击穿与缓存雪崩

文章目录 1. 缓存穿透解决方法 2. 缓存击穿解决方法 3. 缓存雪崩解决方法 在 redis 的应用场景中&#xff0c;需要考虑缓存在某些场景下可能出现的问题&#xff1a; 缓存穿透 缓存击穿 缓存雪崩 以下缓存问题的讨论都是基于以下应用架构讨论的&#xff1a; 1. 缓存穿透 对应…

数据备份系列:Rsync 备份实战记录(二)

一、Rsync Cron 场景使用 在对数据备份要求实时性不高的情况下&#xff0c;可优先考虑该场景&#xff0c;选择一个合适的时间&#xff0c;对数据进行定时远程增量同步。 在《数据备份系列&#xff1a;Rsync 备份详解&#xff08;一&#xff09;》中我们已经对服务搭建以及远程…

DAD-DAS模型

DAD-DAS模型 文章目录 DAD-DAS模型[toc]1 产品服务:需求方程2 实际利率:费雪方程3 通货膨胀:菲利普斯方程4 预期通货膨胀&#xff1a;适应性预期5 货币政策规则&#xff1a;泰勒方程6 动态总供给-总需求方程&#xff08;DAS-DAD&#xff09;7 总供给冲击模拟 1 产品服务:需求方…

【JavaEE初阶】文件操作——IO

摄影分享~ 文章目录 文件文件路径&#xff08;Path&#xff09; 文件的类型Java中操作文件File概述 文件内容的读写——数据流字节流InputStream概述OutputStream 概述字符流FileInputStream 概述利用 Scanner 进行字符读取 实例练习 文件 文件&#xff1a;File这个概念&…

PostSQL内存管理之内存上下文

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;14 文档用途 了解pg内存分配 详细信息 1.MemoryContex机制 内存上下文是pg相关的内存控制结构&#xff0c;树形结构组织下的内存上下文能在频繁的…

SNMPc软件的下载和安装教程,计算机网络管理,网络工程师

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

vue 改变数据后,数据变化页面不刷新

文章目录 导文文章重点方法一&#xff1a;使用this.$forceUpdate()强制刷新方法二&#xff1a;Vue.set(object, key, value)方法三&#xff1a;this.$nextTick方法四&#xff1a;$set方法 导文 在vue项目中&#xff0c;会遇到修改完数据&#xff0c;但是视图却没有更新的情况 v…

让开发者成为创新主体 | 阿里云云原生4月动态

作者&#xff1a;云原生内容小组 云原生月度动态 ✦ 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 本栏目每月更新。 01 趋势热点 &…

vue - 实现登录后用户无操作后自动退出登录功能,当用户鼠标不动、键盘不动、无窗口滚动时自动清除登录状态(可自定义删减条件,详细示例源码一键复制开箱即用)

需求 很多教程都是无效而且有bug。。很难用索性自己搞了最健壮的解决方案。 在vue项目中,实现自动检测用户没有【移动鼠标】【操作键盘】【窗口滚动】时,自动清除登录信息强制退出登录下线,支持自定义触发时间(比如无操作10分钟就执行),自定义条件(比如只监听用户鼠标是…

匿名对象以及临时空间

目录 大纲 1.何为匿名对象 2.产生匿名对象的四种情况&#xff1a; 1&#xff09;给初始化对象时 2&#xff09;以值的方式给函数传参&#xff1b; 3&#xff09;类型转换&#xff1b; 4&#xff09;函数返回时&#xff1b; 3.编译器优化 I.在同一行代码的优化 II.在函…

电脑关机很慢怎么办?这5个方法很有用!

案例&#xff1a;电脑关机很慢怎么办&#xff1f; 【我的电脑才买来不久&#xff0c;现在每次关机都很慢&#xff0c;有时甚至一直在转圈圈无法关机&#xff0c;怎么处理这种情况呢&#xff1f;】 如果使用电脑时间长了&#xff0c;我们可能会发现电脑的各项性能都会有所下降…

Vue3(5)插槽Slots

目录 一、插槽内容与出口 二、渲染作用域 三、默认内容 四、具名插槽 五、作用域插槽 六、具名作用域插槽 一、插槽内容与出口 在之前的博文中&#xff0c;我们已经了解到组件能够接收任意类型的JS值作为props&#xff0c;但组件要如何接收模板内容呢&#xff1f;在某些…

图片堆叠、多重聚焦的几种办法

当拍摄的物品较小&#xff0c;景深较深时&#xff0c;相机的焦点只能放在较近或者较远的一处&#xff0c;图片的整个画面就不能保证完全清晰&#xff0c;多重聚焦的原理其实就是拼合&#xff0c;在画幅的不同处拍摄聚焦图片&#xff0c;将各个聚焦的内容拼合在一起&#xff0c;…

杂记 2023.5.11

目录 come across(as).. 与异性对话经验和理论、策略 单词记忆 机器学习 come across(as).. 这个用法在口语里超级高频&#xff0c;表示「给人.印象&#xff0c;让人觉得..」&#xff0c;s后面可跟名词、形容词、 being形容词。 我们再来看几个例子&#xff1a; ◆He comes ac…

【Leetcode -455.分发饼干 -459.重复的字符串】

Leetcode Leetcode -455.分发饼干Leetcode - 459.重复的字符串 Leetcode -455.分发饼干 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩…

多语言的APP外包开发流程

很多创业的人希望把APP做成多国家使用的模式&#xff0c;尤其是一些小游戏开发&#xff0c;很多小游戏玩法全世界都是一样的&#xff0c;这样开发一次就可以在全球推广。在开发这种类型软件的过程中需要注意哪些呢&#xff0c;今天和大家分享这方面的知识。北京木奇移动技术有限…