什么是变形矩阵?

译序:在前面学习HTML5 Canvas和CSS3动画的时候,我都刻意避开了变形矩阵,原因在于不太理解该矩阵的具体含义。后来搜索了相关的介绍,找到了一篇W3C的文档,节选翻译如下。变形其实也是挺简单的。


原文地址:http://www.w3.org/TR/SVG/coords.html#TransformMatrixDefined

在数学中,所有的变形都能用3X3的变形矩阵来表示,形式如下:


在上述的3X3矩阵中只用到了6个值,因而变形矩阵也可以表示为如下的向量形式:

[a b c d e f]

变形的数学实质实际上是将坐标和长度从新的坐标系统中(newCoordSys)映射到旧的坐标系统(prevCoordSys)中,如下所示:


简单的变形可以用变形矩阵形式表示,如下所示:

  • 位移translate)等价于矩阵或者向量[1 0 0 1 tx ty],其中tx和ty分别表示在坐标系中x和y坐标位移的距离。
  • 缩放scale)等价于矩阵或者向量[sx 0 0 sy 0 0]。新坐标系中的x、y坐标值分别是旧坐标系中的x、y值的sx倍和sy倍。
  • 围绕挂点(origin)的旋转rotate)等价于矩阵或者向量[cos(a) sin(a) -sin(a) cos(a) 0 0],其效果是按角度a旋转坐标轴。
  • 沿x方向的倾斜变形(skewX)等价于矩阵或者向量[1 0 tan(a) 1 0 0],其效果是按角度a倾斜x坐标。
  • 沿y方向的倾斜变形(skewY)等价于矩阵或者向量[1 tan(a) 0 1 0 0],其效果是按角度a倾斜y坐标。

变形可以进行任意层次的嵌套。嵌套变形的效果就是将变形矩阵按变形的先后顺序连乘(串联)在一起:


对于每个给定的元素,定义在它和它的所有依赖它来建立视图的祖先元素(通常是给定元素最直接的SVG祖先)之上的变形矩阵的累乘叫做当前变形矩阵(CTM)。因此CTM也表示当前用户编辑坐标到实际视图坐标的映射:

### 九点标定 3x3 矩阵的定义与用途 在计算机视觉中,九点标定通常指的是通过九个对应点来求解一个 3x3 的单应矩阵(Homography Matrix)。单应矩阵描述了两个平面之间的几何变换关系,例如从一个平面到另一个平面的投影变换[^5]。该矩阵可以用于校正图像变形、计算相机姿态以及进行立体视觉中的点匹配。 #### 定义 九点标定的核心在于利用九对已知的对应点(通常是世界坐标系中的点和图像坐标系中的点),通过线性方程组求解一个 3x3 的单应矩阵 \( H \)。单应矩阵的形式如下: \[ H = \begin{bmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{bmatrix} \] 其中,\( H \) 将一个平面内的点 \( (x, y) \) 映射到另一个平面内的点 \( (x', y') \),满足以下关系: \[ \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = H \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} \] 为了确保解的唯一性,通常会将 \( h_{33} \) 归一化为 1。因此,实际需要求解的参数为 8 个[^4]。 #### 用途 九点标定 3x3 矩阵的主要用途包括但不限于以下几个方面: 1. **图像校正**:通过计算单应矩阵,可以将图像中的透视畸变校正为正视图。例如,在无人机拍摄的地面上的照片中,消除由于倾斜角度导致的变形。 2. **相机标定**:结合外参矩阵 \( [R | t] \)[^3] 和内参矩阵 \( K \),可以通过单应矩阵间接估计相机的内外参数。这种方法在没有精确标定板的情况下尤为有用。 3. **立体视觉**:在两幅图像之间建立对应关系时,基础矩阵 \( F \) 和本质矩阵 \( E \) 可以通过单应矩阵推导得到[^2]。这些矩阵进一步用于恢复场景的三维结构。 4. **增强现实(AR)**:单应矩阵能够将虚拟物体正确地叠加到真实场景中,确保其位置和方向与实际环境一致。 #### 示例代码 以下是使用 OpenCV 计算单应矩阵的一个简单示例: ```python import cv2 import numpy as np # 定义世界坐标系中的点 pts_world = np.array([[0, 0], [1, 0], [1, 1], [0, 1]], dtype=np.float32) # 定义图像坐标系中的点 pts_image = np.array([[10, 10], [110, 10], [110, 110], [10, 110]], dtype=np.float32) # 计算单应矩阵 H, _ = cv2.findHomography(pts_world, pts_image) print("单应矩阵 H:") print(H) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值