CGAffineTransform-仿射矩阵的变换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CGAffineTransform-仿射矩阵的变换相关的知识,希望对你有一定的参考价值。

参考技术A 首先说一下CGAffineTransform的常见应用场景

反射矩阵原理

这样可以看出其实变换之后的x' 和a、c、tx有关系,y'和b、d、ty有关系。
可以通过这些值的变化组合成可以缩放、平移、旋转等各种变形的变化

简单点去想,如果c和b都为0,这样就x'和y'就只能是x和y的缩放和平移了
这样就只能通过改变a和d做缩放变换,利用tx,ty做平移变换

再简单一点,如果a=1,c=0,tx=0;b=0,d=0,ty=0;则会出现x'=x;y'=y;也就是说[1,0,0,1,0,0]这就是没有任何变换的矩阵。苹果用一个常量CGAffineTransformIdentity定义

只要是看得到的界面基本都有transform属性,并且默认是CGAffineTransformIdentity

苹果对一些常用的变换进行了整合,是开发起来更加方便

这一个是最基本的方法,也是最强大的方法,对应上边分析的各个参数,但是在开发中不常用,对应的值不好掌握。苹果有提供了特定功能的方法。

是否是初始矩阵

是否相同

point转换

size 转换

rect转换

CGAffineTransform 是转换坐标的一个工具类,内部基于了一个数学公式。

OpenCV仿射变换+投射变换+单应性矩阵

OpenCV仿射变换+投射变换+单应性矩阵

本来想用单应性求解小规模运动的物体的位移,但是后来发现即使是很微小的位移也会带来超级大的误差甚至错误求解,看起来这个方法各种行不通,还是要匹配知道深度了以后才能从三维仿射变换来入手了,纠结~技术分享图片
  • estimateRigidTransform():计算多个二维点对或者图像之间的最优仿射变换矩阵 (2行x3列),H可以是部分自由度,比如各向一致的切变。
  • getAffineTransform():计算3个二维点对之间的仿射变换矩阵H(2行x3列),自由度为6.
  • warpAffine():对输入图像进行仿射变换
  • findHomography: 计算多个二维点对之间的最优单映射变换矩阵 H(3行x3列) ,使用最小均方误差或者RANSAC方法 。
  • getPerspectiveTransform():计算4个二维点对之间的透射变换矩阵 H(3行x3列)
  • warpPerspective(): 对输入图像进行透射变换
  • perspectiveTransform():对二维或者三维矢量进行透射变换,也就是对输入二维坐标点或者三维坐标点进行投射变换。
  • estimateAffine3D:计算多个三维点对之间的最优三维仿射变换矩阵H (3行x4列)
  • transform():对输入的N维矢量进行变换,可用于进行仿射变换、图像色彩变换.
  • findFundamentalMat:计算多个点对之间的基矩阵H。
快速解决:
  • 问题1:如何计算3个二维点对之间的仿射变换矩阵?
答:使用getAffineTransform()。
  • 问题2:如何计算多个二维点对之间的仿射变换矩阵(使用误差最小准则 )?
答:使用estimateRigidTransform()或者findHomography。
  • 问题3:如何计算4个二维点对之间的透射变换?
答:使用getPerspectiveTransform()。
  • 问题4:如何计算多个三维点对之间的仿射变换?
答:使用estimateAffine3D。
  • 问题5:如何对输入图像进行仿射变换?
答:使用warpAffine()。
  • 问题6:如何对输入图像进行透射变换?
答:使用perspectiveTransform()。
  • 问题7:如何对输入的二维点对进行仿射变换?
答:使用transform()。
  • 问题8:如何对输入的三维点对进行投射变换?
答:使用perspectiveTransform()。

以上是关于CGAffineTransform-仿射矩阵的变换的主要内容,如果未能解决你的问题,请参考以下文章

仿射变换(CGAffineTransform)使用小结

CGAffineTransform

iOS开发之仿射变换示例总结

CGAffineTransform 放射变换解析 即矩阵变换

【转】仿射变换及其变换矩阵的理解

iOS-Core Animation: 变换