视觉中常见坐标系

本文总结了OpenGL坐标系、相机局部坐标系、图片存储与读取坐标系以及CxImage图像库坐标系的特点。对于进行2D到3D转换工作的开发者来说,正确理解和使用这些坐标系至关重要。

最近在做2D转3D的东西,结果发现坐标系每次都要花些时间去确定下,故在此总结下。

1.OpenGL坐标系:


默认的OpenGL视点都是指向Z轴负方向。


2.相机局部坐标系:


因为常用的相机局部坐标系和OpenGL的坐标系是不同的,故用OpenGL显示的时候,要特别注意这点。


3.常用的图片存储和读取坐标系,以及MFC窗口的坐标系:



4.CxImage图像库(第三方库)坐标系:






<think>我们正在讨论从图像坐标系(2D)到相机坐标系(3D)的转换关系的求解方法。这是一个逆问题,因为通常的成像过程是从3D世界(经过相机坐标系)到2D图像。但我们这里关心的是:已知图像上的一个点(以及可能的深度信息),如何求它在相机坐标系中的位置? 注意:图像坐标系到相机坐标系的转换是一个从2D到3D的转换,这通常需要额外的深度信息。如果没有深度信息,我们只能得到一条从相机光心出发的射线,而无法确定具体的3D位置。 根据相机模型,图像坐标系中的一个点$(u, v)$对应着相机坐标系中的一条射线。这条射线上的所有点都会投影到同一个图像点。因此,我们需要深度值$Z_c$(在相机坐标系中沿光轴方向的深度)才能确定具体的3D点。 转换关系如下: 1. 从像素坐标系$(u, v)$到图像坐标系(物理坐标)$(x, y)$: $$ x = \frac{u - u_0}{f_x} $$ $$ y = \frac{v - v_0}{f_y} $$ 其中,$(u_0, v_0)$是主点(图像中心),$f_x, f_y$是焦距(以像素为单位)。这个转换基于相机内参矩阵$\mathbf{K}$: $$ \mathbf{K} = \begin{bmatrix} f_x & 0 & u_0 \\ 0 & f_y & v_0 \\ 0 & 0 & 1 \end{bmatrix} $$ 2. 图像坐标系到相机坐标系:根据针孔相机模型,相机坐标系中的点$(X_c, Y_c, Z_c)$与图像坐标系中的点$(x, y)$满足: $$ x = \frac{X_c}{Z_c}, \quad y = \frac{Y_c}{Z_c} $$ 因此,如果我们已知深度$Z_c$,则可以计算出: $$ X_c = x \cdot Z_c, \quad Y_c = y \cdot Z_c $$ 写成向量形式: $$ \begin{bmatrix} X_c \\ Y_c \\ Z_c \end{bmatrix} = Z_c \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} $$ 但是注意,这里的$(x, y)$是归一化平面上的坐标(即图像物理坐标除以焦距?)。实际上,我们通常使用归一化坐标。 更常见的做法是使用归一化坐标: - 首先,将像素坐标$(u, v)$转换为归一化坐标$(x_n, y_n)$,即位于相机前方$Z_c=1$平面上的坐标: $$ \begin{bmatrix} x_n \\ y_n \\ 1 \end{bmatrix} = \mathbf{K}^{-1} \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} $$ 这里得到的$(x_n, y_n)$就是$Z_c=1$时的$(x, y)$,即归一化坐标。 - 然后,相机坐标系中的点$(X_c, Y_c, Z_c)$位于这条射线上,可以表示为: $$ \begin{bmatrix} X_c \\ Y_c \\ Z_c \end{bmatrix} = \lambda \begin{bmatrix} x_n \\ y_n \\ 1 \end{bmatrix} $$ 其中$\lambda$是一个比例因子(实际上就是深度$Z_c$)。 因此,要求解图像坐标系到相机坐标系的转换,我们需要: - 相机内参矩阵$\mathbf{K}$(通过相机标定获得)[^4] - 深度值$Z_c$(或者比例因子$\lambda$) 深度信息$Z_c$可以通过以下方式获得: - 双目立体视觉:通过左右相机的视差计算深度 - 结构光或ToF相机:直接获取深度图 - 已知物体大小:通过物体在图像中的尺寸和实际尺寸的比例关系估算深度 总结步骤: 1. 已知像素坐标$(u, v)$和深度$Z_c$(或通过其他方式获得深度)。 2. 计算归一化坐标: $$ \begin{bmatrix} x_n \\ y_n \\ 1 \end{bmatrix} = \mathbf{K}^{-1} \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} $$ 3. 计算相机坐标系中的点: $$ \begin{bmatrix} X_c \\ Y_c \\ Z_c \end{bmatrix} = Z_c \cdot \begin{bmatrix} x_n \\ y_n \\ 1 \end{bmatrix} $$ 注意:这里归一化坐标的最后一个分量为1,所以实际上$Z_c$就是比例因子。 然而,如果深度图是以像素为单位存储的(例如深度图中每个像素的值就是该点的$Z_c$),那么我们就可以直接使用上述公式。 注意事项: - 上面的转换没有考虑镜头畸变。如果相机标定中提供了畸变参数,我们需要先对图像点进行去畸变,然后再进行上述转换。去畸变是在图像坐标系中进行的[^3]。 去畸变步骤(如果考虑畸变): 1. 对像素坐标$(u, v)$进行去畸变,得到无畸变的像素坐标$(u', v')$(或者直接得到无畸变的归一化坐标)。 2. 然后使用无畸变的坐标进行上述转换。 因此,完整的过程为: - 输入:像素坐标$(u, v)$,深度值$Z_c$(或深度图),相机内参$\mathbf{K}$,畸变系数$\mathbf{dist}$。 - 步骤: a. 畸变校正:使用畸变系数对$(u, v)$进行校正,得到校正后的像素坐标$(u_{corr}, v_{corr})$。 b. 归一化:$\begin{bmatrix} x_n \\ y_n \\ 1 \end{bmatrix} = \mathbf{K}^{-1} \begin{bmatrix} u_{corr} \\ v_{corr} \\ 1 \end{bmatrix}$ c. 计算相机坐标系坐标:$(X_c, Y_c, Z_c) = (x_n \cdot Z_c, y_n \cdot Z_c, Z_c)$ 注意:深度$Z_c$通常是在相机坐标系下的深度(沿光轴方向的距离)。在深度相机中,我们通常直接得到的就是每个像素对应的$Z_c$值(注意不是欧氏距离,而是z轴值)。 特殊情况:如果深度图提供的是深度$d$(即从相机光心到物体的欧氏距离),那么我们需要将其转换为$Z_c$。在相机坐标系下,点$(X_c, Y_c, Z_c)$到光心的欧氏距离为$\sqrt{X_c^2+Y_c^2+Z_c^2}=d$。同时,该点位于归一化方向上$(x_n, y_n, 1)$,因此有: $$ \begin{bmatrix} X_c \\ Y_c \\ Z_c \end{bmatrix} = \lambda \begin{bmatrix} x_n \\ y_n \\ 1 \end{bmatrix}, \quad \text{且} \quad \lambda \sqrt{x_n^2+y_n^2+1} = d $$ 所以,$\lambda = d / \sqrt{x_n^2+y_n^2+1}$,然后: $$ X_c = \lambda x_n, \quad Y_c = \lambda y_n, \quad Z_c = \lambda $$ 但是,大多数深度相机(如Kinect、RealSense)直接提供的是$Z_c$(即相机坐标系下的z坐标值),而不是欧氏距离。所以我们需要根据具体的深度传感器类型来确定。 综上所述,求解图像坐标系到相机坐标系的转换关系,核心是相机内参和深度信息,并注意是否需要畸变校正以及深度值的含义。 相关问题: 1. 如何通过双目相机获取深度信息? 2. 相机畸变校正的具体步骤是什么? 3. 如何将深度图中的深度值(通常为整型)转换为实际的物理距离? 4. 相机坐标系到世界坐标系的转换如何进行? 注意:引用相关文献时,在末尾添加引用标识。 </think>### 图像坐标系到相机坐标系的转换关系求解方法 在3D视觉中,从图像坐标系(2D)到相机坐标系(3D)的转换是一个**病态逆问题**,需要结合深度信息和相机模型才能求解。以下是完整的求解流程: #### 1. **基础转换关系** 图像坐标系点 $(u, v)$ 到相机坐标系点 $(X_c, Y_c, Z_c)$ 的转换基于**针孔相机模型**: $$ \begin{bmatrix} X_c \\ Y_c \\ Z_c \end{bmatrix} = Z_c \cdot \mathbf{K}^{-1} \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} $$ 其中: - $\mathbf{K}$ 是相机内参矩阵: $$ \mathbf{K} = \begin{bmatrix} f_x & 0 & u_0 \\ 0 & f_y & v_0 \\ 0 & 0 & 1 \end{bmatrix} $$ - $Z_c$ 是点在相机坐标系下的**深度值**(关键未知量) > **关键挑战**:深度信息 $Z_c$ 在单目相机中无法直接获取,需通过附加技术解决。 #### 2. **深度求解方法** ##### (1) **双目立体视觉法**(无主动光源) - **原理**:通过左右图像的视差 $d$ 计算深度 $$ Z_c = \frac{f \cdot B}{d} $$ 其中 $B$ 为基线距离(双目相机间距),$f$ 为焦距[^2]。 - **流程**: ```mermaid graph LR A[左图特征点] -->|特征匹配| B[视差图d] B --> C[深度图Z_c] C --> D[相机坐标系3D点] ``` ##### (2) **主动深度传感法** - **结构光/ToF相机**: 直接获取深度图 $Z_c$(如Kinect, RealSense) - **激光雷达**:通过点云数据提供精确 $Z_c$ ##### (3) **单目深度估计**(无深度传感器) - **深度学习模型**: 使用网络(如MiDaS, DPT)直接从单张RGB图预测深度图: $$ Z_c = \mathcal{F}_{\theta}(I_{rgb}) $$ 其中 $\mathcal{F}_{\theta}$ 为深度神经网络,$I_{rgb}$ 为输入图像[^4]。 #### 3. **畸变校正(关键预处理)** 图像坐标系点需先去除镜头畸变: $$ \begin{bmatrix} u' \\ v' \end{bmatrix} = \mathcal{D}^{-1} \left( \begin{bmatrix} u \\ v \end{bmatrix}; \mathbf{dist} \right) $$ 其中 $\mathcal{D}^{-1}$ 是畸变逆变换,$\mathbf{dist}$ 为标定获得的畸变系数[^3]。 #### 4. **完整求解流程 1. **输入**:图像点 $(u, v)$ + 深度信息 $Z_c$(通过以上方法获得) 2. **畸变校正**:计算无畸变坐标 $(u', v')$ 3. **内参反投影**: $$ \begin{bmatrix} x_n \\ y_n \end{bmatrix} = \begin{bmatrix} (u' - u_0)/f_x \\ (v' - v_0)/f_y \end{bmatrix} $$ 4. **转换为相机坐标**: $$ \begin{cases} X_c = x_n \cdot Z_c \\ Y_c = y_n \cdot Z_c \\ Z_c = Z_c \end{cases} $$ #### 5. **应用场景** - **物体抓取**:计算目标物体在相机坐标系中的3D位置 - **SLAM**:将特征点反投影到相机坐标系进行运动估计 - **AR/VR**:虚拟物体与真实场景的坐标对齐 > **重要限制**:该转换依赖于精确的相机标定(内参 $\mathbf{K}$ 和畸变参数 $\mathbf{dist}$)[^4]。误差在深度方向会被放大,典型精度为深度值的1%~5%[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI记忆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值