世界坐标系、相机坐标系和图像坐标系的转换

本文详细解析了世界坐标系、相机坐标系、图像物理坐标系和像素坐标系之间的转换原理,涉及刚性变换、中心投影和离散化过程,适合深入理解相机标定的数学基础。

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

坐标系转换

之前只是停留在会用的阶段,一直没去读懂计算的原理,今天通读了大佬的文章,写的言简意赅,感谢感谢~~特此记录一下,仅用作个人笔记

贴链接,十分感谢~
https://blog.csdn.net/weixin_44278406/article/details/112986651
https://blog.csdn.net/guyuealian/article/details/104184551

四个不同类型的坐标系

将三维物体转换成照片上的二维坐标,由四个坐标系进行转换。

1. 世界坐标系

世界坐标系是一个特殊坐标系,它建立了描述其他坐标系需要的参考框架。能够用世界坐标系描述其他坐标系的位置,而不能用更大的、外部的坐标系描述世界坐标系。从非技术意义上讲,世界坐标系建立的是我们所关心的最大坐标系,而不必真的是整个世界。
( X w , Y w , Z w ) (X_w,Y_w,Z_w) (XwYwZw)来表示,世界坐标系可通过旋转和平移得到相机坐标系。

2. 相机坐标系

以相机透镜的几何中心(光心)为原点,坐标系满足右手法则,用 ( X c , Y c , Z c ) (X_c,Y_c,Z_c) (XcYcZc)来表示;相机光轴为坐标系的Z轴,X轴水平,Y轴竖直。

3. 图像物理坐标系

以CCD图像的中心为原点,坐标由 ( x , y ) (x, y) (x,y) 表示,图像坐标系的单位,一般是毫米,坐标原点为相机光轴与成像平面的交点(一般情况下,这个交点是接近于图像的正中心)
在这里插入图片描述

CCD,英文全称:Charge coupled Device,中文全称:电荷耦合元件,可以称为CCD图像传感器。CCD是一种半导体器件,能够把光学影像转化为数字信号。 CCD上植入的微小光敏物质称作像素(Pixel)。一块CCD上包含的像素数越多,其提供的画面分辨率也就越高。

4. 图像像素坐标系

其实,当我们提及一个图像时,通常指的是图像的像素坐标系。像素坐标系的原点在左上角,并且单位为像素。
在这里插入图片描述

将图像坐标系的原点 O 1 O_1 O1 ,转化到以 O 0 O_0 O0 为原点的坐标系中。使用的原因:

  • 如果使用图像坐标系,单位mm,其实不太好衡量具体的图像,如果按照统一的像素标准,比较容易衡量图像的质量
  • 如果使用图像坐标系,然后就有四个象限,这样会有正负数的问题,但是转换成像素坐标系后,都为整数。在后续的操作和运算中,都简化很多。

坐标转换

针孔模型(The basic pinhole model)。这种模型在数学上是三维空间到二维平面(image plane or focal plane)的中心投影,由一个 3 × 4 3 × 4 3×4 投影矩阵 P = K [ R ∣ t ] P = K [ R | t ] P=K[Rt]来描述, K K K 为相机内参(internal camera parameters), [ R ∣ t ] [R|t] [Rt]为外参(external parameters)。

世界坐标 → 相机坐标(刚性变换)

[ X c Y c Z c 1 ] = [ R t 0 1 ∗ 3 1 ] [ X w Y w Z w 1 ] \begin{bmatrix}X_c \\ Y_c \\ Z_c \\ 1 \end{bmatrix} = \begin{bmatrix}R & t\\\\ 0_{1*3} & 1 \end{bmatrix} \begin{bmatrix}X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix} XcYcZc1 = R013t1 XwYwZw1
X c , Y c , Z c X_c,Y_c,Z_c XcYcZc代表相机坐标; X w , Y w , Z w X_w,Y_w,Z_w XwYwZw代表世界坐标;R代表正交单位旋转矩阵,t代表三维平移矢量。
根据旋转角度可以分别得三个方向上的旋转矩阵,而旋转矩阵即为他们的乘积: R = R x ∗ R y ∗ R z R = R_x * R_y * R_z R=RxRyRz
顺便记录一下三个旋转矩阵的公式,经常忘记。

X X X旋转 θ \theta θ

[ X c Y c Z c ] = [ 1 0 0 0 c o s θ s i n θ 0 − s i n θ c o s θ ] [ X w Y w Z w ] = R x [ X w Y w Z w ] \begin{bmatrix}X_c\\Y_c\\Z_c\end{bmatrix} = \begin{bmatrix}1&0&0\\0&cos\theta&sin\theta\\0&-sin\theta&cos\theta\end{bmatrix} \begin{bmatrix}X_w\\Y_w\\Z_w\end{bmatrix}=R_x\begin{bmatrix}X_w\\Y_w\\Z_w\end{bmatrix} XcYcZc = 1000cosθsinθ0sinθcosθ XwYwZw =Rx XwYwZw

Y Y Y轴旋转 θ \theta θ

[ X c Y c Z c ] = [ c o s θ 0 − s i n θ 0 1 0 s i n θ 0 c o s θ ] [ X w Y w Z w ] = R y [ X w Y w Z w ] \begin{bmatrix}X_c\\Y_c\\Z_c\end{bmatrix} = \begin{bmatrix}cos\theta&0&-sin\theta\\0&1&0\\sin\theta&0&cos\theta\end{bmatrix} \begin{bmatrix}X_w\\Y_w\\Z_w\end{bmatrix}=R_y\begin{bmatrix}X_w\\Y_w\\Z_w\end{bmatrix} XcYcZc = cosθ0sinθ010sinθ0cosθ XwYwZw =Ry XwYwZw

Z Z Z轴旋转 θ \theta θ

[ X c Y c Z c ] = [ c o s θ s i n θ 0 − s i n θ c o s θ 0 0 0 1 ] [ X w Y w Z w ] = R z [ X w Y w Z w ] \begin{bmatrix}X_c\\Y_c\\Z_c\end{bmatrix} = \begin{bmatrix}cos\theta&sin\theta&0\\-sin\theta&cos\theta&0\\0&0&1\end{bmatrix} \begin{bmatrix}X_w\\Y_w\\Z_w\end{bmatrix}=R_z\begin{bmatrix}X_w\\Y_w\\Z_w\end{bmatrix} XcYcZc = cosθsinθ0sinθcosθ0001 XwYwZw =Rz XwYwZw

相机坐标 → 图像坐标系(中心投影)

相机坐标系到图像坐标系是透视关系,利用相似三角形进行计算。
在这里插入图片描述
写成齐次坐标形式的矩阵相乘为
Z c [ x y 1 ] = [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ X c Y c Z c 1 ] = [ K ∣ 0 ] [ X c Y c Z c 1 ] Zc \begin{bmatrix}x\\y\\1\end{bmatrix} = \begin{bmatrix}f&0&0&0\\0&f&0&0\\0&0&1&0 \end{bmatrix} \begin{bmatrix}X_c\\Y_c\\Z_c\\1\end{bmatrix} = \begin{bmatrix}K|0\end{bmatrix} \begin{bmatrix}X_c\\Y_c\\Z_c\\1\end{bmatrix} Zc xy1 = f000f0001000 XcYcZc1 =[K∣0] XcYcZc1
其中f代表焦距,即相机坐标系和图像坐标系在Z轴上的差。此时投影点p的单位还是mm,并不是pixel,不方便进行后续运算。

图像坐标系 → 像素坐标系(离散化)

像素坐标系的原点在左上角,并且单位为像素。像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。图像坐标系的原点为相机光轴与成像平面的交点,通常情况下是成像平面的中点或者叫principal point。图像坐标系的单位是mm,属于物理单位,而像素坐标系的单位是pixel,我们平常描述一个像素点都是几行几列。所以这二者之间的转换如下:其中dx和dy表示每一列和每一行分别代表多少mm,即1pixel=dx mm

在这里插入图片描述
Z c [ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ R t 0 1 ∗ 3 1 ] [ X w Y w Z w 1 ] Zc \begin{bmatrix}u\\v\\1\end{bmatrix} = \begin{bmatrix}\frac{1}{d_x}&0&u_0\\0&\frac{1}{d_y}&v_0\\0&0&1 \end{bmatrix} \begin{bmatrix}f&0&0&0\\0&f&0&0\\0&0&1&0 \end{bmatrix} \begin{bmatrix}R & t\\\\ 0_{1*3} & 1 \end{bmatrix} \begin{bmatrix}X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix} Zc uv1 = dx1000dy10u0v01 f000f0001000 R013t1 XwYwZw1
其中 [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] \begin{bmatrix}\frac{1}{d_x}&0&u_0\\0&\frac{1}{d_y}&v_0\\0&0&1 \end{bmatrix} \begin{bmatrix}f&0&0&0\\0&f&0&0\\0&0&1&0 \end{bmatrix} dx1000dy10u0v01 f000f0001000 为相机内参矩阵, [ R t 0 1 ∗ 3 1 ] \begin{bmatrix}R & t\\\\ 0_{1*3} & 1 \end{bmatrix} R013t1 为外参矩阵。相机标定就是为了求解这两个矩阵的参数。

在这里插入图片描述

### 相机坐标系变换的概念与实现 在计算机图形学中,相机坐标系的变换是一个重要的过程,它涉及多个阶段的矩阵运算来完成从局部坐标系到最终屏幕坐标的转换。以下是关于相机坐标系变换的核心概念及其在 OpenGL 中的具体实现。 #### 1. 坐标系变换流程概述 整个渲染管线可以分为几个主要步骤: - **局部坐标系 → 模型矩阵变换 → 世界坐标系**:通过模型矩阵将物体从其自身的局部空间映射到全局的世界空间[^1]。 - **世界坐标系 → 视图矩阵变换 → 相机坐标系**:利用视图矩阵 (View Matrix),将场景中的所有顶点从世界坐标系转换相机所在的本地坐标系[^2]。 - **相机坐标系 → 投影矩阵变换 → 裁剪坐标系**:应用投影矩阵 (Projection Matrix) 将三维几何体压缩成二维平面图像。 - **裁剪坐标系 → 视口变换 → 屏幕坐标**:最后一步是将标准化设备坐标 (NDC) 映射至实际窗口像素位置。 #### 2. 视图矩阵的作用 视图矩阵用于定义摄像机的位置方向。具体来说: - 如果已知相机世界坐标系下的位姿,则可以通过构建一个 $4 \times 4$ 的齐次变换矩阵描述该关系[^3]。 - 这个矩阵通常由两部分组成——旋转平移。其中, - **旋转分量**决定了相机朝向; - **平移分量**指定了相机中心相对于世界原点的距离。 对于任意一点 \( P_{\text{world}}(x, y, z) \),经过视图变换后的结果为: \[ P_{\text{camera}} = V \cdot P_{\text{world}}, \] 这里 \(V\) 表示完整的视图矩阵。 #### 3. 构建视图矩阵的方法 一种常见的做法是从给定的目标点、观察者位置以及上方向矢量出发计算所需的参数。假设这些分别为 `eye` (\(E_x, E_y, E_z)\), `at`(\(A_x, A_y, A_z)\)) `up`(\(U_x, U_y, U_z)\): ```cpp glm::vec3 zaxis = glm::normalize(Eye - At); // 正前方指向目标 glm::vec3 xaxis = glm::normalize(glm::cross(up, zaxis)); // 右侧正交于其余两者 glm::vec3 yaxis = glm::cross(zaxis, xaxis); // 新向上垂直面重新调整 // 组合形成最终视图矩阵 glm::mat4 view_matrix( xaxis.x, xaxis.y, xaxis.z, -dot(xaxis,Eye), yaxis.x, yaxis.y, yaxis.z, -dot(yaxis,Eye), zaxis.x, zaxis.y, zaxis.z, -dot(zaxis,Eye), 0 , 0 , 0 , 1 ); ``` 上述代码片段展示了如何基于输入数据手动创建视图矩阵。 #### 4. 在OpenGL中的实践 当使用现代OpenGL编程时,开发者往往借助第三方库(如GLM)简化复杂操作。例如设置透视投影并结合视图矩阵传递给着色器程序如下所示: ```glsl #version 330 core layout(location = 0) in vec3 aPos; uniform mat4 model; uniform mat4 view; uniform mat4 projection; void main() { gl_Position = projection * view * model * vec4(aPos, 1.0); } ``` 此片断说明了如何在一个顶点着色器里接受三个独立的变换矩阵,并依次作用于原始顶点属性之上。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

滴滴滴'cv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值