世界坐标系到像素坐标系的转换

坐标系类型

  • 世界坐标系:指的就是真实世界中的一个坐标系,单位是m,其中任意一点及其坐标表示为 P w = [ X w , Y w , Z w ] T P_w=[X_w,Y_w,Z_w]^T Pw=[Xw,Yw,Zw]T
  • 相机坐标系:以光圈 O O O为原点的右手坐标系(一般都是右手坐标系,当然也可以是左手),z轴一般与光轴重合(与成像平面垂直),单位为m,其中任意一点及其坐标表示为 P c = [ X c , Y c , Z c ] T P_c=[X_c,Y_c,Z_c]^T Pc=[Xc,Yc,Zc]T
  • 图像物理坐标系:就是虚拟成像平面上的坐标系,是一个二维坐标系,原点在虚拟成像平面中心,单位是mm,相当于是用物理单位来描述像素的位置,其上任意一点的坐标可表示为 P = [ x , y ] T P=[x,y]^T P=[x,y]T
  • 像素平面坐标系:就是最后的数字图像上的二维坐标系,一般坐标原点在图像的左上角,单位是像素,从图像物理坐标系到像素平面坐标系,存在一个缩放和平移,其上任意一点的坐标表示为 p = [ u , v ] T p=[u,v]^T p=[u,v]T
    `

世界坐标系—>像素坐标系

1. 从世界坐标系转换到相机坐标系

二者处于同一空间,只是位置和方向不同,因此只需要旋转和平移操作。通过 W 2 C W2C W2C外参矩阵完成,将世界坐标系中的点转换到相机坐标系中

假设世界坐标系中的点为 ( X w , Y w , Z w ) (X_w, Y_w, Z_w) (Xw,Yw,Zw),相机坐标系中的点为 ( X c , Y c , Z c ) (X_c, Y_c, Z_c) (Xc,Yc,Zc)

W2C = ( R T 0 1 ) \text{W2C} = \begin{pmatrix} R & T \\ 0 & 1 \end{pmatrix} W2C=(R0T1)
其中:

  • R R R 是3x3的旋转矩阵,描述相机的旋转
  • T T T 是3x1的平移向量,描述相机在世界坐标系中的位置

转换过程如下:

( X c Y c Z c 1 ) = W2C ( X w Y w Z w 1 ) \begin{pmatrix} X_c \\ Y_c \\ Z_c \\ 1 \end{pmatrix} = \text{W2C} \begin{pmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{pmatrix} XcYcZc1 =W2C XwYwZw1
这一步完成后,得到了点在相机坐标系中的坐标 ( X c , Y c , Z c ) (X_c, Y_c, Z_c) (Xc,Yc,Zc)

2. 从相机坐标系转换到图像坐标系

`

  • P P P:世界坐标系中的一点
  • O x y O_{xy} Oxy:图像坐标系,光心为图像中点
  • p p p:点 P P P在图像中的成像点,在图像坐标系中为 ( x , y ) (x,y) (x,y),在像素坐标系中为 ( u , v ) (u,v) (u,v)
  • f f f:相机焦距, o O c oO_c oOc的长度

接下来,通过透视投影将相机坐标系中的三维点投影到图像坐标系中

根据相似三角形可得出如下关系式:

A B o C = A O c o O c = P B p C = X c x = Z c f = Y c y x = f X c Z c , y = f Y c Z c \frac{AB}{oC}=\frac{AO_c}{oO_c}=\frac{PB}{pC}=\frac{X_c}{x}=\frac{Z_c}{f}=\frac{Y_c}{y} \\ x = f\frac{X_c}{Z_c}, \quad y = f\frac{Y_c}{Z_c} oCAB=oOcAOc=pCPB=xXc=fZc=yYcx=fZcXc,y=fZcYc

齐次坐标的表示:
Z c ( x y 1 ) = ( f 0 0 0 0 f 0 0 0 0 1 0 ) ( X c Y c Z c 1 ) Z_c \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} = \begin{pmatrix} f & 0 & 0 & 0\\ 0 & f & 0 & 0\\ 0 & 0 & 1 & 0 \end{pmatrix} \begin{pmatrix} X_c \\ Y_c \\ Z_c \\ 1 \end{pmatrix} Zc xy1 = f000f0001000 XcYcZc1

❓为什么 △ A B O c \triangle ABO_c ABOc △ P B O c \triangle PBO_c PBOc不在一个平面,但是仍有等比关系

因为有一条公共边,所以二者的比例相同

3. 从图像坐标系到像素坐标系

`

像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。

  • 图像坐标系的原点为相机光轴与成像平面的交点,通常情况下是成像平面的中点
  • 像素坐标系的原点在成像平面的左上角

图像坐标系的单位是mm,是物理单位,而像素坐标系的单位是pixel,我们平常描述一个像素点都是几行几列。所以这两者之间的转换关系如下:
u = x d x + u 0 , ( 1 p i x e l = d x m m ) v = y d y + v 0 , ( 1 p i x e l = d y m m ) u = \frac{x}{dx}+u_0 ,(1pixel=dxmm)\\ v = \frac{y}{dy}+v_0,(1pixel=dymm) u=dxx+u0,(1pixel=dxmm)v=dyy+v0,(1pixel=dymm)

齐次坐标形式:
( u v 1 ) = ( 1 d x 0 u 0 0 1 d y v 0 0 0 1 ) ( x y z 1 ) \begin{pmatrix} u \\ v \\ 1 \end{pmatrix} = \begin{pmatrix} \frac{1}{dx} & 0 & u_0 \\ 0 & \frac{1}{dy} & v_0 \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} uv1 = dx1000dy10u0v01 xyz1

4. 完整公式

将以上步骤结合在一起,可以得到从世界坐标系到图像坐标系的完整转换公式:

Z c ( u v 1 ) = K ⋅ W2C ⋅ ( X w Y w Z w 1 ) Z_c \begin{pmatrix} u \\v \\1\\ \end{pmatrix} = K \cdot \text{W2C} \cdot \begin{pmatrix} X_w \\ Y_w \\ Z_w \\ 1\\ \end{pmatrix} Zc uv1 =KW2C XwYwZw1

相机内参矩阵通常表示为:
K = ( f x 0 u 0 0 f y v 0 0 0 1 ) K = \begin{pmatrix} f_x & 0 & u_0 \\ 0 & f_y & v_0 \\ 0 & 0 & 1 \end{pmatrix} K= fx000fy0u0v01
Z c Z_c Zc是该点在相机坐标系下的深度值,即从相机到该点的距离

为了将像素坐标转换世界坐标系,需要进行相机标定。相机标定是指确定相机的内部参数和外部参数,以便将像素坐标中的点转换世界坐标系中的点。在Matlab中,可以使用以下步骤进行相机标定和像素坐标世界坐标系转换: 1.采集一组已知的三维点和它们在图像中的对应二维点,这些点应该分布在整个图像中,并且应该包括不同深度的点。 2.使用Matlab中的Camera Calibrator App进行相机标定。在该应用程序中,可以导入采集的图像并选择标定模板。然后,应用程序将自动检测标定板并计算相机的内部参数和外部参数。 3.使用Matlab中的undistortImage函数将图像畸变校正。该函数需要相机的内部参数和畸变数作为输入。 4.使用Matlab中的extrinsics函数将相机的外部参数转换为旋转矩阵和平移向量。 5.使用Matlab中的projectPoints函数将像素坐标中的点转换世界坐标系中的点。该函数需要相机的内部参数、旋转矩阵、平移向量和像素坐标中的点作为输入。 下面是一个Matlab代码示例,用于将像素坐标中的点转换世界坐标系中的点: ```matlab % 相机标定 [imagePoints, boardSize] = detectCheckerboardPoints(imageFileNames); worldPoints = generateCheckerboardPoints(boardSize, squareSize); cameraParams = estimateCameraParameters(imagePoints, worldPoints); % 畸变校正 I = imread('image.jpg'); undistortedImage = undistortImage(I, cameraParams); % 外部参数转换 [R, t] = extrinsics(imagePoints, worldPoints, cameraParams); % 像素坐标转换世界坐标系 imagePoints = [x, y]; worldPoints = projectPoints(imagePoints, R, t, cameraParams); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值