深入浅出HALCON几何变换

在机器视觉系统中,镜头是重要成像部件之一,而基于小孔成像原理的工业镜头往往会产生透视畸变现象,如何校正畸变是进行图像分析的前提 ,这其中就会用到投影变换,也是几何变换的一种。除此之外,图像处理中常用到的平移、旋转、缩放等,也属于几何变换。本文将通过实例详细介绍HALCON中的几何变换。

基础知识

齐次坐标(Homogenous Coordinate)

齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示。例如二维点p(x,y)àp(x,y, w)就成了齐次坐标,同理三维点p(x,y,z)àp(x,y,z, w)也成了齐次坐标。显然,齐次坐标的表达并不是唯一的,随w值的不同而不同。在计算机图学中,w 作为通用比例因子,它可取任意正值,但一般在几何变换中,总是取w=1。齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易于进行几何变换。

以点p(x,y)为例,如果想把它平移至p(x+a,y+b),是不可能用矩阵计算完成的,现在换成齐次坐标(x,y,1),通过矩阵相乘(左侧公式) ,很方便得到平移后的坐标(x+a,y+b)。通常把变换矩阵写到左侧,为了保持一致把变换矩阵改成右下角形式,这就是齐次变换矩阵。

齐次变换矩阵

在同一变换矩阵中既表示姿态(旋转、缩放等)又表示位置(平移),这种形式的矩阵称为齐次变换矩阵。如下:

齐次坐标的使用,使得几何变换更容易计算,尤其对于仿射变换(二维/三维)更加方便,由于图形硬件、视觉算法已经普遍支持齐次坐标与矩阵乘法,因此更加促进了齐次坐标使用,使得它成为图形学中的一个标准,下面提到的几何变换(仿射变换)都以齐次坐标和齐次变换矩阵为基础。

几何变换

几何变换包括:

相似变换(Similarity Transformation)

仿射变换(Affine Transformation)

投影变换(Projective Transformation)

注:线性变换不包含平移,所以没有归入几何变换,总之HALCON中常用几何变换是仿射和投影变换,而相似变换是仿射变换的一种简单情况!相似变换、仿射变换、投影变换既可以发生在二维空间内也可发生在三维空间内。

相似变换

相似变换的定义:由一个平面/立体图形变换到另一个平面/立体图形,在改变的过程中保持形状不变(大小方向和位置可变),任何相似变换都可以分解为等比例缩放、平移、旋转的组合,例如,对于缩放,用齐次变换矩阵可以如下表示(二维和三维),其中a≠0。

仿射变换

仿射变换的定义:由一个平面/立体图形变换到另一个平面/立体图形,在改变的过程中保持直线和平行线不变(平行线映射为平行线),任何仿射变换都可以分解为缩放、平移、旋转和切变(Shearing)的组合,对于仿射变换,齐次变换矩阵如下表示(二维和三维):

对于仿射变换,有两个比较特殊的变换:非等比例缩放和切变(如下图),除了这两个特殊的变换之外,相似变换可以看做是仿射变换的特殊形式,注:线性变换包括旋转、缩放、切变,但不包含平移,因此仿射变换也定义为一个线性变换再加上一个平移变换。

投影变换

投影变换的定义:变换过程中,直线映射为直线(但不一定保证平行度),任何二维投影变换都可以用3x3可逆矩阵表示,而任何三维投影变换都可以用4x4可逆矩阵表示。如下:

从定义来看,仿射变换可以看做是投影变换的特殊形式。另外,把投影变换矩阵的最后一行变为[0,0,1]或者[0,0,0,1],即可变为仿射变换矩阵,也可以证明仿射变换是投影变换的特殊形式。因此,对于平移、缩放、切变等,仿射变换和投影变换都可以实现。

如下例子,把左图进行旋转操作变成右图,可以用仿射变换和投影变换两种方式实现。

  • 仿射变换实现方法

hom_mat2d_identity (HomMat2DIdentity)

hom_mat2d_rotate (HomMat2DIdentity, rad(-90), 256, 256, HomMat2DRotate)

affine_trans_image (Image, ImageAffinTrans, HomMat2DRotate, 'constant', 'false')

  • 投影变换实现方法之一

(直接用给定点生成投影变换矩阵)

hom_vector_to_proj_hom_mat2d([0,0,512,512],[0,512,512,0],[1,1,1,1], [512,512,0,0], [1,1,1,1], ‘dlt', HomMat2D)

projective_trans_image (Image, TransImage, HomMat2D, 'bilinear', 'false', 'false')

  • 投影变换实现方法之二

(用三维仿射变换矩阵生成投影变换矩阵)

注:对于旋转来说,也可以看做是相机沿Z轴旋转90度后的成像效果,因此也可以用三维仿射变换,先转换相机坐标系,再生成投影变换矩阵!

hom_mat3d_identity (HomMat3DIdentity)

hom_mat3d_rotate (HomMat3DIdentity, rad(90), 'z', 256, 256, 512, HomMat3DRotate)

hom_mat3d_project (HomMat3DRotate, 256, 256, 512, HomMat2D)

projective_trans_image (Image, TransImage, HomMat2D, 'bilinear', 'false', 'false')

旋转示例中的仿射变换矩阵(也是齐次变换矩阵)

旋转示例中的投影变换矩阵(3X3),也是可逆矩阵

同理,缩放、切变等,仿射变换和投影变换也都可以实现,但如下变换,只能用二维投影变换矩阵实现,因为变换过程中没有保证线的平行性。

S

总结

HALCON中所用的变换知识只涉及到了二维、三维仿射变换和二维投影变换,二维仿射变换多用于平面图像的平移、旋转、缩放等;三维仿射变换多用于三维坐标系的平移、旋转等(或者用3D位姿表示),而二维投影变换多用于校正透视畸变,也就是三维空间的景象如何投影到相机靶面上的效果,如果相机和被测平面不垂直就会有畸变。

在成像过程中,普通工业镜头(小孔成像原理)都会带来透视畸变,也就是常见的近大远小现象,除非相机和被测平面保持绝对垂直,否则透视畸变是不可避免的。因此,通过三维空间的仿射变换(变换坐标系,使相机不垂直于被摄平面),可以产生透视畸变效果,也就是相当于进行了投影变换,HALCON也提供了算子hom_mat3d_project,能直接把三维仿射变换矩阵转换成二维投影变换矩阵(4x4的矩阵转换成3x3矩阵)。下面我们通过一个例子来说明一下。

首先生成单位矩阵,进行一系列的旋转变换,产生三维仿射变换矩阵,也就是使得相机和被摄平面不垂于!

hom_mat3d_identity (HomMat3D)

hom_mat3d_rotate (HomMat3D, rad(20.0), 'z', PrincipalRow, PrincipalColumn, Focus, HomMat3D)

hom_mat3d_rotate (HomMat3D, rad(35.0), 'y', PrincipalRow, PrincipalColumn, Focus, HomMat3D)

hom_mat3d_rotate (HomMat3D, rad(25.0), 'x', PrincipalRow, PrincipalColumn, Focus, HomMat3D)

把三维仿射变换矩阵再转化成二维投影变换矩阵

hom_mat3d_project (HomMat3D, PrincipalRow, PrincipalColumn, Focus, ProjectionMatrix)

进行投影变换,也就是我们看到的右侧的效果

projective_trans_image (Image, TransImage, ProjectionMatrix, 'bilinear', 'false', 'false')

另外一种方法是,直接使用给定点生成投影变换矩阵,可以得到同样的效果

hom_vector_to_proj_hom_mat2d ([0,0,512,512], [0,512,512,0], [1,1,1,1], [-120,146,555,296], [120,752,368,72], [1,1,1,1], 'normalized_dlt', HomMat2D)

projective_trans_image (Image, TransImage1, HomMat2D, 'bilinear', 'false', 'false')

上面的这个例子是很好的说明了透视畸变现象如何产生的,左侧图是相机垂直于被摄平面,没有透视变形现象。然后进行了一系列的三维仿射变换,产生的效果就是相机不再垂直于被摄面,所以右图产生了透视畸变现象,那么从左图到右图恰恰是进行了一次二维投影变换。因为投影变换矩阵是可逆的,所以也可以把右图校正为左图,这恰恰是HALCON中投影变换的用处所在!

以下例子也是HALCON中典型的畸变校正示例,使用的正是投影变换。

附录

解释一下HALCON中的:

hom_mat2d_*和hom_mat3d_*算子

hom_mat2d_identity产生2x3矩阵,用于描述二维变换,实际上是3x3齐次变换矩阵(仿射变换);

hom_mat3d_identity产生3x4矩阵,用于描述三维变换,实际上是4x4齐次变换矩阵(仿射变换);

hom_mat2d_*既支持2x3矩阵(仿射变换)也支持3x3矩阵(投影变换);

hom_mat3d_*支持3x4矩阵(仿射变换),也就是4x4齐次变换矩阵

关于如何在HALCON中生成的:

仿射变换矩阵和投影变换矩阵

仿射变换矩阵

用hom_mat2d_identity或者hom_mat3d_identity产生单位矩阵,然后经过平移、旋转、缩放等操作后得到仿射变换矩阵。

投影变换矩阵

hom_mat3d_project能直接把三维仿射变换矩阵转换成投影变换矩阵,如果知道空间坐标系是如何变换的,可以用这种方法;

hom_vector_to_proj_hom_mat2d用给定点生成投影变换矩阵,输入点的坐标为三维齐次坐标,可以支持无穷远点和有限远点的变换;

vector_to_proj_hom_mat2d用给定点生成投影变换矩阵,输入点为二维非齐次坐标,支持有限远的点的变换;

注:对于涉及有限远点的变换,以上两个算子都可以!

HALCON几何变换相关推荐

  1. 数字图像处理之几何变换

    ............................................................................. imresize  IMRESIZE Res ...

  2. Halcon 第七章『图像的几何变换』◆第1节:图像的仿射变换(位置变换、形状变换)及应用

    一.介绍 由于相机拍摄的时候可能存在角度偏差,因此实际获得的画面可能会与想象中有所差异.为了校正图像在拍摄中的失真问题,可以对图像进行一些简单的几何变换,如平移.缩放和旋转等,这些是图形学中的基本几何 ...

  3. Halcon区域几何变换和仿射变换

    Halcon区域几何变换和仿射变换 一.Halcon区域几何变换 1.move_region 平移 2.zoom_region 缩放 3.mirror_region 镜像 4.transpose_re ...

  4. Halcon图像预处理与形态学(图像的几何变换)

    插值算法 在对图像进行变换时可能产生一些原图中非整数未知的点,此时需要进行插值运算来计算这一点的灰度值.Halcon中有两种常用的插值算法:最邻近插值('nearest_neighbor')和双线性插 ...

  5. Halcon 第七章『图像的几何变换』◆第2节:投影变换

    一.介绍 投影变换也叫透射变换.投影映射.透射变换是将图像投影到一个新的视平面,是一种二维坐标到三维坐标的变换. 透射变换是仿射变换的延续,也可以说仿射变换是透射变换的一种特殊形式.其特殊性在于变换后 ...

  6. Geometric-Transformations图像几何变换halcon算子,持续更新

    目录 affine_trans_image affine_trans_image_size convert_map_type map_image mirror_image polar_trans_im ...

  7. halcon/c++接口基础 之 HALCON图像变量类

    在HALCON/C++中,HObject是一个基类,可以表示图像变量.另外还有三种类继承自HObject. Class HImage 处理图像 Class HRegion 处理区域 Class HXL ...

  8. Halcon学习笔记——机器视觉应用工程开发思路及相机标定

    机器视觉应用工程开发思路 机器视觉应用工程主要可划分为两大部分,硬件部分和软件部分. 1.硬件部分,硬件的选型至关重要,决定了后续工作是否可以正常开展,其中关键硬件部分包括:光源,相机以及镜头. 2. ...

  9. Halcon:基本例程

    图像滤波 图像增强:对比度增强,亮度校正,直方图归一化,直方图均衡化 平滑滤波:边缘保护和增强平滑,各向非同性滤波,高斯平滑,二项式滤波, 均值 滤波,阶梯滤波器(中值,分离系数中值滤波,加权中值等) ...

最新文章

  1. 《高效团队开发工具与方法》
  2. 网络推广——网络推广专员是如何进行图像优化的?
  3. jsp中 input placeholder_前端工作中的方法总结
  4. JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器
  5. python绘制k线图的步骤_Python使用PyQtGraph绘制股票行情K线图
  6. php 判断同时存在英文跟数字,php判断输入是否是纯数字,英文,汉字的方法
  7. Android连续点击多次事件的实现
  8. Strust2用户注册,使用token防止刷新重复提交
  9. Pytorch使用Tensorboard记录loss曲线 (Tensorboard学习二)
  10. SAP NetWeaver 平台介绍
  11. QT每日一练day16:QMessageBox消息对话框
  12. android之monkey测试
  13. 网站源码获取工具 Teleport Ultra
  14. spring boot中自定义Filter过滤器
  15. html5微信 红包源码,微信抢红包源码和模拟demo
  16. 西南交通大学高级语言程序设计(SCAI000812)第2次实验报告-学生成绩管理系统(链表版)
  17. 微信小程序canvas 证件照制作
  18. 如何计算变量或数据类型所占内存空间的大小
  19. mysql连接flush-hosts问题处理
  20. 09 嵌入式C语言如何实现多级队列缓存(Queue、FIFO)

热门文章

  1. Matlab/simulink MIL自动化测试工具使用说明
  2. Android开发中父类与子类通讯的一个简单实现
  3. PHP解决网页乱码问题
  4. rsp rbp 寄存器用途
  5. linux之Centos6升级至centos7
  6. vsc code-runner插件运行python文件,解释器更改为ananconda
  7. 【网络工程师必备干货】Smart Link可靠性技术详解
  8. RS232-CAN 对接测试 - 基于乐电新南 RS232-CAN 转换器
  9. 优化长尾词,优化长尾词的3个方法
  10. python操作微信手机端下载_【python】自动化连接和操作手机微信