变换矩阵

本文详细介绍了变换矩阵在3D图形中的应用,包括缩放、旋转、平移矩阵的组合,子坐标系与父坐标系的关系,以及透视和正交投影矩阵的工作原理。还探讨了如何从深度图重建位置,特别是在延迟渲染和SSR特效中的应用,强调了深度信息处理的重要性及其精度挑战。

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

1、变换矩阵

变换矩阵可以分解为缩放,旋转,平移矩阵的乘积:

M = T * R * S - 右手坐标系

当均匀缩放时,旋转和缩放可以交换顺序

缩放和平移不可以交换顺序

2、子坐标系与父坐标系

由在父坐标系中的坐标位置P,和三根轴X,Y,Z可定义一个子标系,按列构成一个变换矩阵[X,Y,Z,P],这个矩阵构成由子标系变换到父坐标系的变换矩阵。DX里面需要转置一下。即按行构造。

一个例子是视图矩阵的构建,子空间由视点和三根正交轴定义,视图矩阵则是由它们构成的列矩阵的仿射求逆-由世界变换到视图空间。

另一个例子世界变换矩阵,它由新模型坐标系的位置和三根轴【定义在世界空间】按列构成。即由模型空间变换到世界空间。初始情况模型空间与世界空间是对齐的。

3、投影矩阵-OpenGL

透视投影矩阵:

可以知道投影变换后的w=-Ze,即在视图空间的深度

在投影面上的坐标Xp, Yp为:Xp=n*Xe/-Ze=Xclip/w*r,Yp=n*Ye/-Ze=Yclip/w*t

投影后Ze从[-n,-f]线性映射到[-n,f],除以w后进一步非线性映射到[-1,1]

透视投影除以w后,视景体的八个角点【视图空间坐标】分别映射到NDC空间中的八个角点,如[r,t,-n,1]映射到[1,1,-1,1],[f*r/n,f*t/n,-f,1]映射到[1,1,1,1]

正交投影矩阵:

变换后w=

### 图像变换矩阵的相关概念及实现方法 图像变换矩阵是图像处理中的核心工具之一,用于描述图像的几何变换。几何变换包括平移、旋转、缩放、仿射变换和透视变换等。以下是关于图像变换矩阵的概念及其在 OpenCV 和 NumPy 中的实现方法。 #### 1. 变换矩阵的基本概念 变换矩阵是一种数学工具,用于描述点或图像从一个坐标系到另一个坐标系的映射关系。对于二维图像,常见的变换矩阵为 2×3 或 3×3 的形式: - **平移变换**:通过添加偏移量来移动图像中的每个像素。 - **旋转变换**:围绕某个点旋转图像。 - **缩放变换**:调整图像的大小。 - **仿射变换**:保持平行线不变,但角度可能发生变化。 - **透视变换**:模拟三维空间中的投影效果[^1]。 #### 2. 平移变换矩阵 平移变换矩阵是一个 2×3 的矩阵,用于将图像中的每个像素沿水平和垂直方向移动指定的距离。例如,以下代码展示了如何使用 OpenCV 实现平移变换: ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('dog.png') height, width = image.shape[:2] # 定义平移矩阵 M M = np.float32([[1, 0, 100], [0, 1, 50]]) # 水平移动 100 像素,垂直移动 50 像素 # 应用平移变换 translated_image = cv2.warpAffine(image, M, (width, height)) # 显示结果 cv2.imshow('Original', image) cv2.imshow('Translated', translated_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` #### 3. 旋转变换矩阵 旋转变换矩阵用于旋转图像。OpenCV 提供了 `getRotationMatrix2D` 函数,可以生成旋转变换矩阵。以下代码展示了如何实现图像的旋转: ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('dog.png') height, width = image.shape[:2] # 定义旋转中心、角度和缩放比例 center = (width // 2, height // 2) # 旋转中心 angle = 45 # 旋转角度 scale = 1.0 # 缩放比例 # 获取旋转矩阵 M = cv2.getRotationMatrix2D(center, angle, scale) # 应用旋转变换 rotated_image = cv2.warpAffine(image, M, (width, height)) # 显示结果 cv2.imshow('Original', image) cv2.imshow('Rotated', rotated_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` #### 4. 仿射变换矩阵 仿射变换保持平行线不变,但可能会改变角度和比例。可以通过定义三对对应点来计算仿射变换矩阵。以下代码展示了如何实现仿射变换: ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('dog.png') rows, cols = image.shape[:2] # 定义源点和目标点 pts1 = np.float32([[50, 50], [200, 50], [50, 200]]) pts2 = np.float32([[100, 100], [200, 50], [100, 250]]) # 计算仿射变换矩阵 M = cv2.getAffineTransform(pts1, pts2) # 应用仿射变换 affine_image = cv2.warpAffine(image, M, (cols, rows)) # 显示结果 cv2.imshow('Original', image) cv2.imshow('Affine', affine_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` #### 5. 透视变换矩阵 透视变换用于模拟三维空间中的投影效果。可以通过定义四对对应点来计算透视变换矩阵。以下代码展示了如何实现透视变换: ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('dog.png') rows, cols = image.shape[:2] # 定义源点和目标点 pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]]) pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]]) # 计算透视变换矩阵 M = cv2.getPerspectiveTransform(pts1, pts2) # 应用透视变换 perspective_image = cv2.warpPerspective(image, M, (300, 300)) # 显示结果 cv2.imshow('Original', image) cv2.imshow('Perspective', perspective_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` #### 6. NumPy 在矩阵变换中的应用 NumPy 提供了强大的矩阵操作功能,可以用于构建和操作变换矩阵。例如,以下代码展示了如何使用 NumPy 进行矩阵转置和重塑: ```python import numpy as np # 创建一个示例矩阵 matrix = np.array([[1, 2, 3], [4, 5, 6]]) # 矩阵转置 transposed_matrix = matrix.T # 矩阵重塑 reshaped_matrix = matrix.reshape((3, 2)) print("原始矩阵:\n", matrix) print("转置矩阵:\n", transposed_matrix) print("重塑矩阵:\n", reshaped_matrix) ``` ### 总结 图像变换矩阵是图像处理中不可或缺的工具,能够实现多种几何变换。OpenCV 提供了丰富的函数支持这些变换,而 NumPy 则提供了灵活的矩阵操作能力。结合两者,可以高效地实现各种复杂的图像处理任务[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值