[读书笔记]<游戏引擎架构>|仿射矩阵

这篇读书笔记聚焦于《游戏引擎架构》中的仿射矩阵概念,详细介绍了4*4变换矩阵,包括平移、旋转和缩放的组合应用。文章通过矩阵乘法公式,展示了如何构建基础变换矩阵,并分别提供了平移、旋转和缩放矩阵的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本系列记录读<游戏引擎架构>看到的内容中觉得自己以后可能会用到的部分,做一些整理,方便自己查找。


Orz线性代数都快还给老师了.

仿射矩阵(affine matrix)是4*4变换矩阵。
由平移、旋转、缩放所组合成的变换都是仿射矩阵。

矩阵乘法
Pxy = Axn*Bny (不符合交换律)

Pij=k=1nAikBkj

基础变换矩阵
[U3×3t1×3O3×11]

  • U代表旋转及/或缩放
  • 1×3平移矢量t
  • 3×1零矢量O=[0 0 0]T
  • 矩阵右下角的标量1

平移矩阵

 translation(tx,ty,tz)=

<think>好的,我现在要回答用户关于如何在OpenCV中使用仿射矩阵进行图像变换的问题。首先,我需要回忆一下OpenCV中相关的函数和步骤。 用户提到仿射变换,可能需要先解释什么是仿射变换。仿射变换包括平移、旋转、缩放和剪切等操作,保持直线和平行性。接下来,用户需要具体的使用方法和示例,所以我应该分步骤说明。 首先,确定用户需要的关键函数。根据引用中的信息,cv2.getAffineTransform用于生成仿射矩阵,而cv2.getRotationMatrix2D用于生成旋转矩阵。此外,cv2.warpAffine是应用变换的函数。这些函数需要详细说明参数和用法。 然后,我需要给出具体的代码示例。比如,平移变换需要定义三个点的坐标变化,而旋转则需要中心点、角度和缩放比例。用户提供的引用中有一些示例代码,可以参考这些来编写正确的示例。 另外,用户可能对仿射变换的原理不太清楚,是否需要简要说明?不过用户的问题集中在使用方法,可能更关注代码实现。所以应该以步骤和示例为主,适当解释参数。 需要注意的是,用户要求回答结构清晰,分步骤解决。所以应该将过程分解为创建变换矩阵和应用变换两个主要步骤,每个步骤下再细分不同情况,比如平移、旋转、自定义仿射变换等。 还需要检查引用的来源是否正确。用户提供的引用[^1]、[^2]、[^3]、[^4]都与仿射变换相关,特别是getRotationMatrix2D和warpAffine的使用,所以需要正确对应到回答中的步骤。 最后,生成相关问题时要围绕仿射变换的其他方面,比如参数影响、不同变换的区别、常见错误等,确保问题有针对性,帮助用户深入理解。 现在,整理这些思路,组织成结构化的回答,包含步骤说明、代码示例和相关问题。确保使用正确的中文术语,代码格式正确,数学表达式用$...$或$$...$$包裹,并正确引用来源。</think>### OpenCV仿射矩阵使用方法详解 #### 一、仿射变换基础概念 仿射变换是通过线性变换(旋转、缩放、剪切)和平移的组合实现几何变换,保持直线和平行关系不变。数学形式为: $$ \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} a & b & c \\ d & e & f \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} $$ 其中$c,f$控制平移量,$a,b,d,e$控制线性变换。 #### 二、核心函数与使用步骤 1. **创建变换矩阵** - **旋转矩阵** ```python M = cv2.getRotationMatrix2D(center, angle, scale) ``` - `center`: 旋转中心坐标$(x,y)$ - `angle`: 旋转角度(顺时针为正) - `scale`: 缩放比例 - **三点法仿射变换** ```python M = cv2.getAffineTransform(src_points, dst_points) ``` - `src_points`: 原图三个点坐标(3×2数组) - `dst_points`: 目标位置三个点坐标(3×2数组) 2. **应用变换** ```python dst = cv2.warpAffine(src, M, dsize) ``` - `src`: 输入图像 - `M`: 2×3变换矩阵 - `dsize`: 输出图像尺寸$(width, height)$ #### 三、具体实现示例 1. **图像旋转** ```python import cv2 img = cv2.imread('input.jpg') h, w = img.shape[:2] # 创建绕图像中心旋转30度的矩阵 M = cv2.getRotationMatrix2D((w/2, h/2), 30, 1) rotated = cv2.warpAffine(img, M, (w, h)) ``` ![旋转效果示意图] 2. **自定义仿射变换** ```python import numpy as np src = np.float32([[50,50], [200,50], [50,200]]) dst = np.float32([[10,100], [200,50], [100,250]]) M = cv2.getAffineTransform(src, dst) transformed = cv2.warpAffine(img, M, (w, h)) ``` 3. **组合变换实现** ```python # 先缩放后平移 scale = 0.5 M_scale = cv2.getRotationMatrix2D((0,0), 0, scale) M_translate = np.float32([[1,0,100], [0,1,50]]) combined_M = np.dot(M_translate, M_scale) # 注意矩阵乘法顺序 ``` #### 四、关键参数说明 | 参数 | 作用范围 | 典型取值 | |------|----------|----------| | 旋转角度 | (-180, 180) | 30(顺时针旋转30度) | | 缩放比例 | (0, +∞) | 1.0(不缩放) | | 平移量 | 任意整数 | (100,50)横向移100像素 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值