世界坐标系,相机坐标系,像素坐标系转换 详细说明(附代码)

【三维重建】相机成像及坐标系之间的转换 本文内容为三维重建中相机成像原理和坐标系之间转换的相关知识 阅读详情
AI摘要

本文详细解释了如何在像素坐标系、相机坐标系、世界坐标系间进行转换,涉及相机内参和外参(包括四元数表示的位姿),以及如何利用这些参数计算点在不同相机间的映射。,

几个坐标系介绍,相机内外参的回顾参考此文。
本文主要说明如何在几个坐标系之间转换。

本文涉及:

  1. 使用相机内参 在 像素坐标系 和 相机坐标系 之间转换。
  2. 使用相机外参(位姿)在相机坐标系 和 世界坐标系 之间转换。
  3. (qw,qx,qy,qz,tx,ty,tz)形式的外参如何使用。
  4. 以具体情景为例,每一步详细说明,并结合代码进一步理解每个步骤。

以下面的情景为例。
假设 I1 (img1) 上有一点p1,现在要通过相机1,相机2的内外参把p1映射到 I2 (img2)上的对应点p2.
还需要知道p1的深度,假设有img1的深度图,可以读取p1处的深度。

在这里插入图片描述

整体思路:

p1在图片 I1 上,是像素坐标系,根据camera1的内参把它转到camera1的相机坐标系,得到(xc1, yc1, zc1),
根据camera1的外参把 (xc1, yc1, zc1) 转到 世界坐标系,得到上图中的P点坐标(xw1, yw1, zw1),
根据camera2的外参把P点 (xw1, yw1, zw1) 转到camera2的相机坐标系,得到 (xc2, yc2, zc2).
最后根据camera2的内参 把 (xc2, yc2, zc2) 转到像素坐标系,得到图像 I2 上的 p2 点坐标(x2, y2).

整个坐标系的转换关系:像素1 -> 相机1 -> 世界 -> 相机2 -> 像素2

其中,像素坐标系为2D,其他都是3D。
相机外参 也 称为 位姿 (pose).

具体步骤:

(1). p1 像素坐标 --> 相机1 坐标

这两个坐标系的关系由相机内参决定,
相机内参(fx, fy, cx, cy)
假设像素坐标为(x1, y1), 相机1坐标为(xc1, yc1, zc1), 其中zc1为 I1 的深度图 (xc1, yc1)处的值,那么

x 1 = f x x c 1 z c 1 + c x x_{1} = f_{x}\frac{x_{c1}}{z_{c1}} + c_{x} x1​=fx​zc1​xc1​​+cx​,   y 1 = f y y c 1 z c 1 + c y y_{1} = f_{y}\frac{y_{c1}}{z_{c1}} + c_{y} y1​=fy​zc1​yc1​​+cy​  (1)

现在要求 xc1 和 yc1, 由(1)得到
x c 1 = ( x 1 − c x ) ∗ z c 1 / f x x_{c1} = (x_{1}- c_{x}) * z_{c1} / f_{x} xc1​=(x1​−cx​)∗zc1​/fx​    y c 1 = ( y 1 − c y ) ∗ z c 1 / f y y_{c1} = (y_{1}- c_{y}) * z_{c1} / f_{y} yc1​=(y1​−cy​)∗zc1​/fy​

代码:

depth1_ori = cv2.imread("depth1.png", -1)  #uint16型
depth1 = cv2.split(depth1_ori)[0]
#p1点对应的相机坐标
zc1 = depth1[y1, x1] / 1000.0  #这里深度单位是mm
xc1 = (x1 - cx) * zc1 / fx
yc1 = (y1 - cy) * zc1 / fy

(2). p1 的相机1 坐标 --> 世界坐标

转换关系: 相机坐标 = T * 世界坐标, 世界坐标 = T-1 * 相机坐标
其中 T 为world -> camera的转换矩阵。

如何求得转换矩阵 T ?先从概念介绍开始,

旋转矩阵R :3 * 3矩阵
平移向量 t : 3 * 1矩阵
把R 和 t 拼成转换矩阵 T :4 * 4矩阵,

T = [ R t 0 T 1 ] T = \begin{bmatrix} R & t\\ 0^{T}&1 \end{bmatrix} T=[R0T​t1​]

顺便提一下李群李代数,T是SE(3), R是SO(3).

话题回到坐标,(xc1, yc1, zc1)为相机1坐标,(xw, yw, zw) 为世界坐标,那么世界坐标转相机坐标为:

[ x c 1 y c 1 z c 1 1 ] = T ⋅ [ x w y w z w 1 ] \begin{bmatrix} x_{c1} \\ y_{c1}\\ z_{c1}\\ 1 \end{bmatrix} = T \cdot \begin{bmatrix} x_{w} \\ y_{w}\\ z_{w}\\ 1 \end{bmatrix} ​xc1​yc1​zc1​1​ ​=T⋅ ​xw​yw​zw​1​ ​

你肯定很好奇,为什么要加一维呢?
如果 T T T 不加最后一行的 [ 0 T 1 ] \begin{bmatrix} 0^{T}&1 \end{bmatrix} [0T​1​],坐标也不加最后一维的1,直接 T = [ R t ] T = \begin{bmatrix} R & t \end{bmatrix} T=[R​t​] 也能计算,为什么一定要加一维?

[ x c y c z c ] = T ⋅ [ x w y w z w ] \begin{bmatrix} x_{c} \\ y_{c}\\ z_{c} \end{bmatrix} = T \cdot \begin{bmatrix} x_{w} \\ y_{w}\\ z_{w} \end{bmatrix} ​xc​yc​zc​​ ​=T⋅ ​xw​yw​zw​​ ​, 这里 T = [ R t ] T = \begin{bmatrix}R & t\end{bmatrix} T=[R​t​]

是这样的,现在是从 世界坐标 转 相机1坐标 ,如果要把 相机1坐标 转 世界坐标 呢?
(我们现在要做的就是把 p1的 相机1坐标 转到 世界坐标。)

那就需要这么计算了,

[ x w y w z w ] = T − 1 ⋅ [ x c y c z c ] \begin{bmatrix} x_{w} \\ y_{w}\\ z_{w} \end{bmatrix} = T^{-1}\cdot \begin{bmatrix} x_{c} \\ y_{c}\\ z_{c} \end{bmatrix} ​xw​yw​zw​​ ​=T−1⋅ ​xc​yc​zc​​ ​,这里 T = [ R t ] T = \begin{bmatrix}R & t\end{bmatrix} T=[R​t​],无法求逆矩阵

求 T 的逆矩阵,T 必须是square(行数 = 列数)的,不能是3 * 4, 必须是4 * 4的。

所以加上一行,凑成 4 * 4 矩阵

T = [ R t 0 T 1 ] T = \begin{bmatrix} R & t\\ 0^{T}&1 \end{bmatrix} T=[R0T​t1​]

那么 相机坐标 --> 世界坐标 就变为:

[ x w y w z w 1 ] = T − 1 ⋅ [ x c y c z c 1 ] \begin{bmatrix} x_{w} \\ y_{w}\\ z_{w}\\ 1 \end{bmatrix} = T^{-1} \cdot \begin{bmatrix} x_{c} \\ y_{c}\\ z_{c}\\ 1 \end{bmatrix} ​xw​yw​zw​1​ ​=T−1⋅ ​xc​yc​zc​1​ ​

有的程序中会使用Twc, Tcw这样的称呼,这里w指world, 是世界坐标,c指camera, 是相机坐标。
T表示转换矩阵,至于Twc 是world转camera 还是camera转world, 需要根据实际情况而定(每个开发者习惯不一样)。

实际中,到了这里估计还是不知如何计算 T,问题在哪呢?

我们拿到的 相机外参 一般会是一个四元数+平移向量的形式,其中并没有R矩阵。
相机外参:(qw, qx, qy, qz, tx, ty, tz), (这个顺序要根据实际情况而定,有的相机顺序并不是这样)。

这里用四元数 q = (qw, qx, qy, qz) 代替了R矩阵,
原因在于R是3 * 3矩阵,有9个量,而一次旋转只有3个自由度,这种表达方式是冗余的,四元数的表达更紧凑。

上面是涉及到的相关概念,现在开始计算T。

计算转换矩阵 T

现在要先把 q 转为 R,再由R, t 得到T。
q = (qw, qx, qy, qz), (一定是qw, qx, qy ,qz的顺序,不是的先调整到这个顺序)
t = (tx, ty, tz), 这里要注意t 的单位,如果是mm, 需要 / 1000.0.

如果用Eigen库,可以这么得到T,
Isometry3d是4 * 4 欧式变换矩阵,就是T的格式(参考)

Eigen::Quaterniond q(qw, qx, qy, qz);
Eigen::Isometry3d T(q);
//先设置的旋转矩阵,下面平移要在旋转前的坐标系上平移,所以是pretranslate
T.pretranslate(Eigen::Vector3d(tx, ty, tz));

如果用Sophus::SE3d

SE3d T = SE3d(Quaterniond(qw, qx, qy, qz),
                     Vector3d(tx, ty, tz))
                );

直接计算的话,由四元数 q 到旋转矩阵 R 的公式为(转此处的图):
这里q0, q1, q2, q3分别对应 qw, qx, qy, qz.

在这里插入图片描述

结合 (tx, ty, tz), 下面再加一行 [ 0 T 1 ] \begin{bmatrix} 0^{T}&1 \end{bmatrix} [0T​1​],得到T1 (由相机1的外参得到)。

T1 = np.array(
    [
        [
            1 - 2 * q2 ** 2 - 2 * q3 ** 2,
            2 * q1 * q2 - 2 * q0 * q3,
            2 * q1 * q3 + 2 * q0 * q2,
            tx,  #注意单位,如果是mm,要/1000.0
        ],
        [
            2 * q1 * q2 + 2 * q0 * q3,
            1 - 2 * q1 ** 2 - 2 * q3 ** 2,
            2 * q2 * q3 - 2 * q0 * q1,
            ty,  #注意单位,如果是mm,要/1000.0
        ],
        [
            2 * q1 * q3 - 2 * q0 * q2,
            2 * q2 * q3 + 2 * q0 * q1,
            1 - 2 * q1 ** 2 - 2 * q2 ** 2,
            tz,  #注意单位,如果是mm,要/1000.0
        ],
        [0,0,0,1],
    ])

已经得到了T1,下面可把相机坐标转为世界坐标

[ x w y w z w 1 ] = T 1 − 1 ⋅ [ x c 1 y c 1 z c 1 1 ] \begin{bmatrix} x_{w} \\ y_{w}\\ z_{w}\\ 1 \end{bmatrix} = T_{1}^{-1} \cdot \begin{bmatrix} x_{c1} \\ y_{c1}\\ z_{c1}\\ 1 \end{bmatrix} ​xw​yw​zw​1​ ​=T1−1​⋅ ​xc1​yc1​zc1​1​ ​

代码:

p1_c = np.array([xc1, yc1, zc1, 1])
p_w = np.matmul(np.linalg.inv(T1), np.expand_dims(p1_c,1))

(3). 世界坐标 --> 相机2坐标

上面已经说明了如何由 世界坐标 转 相机坐标。
注意上面求的T1 是由相机1的外参得到,
这里要用到相机2的外参,camera2: (qw2, qx2, qy2, qz2, tx2, ty2, tz2),
求得T2 后,由下式得到 P 的相机2坐标

[ x c 2 y c 2 z c 2 1 ] = T 2 ⋅ [ x w y w z w 1 ] \begin{bmatrix} x_{c2} \\ y_{c2}\\ z_{c2}\\ 1 \end{bmatrix} = T_{2} \cdot \begin{bmatrix} x_{w} \\ y_{w}\\ z_{w}\\ 1 \end{bmatrix} ​xc2​yc2​zc2​1​ ​=T2​⋅ ​xw​yw​zw​1​ ​

p2_c = np.matmul(T2, p_w)

(4) 相机2坐标 --> 像素坐标2

相机内参(fx, fy, cx, cy)

x 2 = f x x c 2 z c 2 + c x x_{2} = f_{x}\frac{x_{c2}}{z_{c2}} + c_{x} x2​=fx​zc2​xc2​​+cx​,   y 2 = f y y c 2 z c 2 + c y y_{2} = f_{y}\frac{y_{c2}}{z_{c2}} + c_{y} y2​=fy​zc2​yc2​​+cy​ 

xc2 = p2_c[0]
yc2 = p2_c[1]
zc2 = p2_c[2]
x2 = xc2 * fx / zc2 + cx
y2 = yc2 * fy / zc2 + cy

这样就得到了图像 I2 上的映射点 p2的坐标。

相机成像坐标系转换的运算过程 介绍了相机系统中从世界坐标系到像素坐标系转换的数学计算过程 阅读详情

相关推荐

世界坐标系->相机坐标系详细推导

首先我们需要定义三个量眼睛的位置 ee,就是相机放在什么地方。视线朝向的向量 gg,相机看向什么地方,类似于眼睛往哪里看。朝向上方的向量 tt,相机顶部的朝向,类似于人头顶的朝向,一般都朝向天空。以上的信息足够让我们定义出一个相机坐标系来首先gg是相机看过去的方向,而一般相机坐标系都是朝着ww轴的负方向看去,因此对gg取反并归一化,得到单位向量ww。接着tt类似于vv的朝向,然后tt和ww做叉乘得到uu,因为叉乘得到的是tt和ww构成平面的法向量,然后归一化。同理ww和uu叉乘得到v。

1959

相机基础(二)——坐标系转换

1)总体转换过程 2)四个基本坐标系 3)世界坐标系到相机坐标系 物体之间的坐标系变换都可以表示坐标系的旋转变换加上平移变换,则世界坐标系到相机坐标系的转换关系也是如此。绕着不同的轴旋转不同的角度得到不同的旋转矩阵。如下: 那么世界坐标系到相机坐标系的变换如下: 4)相机坐标系到图像物理坐标系 从相机坐标系到图像坐标系,属于透视投影关系,从3D转换到2D。 也可以看成是针孔模型的改变模型。满足三角形相似定理。 5)图像物理坐标系到像素坐标系 此时与前面的坐标系变换不同,此时没有旋转变换,但是坐

Hurt_Town的博客 5461

世界坐标系、相机坐标系、图像坐标系、像素坐标系

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

rukawashan的博客 2万+

相机模型 - 坐标系转换

世界坐标系O−Xw​−Yw​-> 相机坐标系O−Xc​−Yc​-> 图像坐标系O−Xi​−Yi​-> 像素坐标系O−U−V像素坐标系O−U−V-> 图像坐标系O−Xi​−Yi​-> 相机坐标系O−Xc​−Yc​-> 世界坐标系O−Xw​−Yw​。

qq_34826149的博客 3666

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

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

dididi的博客 2万+

相机成像---世界坐标系、相机坐标系、图像坐标系和像素坐标系之间的转换关系

新学期第一天开始写的这篇文章,看看我啥时候能把他发出去。假期当然是啥也没干了,之前还信誓旦旦说回家一定能学习,学个毛线。开始学习啦,去年年末把环境配置好了之后,实验发现他不准,用的D435i摄像头是红外的,在水里误差太大,所以目标的话就是要给他整准,首先的话学习一下双目摄像头的成像原理~ c1、c2是左右两个双目相机(位置是对齐的)。相机焦距f,相机之间距离为b,右上角为目标位置P(x,y),目标的水平坐标为x,相机离目标垂直距离(所求目标距离相机的深度)为z。 如果要计算深度z,必须.

Zosse的博客 1万+

相机坐标系之间的转换

一个有4个坐标系:图像坐标系、像素坐标系、相机坐标系、世界坐标系。

qq_43389847的博客 1356

三维视觉基础之世界坐标系、相机坐标系、图像坐标系和像素坐标系之间的转换关系

三维视觉基础之世界坐标系、相机坐标系、图像坐标系和像素坐标系之间的转换关系一、各坐标系介绍二、世界坐标系和相机坐标系之间的转换三、相机坐标系和图像坐标系之间的转换四、图像坐标系和像素坐标系之间的转换五、最终得到坐标系转化公式 一、各坐标系介绍 在学习立体视觉中,很多人都经常分不清各种坐标系之间的关系,如下图所示,这是世界坐标系、相机坐标系、图像坐标系和像素坐标系的示意图。 其中,Ow-Xw,Yw,Zw为世界坐标系,原点常被设定为机器人底座或执行机构末端,单位mm Oc-Xc,Yc,Zc为相机坐标系,原点为

jiangxing11的博客 1万+

相机标定:从世界坐标系到图像像素坐标系转换过程解析

最近在做自动泊车项目,利用视觉算法进行车位线检测,其中用到了二维图像坐标与世界坐标的相互转换,因此对相机的标定,相机的位姿计算研究了一番,抽空总结了一下,分享给广大网友。 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数(...

qq_27546529的博客 3万+

关于世界坐标系,相机坐标系,图像坐标系,像素坐标系的一些理解

关于世界坐标系,相机坐标系,图像坐标系,像素坐标系的一些理解

我叫DP的博客 9060

像素坐标系、图像坐标系、相机坐标系之间的转换

这些确实很重要🤣但是因为个人原因,本文对相机坐标系转换到世界坐标系不作记录😄。

2023年才睡醒的双非研究生 1万+

世界坐标系,相机坐标系和图像坐标系的转换(Python)

世界坐标系,相机坐标系和图像坐标系的转换(Python) 相机内参外参说明:https://panjinquan.blog.youkuaiyun.com/article/details/102502213 计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换:https://blog.youkuaiyun.com/chentravelling/article/details/535580...

AI吃大瓜的博客 4万+

相机标定总结(像素坐标系、图像坐标系、相机坐标系和世界坐标系之间的转换关系说明)

近期做了一些机器手臂和摄像头之间手眼标定的内容,在这里对相机的标定做一下总结,手眼标定内容后续更新。 1. 相机成像原理说明 数码相机图像拍摄的过程实际上是一个光学成像的过程。相机的成像过程涉及到四 个坐标系: 世界坐标系、 相机坐标系、 图像坐标系、 像素坐标系以及这四个坐标系的转 换。 相机模型是光学成像模型的简化, 最基本的透镜成像原理如图1 所示: 图1透镜成像过程 其中 u 为物距, f 为焦距, v 为相距。 三者满足关系式:

qq_35250841的博客 1万+

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

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

生活没有if-else 12万+

三维重建系列之:世界坐标系、相机坐标系和像素坐标系的基本概念和相互转换

本文介绍了计算机视觉中使用的三个主要坐标系:世界坐标系、相机坐标系和像素坐标系。文章详细阐述了这些坐标系的定义、重要性以及它们之间的转换方法。通过结合外参矩阵和内参矩阵,我们展示了如何从一个坐标系准确地转换到另一个坐标系,从而为实际应用中的图像处理和三维空间分析提供数学基础。

m0_51661400的博客 7286

(五)carla中世界坐标系与相机坐标系、像素坐标系变换

(五)carla中世界坐标系与相机坐标系、像素坐标系变换 由于实验需要将 carlacarlacarla 中世界坐标系下的坐标点画到相机采集的前视图上,故需要进行坐标系之间的转换。 转换中遇到的问题 参考这篇博客中给出的方法: link 发现将世界坐标系转到像素坐标系下显示的不对。因此仔细从头到尾仔细分析一下,原来是 carlacarlacarla 中 get_transform().getmatrix()get\_transform().get_matrix()get_transform().getm​

qq_35588369的博客 9391

浅析相机相关坐标系的相互转换(世界坐标系、相机坐标系、图像坐标系、像素坐标系、内参矩阵、外参矩阵、扭转因子)【相机标定&计算机视觉】

最近在网上看到了很多关于坐标系转换的帖子,但是其内容很多都是相互转载(甚至还有一部分是错误的),同时大部分的文章内容都是告诉你四种坐标系间的相互转化的数学公式,看完之后很多时候还是不知所云,本文意在深入浅出的围绕这四种坐标系的坐标系的建立、为什么要涉及这种坐标系、四种坐标系间的转换关系来展开,我们会在讲解的过程中通过问题的方式以及引入概念的方式来辅助读者更好的理解这四种坐标系的意义。 引入概念1...

土豪gold的博客 2万+

从零到一:揭秘BlueROV2机械爪背后的Pixhawk舵机控制艺术

本文详细解析了如何基于Pixhawk飞控系统为BlueROV2水下机器人构建可靠的舵机控制系统。从硬件选型、ArduSub固件配置到供电安全与故障排除,全面揭秘机械爪背后的控制艺术,为水下机器人爱好者提供实用指南。

ol78901234的博客 242

OpenCV学习之世界坐标系、相机坐标系、图像坐标系和像素坐标系之间的转换关系

一、各坐标系介绍图像处理、立体视觉经常涉及到世界坐标系、相机坐标系、图像坐标系和像素坐标系。如下图所示:世界坐标系是为了确定相机的位置,在双目视觉中一般将世界坐标系原点定在左相机、右相机或两者X轴方向的中点。下面是各坐标系之间的装换,换而言之,就是一个现实中的物体是如何在图像中成像的。二、世界坐标系和相机坐标系之间的转换从世界坐标系到相机坐标系,设计到物体的旋转和平移。绕着不同的坐标轴旋转不同的角...

xueluowutong的博客 6万+

LabVIEW调用.so文件的方法

LabVIEW调用.so文件的方法

m0_37878912的博客 3022

【教程4>第4章>第22节】FFT频偏估计方法,导频+cordic频偏估计方法,costas环的性能对比

频偏范围适应性:Costas 环频偏锁定和基于 PN 导频和 CORDIC 算法的频偏估计都可以通过调整参数来适应一定范围的频偏,但 Costas 环的频率捕获范围相对较窄,而基于 PN 导频和 CORDIC 算法的频偏估计,基于 FFT 变换频偏估计对频偏范围较大。在高信噪比条件下,三种方法都可以获得较高的估计精度,但在低信噪比环境中,基于 PN 导频和 CORDIC 算法的频偏估计,基于 FFT 变换频偏估计这两个开环方案相对更具优势,而Costas 环频偏锁定的精度可能会受到较大影响.

FPGA/MATLAB学习教程/源码/项目合作开发 608
上一篇: vlfeat 在ubuntu20.04编译报错解决
下一篇: undefined reference to symbol ‘dlclose@@GLIBC_2.2.5‘
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

蓝羽飞鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值