halcon读取dxf坐标翻转_Halcon二维仿射变换实例探究

二维仿射变换,顾名思义就是在二维平面内,对对象进行平移、旋转、缩放等变换的行为(当然还有其他的变换,这里仅论述这三种最常见的)。

Halcon中进行仿射变换的常见步骤如下:

① 通过hom_mat2d_identity算子创建一个初始化矩阵(即[1.0, 0.0, 0.0, 0.0, 1.0, 0.0]);

② 在初始化矩阵的基础上,使用hom_mat2d_translate(平移)、hom_mat2d_rotate(旋转)、hom_mat2d_scale(缩放)等生成仿射变换矩阵;(这几个算子可以叠加或者重复使用)

③ 根据生成的变换矩阵执行仿射变换,执行仿射变换的算子通常有:affine_trans_image、affine_trans_region、affine_trans_contour_xld,即不管对于图像、区域、XLD都可以执行仿射变换。

下面用一个完整程序分别展示hom_mat2d_translate(平移)、hom_mat2d_rotate(旋转)、hom_mat2d_scale(缩放)这三个算子的的具体功能。(特别要注意程序注释部分)

hom_mat2d_translate( : : HomMat2D, Tx, Ty : HomMat2DTranslate)

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

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

程序所用图片如下:

1 read_image (Image, 'hogn-1.jpg')2 threshold (Image, Region, 0, 200)3 opening_circle (Region, Region, 1.5)4 connection (Region, ConnectedRegions)5 select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)6 *得到变换的中心点7 area_center (SelectedRegions, Area,Row, Column)8 dev_set_draw ('margin')9

10 *hom_mat2d_translate中的两个参数的意思是:Tx和Ty分别代表Row方向和Column方向的平移量11 dev_display (Image)12 disp_cross (3600, Row, Column, 10, 40)13 hom_mat2d_identity (HomMat2DIdentity)14 hom_mat2d_translate (HomMat2DIdentity,30, 150, HomMat2DTranslate)15 affine_trans_region (Region, RegionAffineTrans, HomMat2DTranslate, 'nearest_neighbor')16

17 *hom_mat2d_rotate中的三个参数的意思是:旋转角度(逆时针为正,弧度制),旋转中心的row和column值18 dev_display (Image)19 disp_cross (3600, Row, Column, 10, 40)20 hom_mat2d_rotate (HomMat2DIdentity, rad(20), Row, Column, HomMat2DRotate)21 affine_trans_region (Region, RegionAffineTrans, HomMat2DRotate, 'nearest_neighbor')22

23*hom_mat2d_scale中的四个参数的意思是:Sx和Sy分别代表Row方向和Column方向的缩放系数,缩放中心的row和column值24 dev_display (Image)25 disp_cross (3600, Row, Column, 10, 40)26 hom_mat2d_scale (HomMat2DIdentity, 2.0, 1.05, Row, Column, HomMat2DScale)27 affine_trans_region (Region, RegionAffineTrans, HomMat2DScale, 'nearest_neighbor')

效果分别如下:

有时候,并不需要创建初始化矩阵也可以执行仿射变换,例如vector_angle_to_rigid算子就是如此。

vector_angle_to_rigid( : :Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)

该算子意思是:先将图像旋转,旋转角度为(Angle2 - Angle1) (逆时针为正),旋转中心坐标是(Row1, Column1)。再将原图的点(Row1, Column1)一一对应移到点 (Row2, Column2)上,移动的row和column方向的位移分别是( Row2 - Row1)、( Column2 - Column1),

如果Row1 = Row2, Column1 = Column2,那么就完整等价于旋转变换。可以执行下面的程序感受一下:

1 read_image (Image, 'hogn-1.jpg')2 Row := 100

3 Column := 200

4 dev_display (Image)5

6

7 for Index := 1 to 150 by 1

8 vector_angle_to_rigid (Row, Column, 0, Row, Column, rad(10), HomMat2D)9 disp_cross (3600, 100, 200, 10, 40)10 affine_trans_image (Image, ImageAffinTrans, HomMat2D, 'nearest_neighbor', 'false')11 copy_image (ImageAffinTrans, Image)12 endfor

可以将vector_angle_to_rigid理解为同时执行旋转变换和平移变换。最难弄明白的是旋转中心是什么?下面的程序可以说明如果先旋转后平移,那么旋转中心是(Row1, Column1),而不是 (Row2, Column2)。(如果先平移后旋转,那么结论刚好相反,大家可以试试)

1 read_image (Image, 'hogn-1.jpg')2 Row1 := 100

3 Column1 := 100

4

5 Row2 := 100

6 Column2 := 200

7 dev_display (Image)8 *用vector_angle_to_rigid实现缩放、平移9 vector_angle_to_rigid (Row1, Column1, 0, Row2, Column2, rad(10), HomMat2D)10 affine_trans_image (Image, ImageAffinTrans, HomMat2D, 'nearest_neighbor', 'false')11

12 *分两步依次执行缩放、平移13 hom_mat2d_identity (HomMat2DIdentity)14 hom_mat2d_rotate (HomMat2DIdentity, rad(10) - 0, Row1, Column1, HomMat2DRotate)15 hom_mat2d_translate (HomMat2DRotate,Row2 - Row1, Column2 -Column1, HomMat2DTranslate)16 *观察图像ImageAffinTrans和ImageAffinTrans_2能够完全重合17 affine_trans_image (Image, ImageAffinTrans_2, HomMat2DTranslate, 'nearest_neighbor', 'false')18

19 disp_cross (3600, Row1, Column1, 10, 40)

vector_angle_to_rigid最常用到的场合一般是模板匹配之类的算法场合,通常用在find_shape_model等算子后面。

下面用一个例子说明一下仿射变换的综合应用,即当图片旋转90°时,想办法变换Region使之能够翻转到对应的位置。

将图片顺时针翻转90°的方法可以是:rotate_image (image, ImageRotate, -90, 'constant')。

但其实它不仅经过了旋转变换、还进行了平移变换,最明显的证据就是:翻转前后的图像,他们的中心点坐标不一样。完整程序如下:

1 read_image (image, 'C:/Users/happy xia/Desktop/dynPic.png')2 binary_threshold (image, Region, 'max_separability', 'dark', UsedThreshold)3 dev_set_draw ('margin')4 connection (Region, ConnectedRegions)5 select_shape_std (ConnectedRegions, SelectedReg, 'max_area', 70)6 area_center (image, Area, Row, Column)7

8 rotate_image (image, ImageRotate, -90, 'constant')9 area_center (ImageRotate, Area2, Row2, Column2)10

11 hom_mat2d_identity (HomMat2DIdentity)12 hom_mat2d_rotate (HomMat2DIdentity, -rad(90), Row, Column, HomMat2DRotate)13 hom_mat2d_translate (HomMat2DRotate,Row2 - Row, Column2 -Column, HomMat2DTranslate)14

15 affine_trans_region (SelectedReg, RegionAffineTrans, HomMat2DTranslate, 'constant')

该算法顺利达到了目的——图像翻转以后,原先生成的Region也翻转到了对应的位置。

注意:用rotate_image 算子旋转图像时,如果旋转角度不是0°、90°、180°、270°等角度,那么图像其实只做了旋转变换,而没有进行平移变换。

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

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

相关文章

记录一下,踩得奇奇怪怪的坑

1servlet虚拟路径访问不到(默认的可以访问) url后的路径设置时与项目的名称一致 url必须与这个一致 2.jdbc连接数据库,本地测试无问题,一用tomcat发包就出错,导致连接不上时,看看你得配置文件的位置是否有误 放到resources目录下…

归并排序算法(C#实现)

归并排序(Merge Sort)是利用"归并"技术来进行排序。归并是指将若干个已排序的子文件合并成一个有序的文件。归并排序有两种方式:1): 自底向上的方法 2):自顶向下的方法 1、 自底向上的方法(1) 自底向上的基本思想 自底向上的基…

m5310采用芯片 中移物联_芯链HPB引领硬件区块链加密芯片技术,有望在谷歌光芯之前突破...

伴随人工智能时代的开启,世界对于高性能计算机器的需求磅礴发展;以往的高性能计算芯片是基于CMOS数字电路的处理器,而伴随着电子元件的摩尔定律接近技术瓶颈,数字电路芯片的发展速度和发展基础都在缓慢进行;区块链技术…

计算机的硬件工作原理(图片部分资源摘自王道考研资料)

一、现代计算机的组成 此处主存和辅存可以理解为,内存和外存,内存的特点是读取速度快但是不利于保存大量数据,外存的特点 是读取速度慢,但是可以存储大量数据 计算机在开机时不会读取硬盘上的所有数据,开机时先读取的…

rstp协议和stp协议对比_3.TCP和UDP协议对比

TCP、UDP协议对比任务:掌握TCP协议、UDP协议的作用;TCP的三次握手和四次挥手;RST断开连接过程和作用。1.TCPTCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC …

XML文件读取工具类

/// <summary> /// Author: jiangxiaoqiang /// </summary> public class XmlReader {// //#region 获取XmlDocument对象/// <summary>/// 根据XML文件内容获取XmlDocument对象/// </summary>/// <param name"xmlFileContent"></pa…

下面为子代选择器结合符的是_郑州大学编译原理试卷及答案(往年试题整合)

二填空题1. 不同的编译程序关于数据空间的存储分配策略可能不同&#xff0c;但大部分编译中采用的方案有两种&#xff1a;静态存储分配方案和动态存储分配方案&#xff0c;而后者又分为(1)和(2)。 2. 规范规约是最(3)规约。3. 编译程序的工作过程一般划分为5个阶段&#xff1a;…

计算机组成原理-数据的表示和运算(图片资源摘自王道考研资料)

一、进位计数制 二、BCD码 此处&#xff1a; 58 0101 1000 1101 超出数据能表达的范围&#xff0c;因为 8421码只能表示0-9 十以上数据视为无效数据&#xff0c;因此在此基础上加六&#xff0c;进行校正--> 11010110 0001 0011 ----拆成两个看

lacp可以在access接口吗_现网必用的链路冗余技术,静态LACP链路捆绑,两分钟快速掌握...

一、链路聚合链路聚合(Link Aggregation)是将—组物理接口捆绑在一起作为一个逻辑接口来增加带宽的一种方法&#xff0c;又称为多接口负载均衡组(Load Sharing Group)或链路聚合组(Link Aggregation Group)1、配置手工负载分担模式链路聚合手工负载分担模式下&#xff0c;Eth-T…

ddl dml dcl

DCL数据控制语言 创建临时表空间 create temporary tablespace user_temp tempfile E:/oracle/product/10.1.0/oradata/orcl/user_temp.dbf size 50m autoextend on next 32m maxsize 2048m extent management local; 创建用户表空间 CREATE TABLESPACE tbs_sns_…

Spring 集成web环境

Spring 集成web环境 一、配置ContextLoaderListener 监听器 1.maven坐标 org.springframework spring-web 5.3.14 2.web.xml <context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</para…

一只青蛙跳向三个台阶_8. 跳台阶

一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。1. 思路&#xff1a;若只有一级台阶&#xff1a;一种跳法两级台阶&#xff1a;两种跳法(11 / 2)三级台阶&#xff1a;三种跳法(111 / 12 / 21)四级台阶&#xff1a;五种跳法…

spring 框架(一)

目录 一、spring简介 二、spring入门 三、spring配置文件 3.1.bean标签的基本配置(applicationContext.xml) 3.2Bean&#xff08;scope:指对象的作用范围&#xff09;标签范围配置 3.3 Bean生命周期配置 3.4 Bean实例化三种方式 3.5 Bean的依赖注入入门 3.6 Bean的依赖…

wireshark过滤使用

过滤器的区别 捕捉过滤器&#xff08;CaptureFilters&#xff09;&#xff1a;用于决定将什么样的信息记录在捕捉结果中。需要在开始捕捉前设置。显示过滤器&#xff08;DisplayFilters&#xff09;&#xff1a;在捕捉结果中进行详细查找。他们可以在得到捕捉结果后随意修改。那…

cdr添加节点快捷键_CDR快捷键分享,需要的赶紧收藏!

点击上方蓝字&#xff0c;关注我们哦&#xff01;&#xff01;有粉丝在后台留言说&#xff0c;希望我分享一下CDR的快捷键&#xff0c;今天我整理了一下快捷键。来源&#xff1a;内容整理自网络&#xff0c;仅供学习交流一工具箱I 绘制曲线&#xff0c;并对笔划使用预置、画刷、…

spring 框架(二)

目录 一、Spring配置数据源 1.1 数据源(连接池)的作用 1.2数据源的使用 1.3基本实现 1.4.抽取配置文件&#xff0c;降低耦合性(druid) 1.4.1抽取jdbc.properties文件 1.4.2设置数据源的基本连接数据&#xff0c;通过applicationContext.xml设置数据库参数applicationCon…