计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换

本文详细介绍了图像处理及立体视觉中涉及的世界坐标系、相机坐标系、图像坐标系和像素坐标系间的转换关系。从世界坐标系到像素坐标系的转换过程包括旋转、平移、透视投影和单位换算。

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

0.前言

最近整理了“相机成像原理”和“视差与深度信息”相关的资料,然后做成了PPT,以备自己用,也提供给相关的图像、视觉方向的朋友参考。如有误,望海涵并指出。

1.正文

图像处理、立体视觉等等方向常常涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。例如下图: 
这里写图片描述 
构建世界坐标系只是为了更好的描述相机的位置在哪里,在双目视觉中一般将世界坐标系原点定在左相机或者右相机或者二者X轴方向的中点。 
接下来的重点,就是关于这几个坐标系的转换。也就是说,一个现实中的物体是如何在图像中成像的。

1.1世界坐标系与相机坐标系

这里写图片描述

于是,从世界坐标系到相机坐标系,涉及到旋转和平移(其实所有的运动也可以用旋转矩阵和平移向量来描述)。绕着不同的坐标轴旋转不同的角度,得到相应的旋转矩阵,如下图所示: 
这里写图片描述

那么从世界坐标系到相机坐标系的转换关系如下所示: 
这里写图片描述

1.2相机坐标系与图像坐标系

从相机坐标系到图像坐标系,属于透视投影关系,从3D转换到2D。 
这里写图片描述 
此时投影点p的单位还是mm,并不是pixel,需要进一步转换到像素坐标系。

1.3图像坐标系与像素坐标系

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

那么通过上面四个坐标系的转换就可以得到一个点从世界坐标系如何转换到像素坐标系的。 
这里写图片描述

其中相机的内参和外参可以通过张正友标定获取(戳这里查看张正友标定的资料)。通过最终的转换关系来看,一个三维中的坐标点,的确可以在图像中找到一个对应的像素点,但是反过来,通过图像中的一个点找到它在三维中对应的点就很成了一个问题,因为我们并不知道等式左边的Zc的值。 
关于三维重建不是我的方向,但是深度值的获取是我项目中的一个需要解决的问题,这将涉及到后面的立体视觉知识。

【PPT下载】

地址:http://download.youkuaiyun.com/detail/chentravelling/9833120

### 将像素坐标转换相机坐标 为了将像素坐标转换相机坐标系下,需要经过一系列变换过程。这个过程中涉及到内参数矩阵、外参数以及畸变系数等。 #### 像素坐标至规范化坐标 首先,通过逆向应用相机的内参矩阵 \( K \),可以从像素坐标 (u, v) 转换到归一化平面内的坐标 (x_n, y_n): \[ \begin{bmatrix} x_{n} \\ y_{n} \\ 1 \end{bmatrix} = K^{-1} \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} [^2] \] 这里的 \( K \) 是由焦距 f 和主点位置组成的 3×3 的内参矩阵: ```python import numpy as np def pixel_to_normalized(K_inv, u, v): homogeneous_pixel = np.array([u, v, 1]) normalized_coords = K_inv @ homogeneous_pixel return normalized_coords[:2] / normalized_coords[2] ``` #### 归一化坐标至相机坐标 接着,在获得了归一化的坐标之后,可以通过乘以外参旋转和平移矩阵来获得最终的世界坐标: \[ [X_c; Y_c; Z_c] = R * [X_w; Y_w; Z_w] + T [^3] \] 其中 \(R\) 表示旋转矩阵而\(T\)代表平移向量。对于给定的一个特定点而言,如果已经知道了其对应的深度信息,则可以直接利用上述方程求解该点在相机坐标系中的具体位置。 当处理的是单目视觉情况时,通常还需要借助其他手段比如双目视差或者结构光等方式得到物体的实际距离(Z值)。而对于多视角几何问题则可通过三角测量原理完成重建工作。 最后一步则是基于已知的距离数据反推回原始的空间坐标。OpenCV 提供了一些工具函数可以帮助简化这些操作流程,例如 `cv2.undistortPoints()` 可用于执行去畸变并投影到理想图像平面上;`cv2.triangulatePoints()` 则适用于从两个不同视角估计三维点的位置。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值