计算机视觉中常用的坐标系

本文详细阐述了计算机视觉中的四种关键坐标系:图像坐标系、世界坐标系、相机坐标系和规范化坐标系,以及它们在图像处理和物体定位中的应用。通过示例代码展示了坐标系之间的转换,帮助读者深入理解这些概念。

计算机视觉中常用的坐标系

在计算机视觉领域中,坐标系是一种重要的概念,用于描述图像或视频中的像素位置、物体边界框以及其他几何特征。常用的坐标系包括图像坐标系、世界坐标系、相机坐标系和规范化坐标系。本文将详细介绍这些坐标系,并提供相应的源代码示例。

  1. 图像坐标系(Image Coordinate System):
    图像坐标系是最常见的坐标系之一,用于描述图像中像素的位置。在图像坐标系中,图像的左上角是原点(0, 0),水平向右为X轴正方向,垂直向下为Y轴正方向。坐标值以像素为单位,例如,(100, 200)表示位于水平方向100像素,垂直方向200像素的位置。

下面是一个使用Python和OpenCV库操作图像坐标系的示例代码:

import cv2

# 加载图像
image = cv2.imread('image.jpg')

# 获取图像尺寸
height,
计算机视觉中,将一个点 $ P $ 转换到世界坐标系 $ P_w $ 的过程涉及多个步骤,通常包括从像素坐标系、图像物理坐标系、相机坐标系最终转换到世界坐标系。这个变换过程需要结合相机的内参和外参矩阵来完成。 ### 坐标变换的基本流程 1. **像素平面坐标系到图像物理坐标系** 从像素坐标 $ p = [u, v]^T $ 转换到图像物理坐标 $ P = [x, y]^T $,可以通过以下公式实现: $$ \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} \frac{u - c_x}{f_x} \\ \frac{v - c_y}{f_y} \end{bmatrix} $$ 其中,$ f_x $ 和 $ f_y $ 是相机在 $ x $ 和 $ y $ 方向上的焦距(以像素为单位),而 $ c_x $ 和 $ c_y $ 是图像主点(即光轴与成像平面交点)的像素坐标[^1]。 2. **图像物理坐标系到相机坐标系** 图像物理坐标系中的点 $ P = [x, y]^T $ 可以扩展为三维空间中的点 $ P_c = [X_c, Y_c, Z_c]^T $,其中 $ Z_c $ 表示该点在相机坐标系下的深度值。假设已知该点的深度信息,则可以使用如下关系: $$ \begin{bmatrix} X_c \\ Y_c \\ Z_c \end{bmatrix} = Z_c \begin{bmatrix} \frac{x}{f_x} \\ \frac{y}{f_y} \\ 1 \end{bmatrix} $$ 这里 $ f_x $ 和 $ f_y $ 是相机的物理焦距(以毫米或其他长度单位表示)[^1]。 3. **相机坐标系到世界坐标系** 相机坐标系中的点 $ P_c = [X_c, Y_c, Z_c]^T $ 可以通过旋转和平移操作转换到世界坐标系 $ P_w = [X_w, Y_w, Z_w]^T $。具体来说,该变换由旋转矩阵 $ R $ 和平移向量 $ T $ 组成,其数学表达式为: $$ P_w = R \cdot P_c + T $$ 或者更详细地写为: $$ \begin{bmatrix} X_w \\ Y_w \\ Z_w \end{bmatrix} = R \begin{bmatrix} X_c \\ Y_c \\ Z_c \end{bmatrix} + \begin{bmatrix} t_x \\ t_y \\ t_z \end{bmatrix} $$ 其中,$ R $ 是一个 $ 3 \times 3 $ 的旋转矩阵,描述了相机坐标系相对于世界坐标系的方向;$ T = [t_x, t_y, t_z]^T $ 是一个平移向量,表示相机原点在世界坐标系中的位置[^2]。 ### 实现方法 - **获取相机参数** 在进行坐标变换之前,必须先获得相机的内参和外参。内参包括焦距 $ f_x $、$ f_y $,以及主点 $ (c_x, c_y) $,这些参数可以通过相机标定工具(如 OpenCV 中的 `calibrateCamera` 函数)获得。外参则包括旋转矩阵 $ R $ 和平移向量 $ T $,它们描述了相机相对于世界坐标系的位置和方向。 - **应用变换公式** 根据上述公式逐步将像素坐标转换为世界坐标。例如,如果已知某个点的像素坐标 $ (u, v) $ 和深度值 $ Z_c $,可以通过以下步骤计算其在世界坐标系中的位置: ```python import numpy as np # 假设已知相机内参 fx = 500 # 焦距x方向(像素) fy = 500 # 焦距y方向(像素) cx = 320 # 主点x坐标(像素) cy = 240 # 主点y坐标(像素) # 已知的像素坐标和深度值 u = 320 v = 240 Zc = 1.0 # 深度值(米) # 计算图像物理坐标 x = (u - cx) / fx y = (v - cy) / fy # 计算相机坐标系中的坐标 Xc = x * Zc Yc = y * Zc Zc = Zc # 定义旋转矩阵R和平移向量T R = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) # 单位矩阵表示相机与世界坐标系方向一致 T = np.array([0, 0, 0]) # 假设相机位于世界坐标系原点 # 将相机坐标系中的点转换到世界坐标系 Pc = np.array([Xc, Yc, Zc]) Pw = np.dot(R, Pc) + T print("世界坐标系中的坐标:", Pw) ``` ### 总结 在计算机视觉中,将点 $ P $ 转换到世界坐标系 $ P_w $ 需要经过多个步骤,包括像素坐标到图像物理坐标的转换、图像物理坐标到相机坐标的转换,以及相机坐标到世界坐标的转换。整个过程依赖于相机的内参和外参,并且可以通过编程语言(如 Python)和相关库(如 OpenCV)实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值