【三维重建】将左相机的深度图转换到右相机下

相机矩阵(Camera Matrix):https://blog.csdn.net/zb1165048017/article/details/71104241

相机矩阵

假设有一个3*4的相机矩阵,可以将齐次3D坐标转换为2D图像坐标。矩阵表示如下:

\[P = [M| - MC] \]

这里的'|'代表的是增广矩阵,其中M代表可逆的3*3矩阵,C是列向量,代表世界坐标系中相机位置

相机矩阵可以将3D点投影到2D空间,但是有些缺点:

  • 没有提供相机的摆放姿态
  • 没有提供相机的内部几何特征
  • 不能使用镜面光照,因为无法在相机坐标系中得到表面法线向量

ct的区别

这里的c和坐标变换中的t需要进行区分:

  • c:指相机的原点在世界坐标系的坐标(世界坐标系中相机的位置)
  • t:指世界坐标系的原点在相机坐标系的坐标

相机矩阵分解

为了解决上述问题,可以将相机矩阵分解为两个矩阵的乘积:内参矩阵K和外参矩阵[R|-RC]

\[P = K[R| - RC] \]

其中,

  • 3*3的上三角阵K描述了相机的内参比如焦距;
  • 3*3的旋转矩阵R的列表示相机参考帧的世界坐标轴方向;
  • 向量C是世界坐标系中的相机中心
    向量$ t=-RC $就给出了相机坐标系中的世界原点坐标。

具体相机矩阵分解见最上面的原文链接。

外参矩阵

相机的外参矩阵描述的是世界坐标中相机的位置,及其指向方向。有两个成分:旋转矩阵R平移向量t。它们并非对应相机的旋转和平移。
外参矩阵以刚体变换矩阵的形式可以记为:左边一个3*3旋转矩阵,右边一个3*1的平移向量。

常见的做法是在底部增加一行(0,0,0,1),这使得矩阵为方形的,允许我们进一步将矩阵分解为旋转和平移矩阵。

这个矩阵描述的就是如何将世界坐标系中的点变换到相机坐标系中向量t描述的是世界坐标系原点在相机坐标系中的位置R的列代表的是相机坐标系中世界坐标系轴的方向。

总结:外参的主要作用就是描述世界坐标系到相机坐标系的转换。

内参矩阵的R和机姿态的\(R_c\)的区别:

  • R代表相机坐标系中世界坐标系轴向,也就是当前的世界坐标的变换需要变换到相机坐标系中,即所谓的世界坐标中的变换相对于相机坐标系是怎么样的。the extrinsic matrix is that it describes how the world is transformed relative to the camera .
  • \(R_c\)代表世界坐标系中相机坐标系的轴向,也就是当前的相机坐标系需要怎么变换到世界坐标系中,即所谓的相机坐标系中的变换相对于世界坐标系是怎样的,Rc be the rotation matrix describing the camera's orientation with respect to the world coordinate axes

因而可以这样做:定义一个描述相机中心在世界坐标系中的位置的向量C,然后让\(R_c\)代表相机在世界坐标系旋转到当前姿态需要的旋转矩阵。那么描述相机姿态的变换矩阵就是(\(R_c\)|C)。同样在底部添加一个行向量(0,0,0,1),那么外参矩阵就是相机姿态矩阵的逆。

倒数第三个等式变换到倒数第二个等式,使用的转置是因为\(R_c\)是正交阵,证明
此处平移矩阵的逆就是他的负数平移向量,进而可以得到外参矩阵参数和相机姿态是直接相关的:

\[R=R^T_C \]

\[t = -RC \]

深度图与3D点云互转

https://blog.csdn.net/a40850273/article/details/122410448

深度图像和3D点云互转只涉及相机内参矩阵,其中

  • fx,fy分别为镜头x,y方向的焦距(成像平面到镜头的距离)
  • cx,cy分别是光心(镜头中心点在成像平面的投影)在图像坐标系(原点位于图像左上角,水平为x,垂直为y)下的坐标。

世界坐标点转化到相机像素平面的过程

《视觉SLAM14讲》P99

\[ ZP_{uv} = Z \begin{bmatrix} u\\ v\\ 1 \end{bmatrix} =K(RP_w+t) =KTP_w \]

其中,K3x3内参T为外参,Pw4x4的世界坐标点。

所以从二维深度图转世界坐标系下的三维点是:

\[ Z \begin{bmatrix} u\\v\\1 \end{bmatrix} = K(RP_w+t) \]

\[P_w = R^{-1}(K^{-1}Z \begin{bmatrix} u\\v\\1 \end{bmatrix} -t) \]

其中,K为内参,Z为深度,t为平移向量。

因为

\[t=-RC \]

\[-R^{-1}t = C \]

所以二维深度图也可以表示为:

\[P_w = R^{-1}(K^{-1}Z \begin{bmatrix} u\\v\\1 \end{bmatrix} ) +C \]

其中
\( Z\begin{bmatrix} u\\v\\1 \end{bmatrix} \)
即深度图像,uv为像素坐标。

实例

代码题:已知深度图和相机内参和外参,完成以下测试
相机内参$ K_l $ , $ K_r $, 外参 $ R_l,R_f,C_l,C_f $将深度图 warp 到右图

\[P_w = R^{-1}_l ( K^{-1}_l P_l * d_l ) +C_l \]

\[P_{cr} = K_rR_r(P_w-C_r) \]

\[P_c = R_r(P_w - C_r) \]

\[d_r=P_{cr}.(Z) \]

\[P_r=K_r(P_c/d_r) \]

其中,
从上到下第二个公式中:\(P_{cr}\)为右相机下二维深度图(没有进行归一化的),\(R_r\)\(C_r\)为右图和世界坐标系的对应关系
第四个公式中:\(d_r\)表示右相机的二维深度图的深度值,\(P_{cr}.(Z)\)其实表示取深度图中的Z坐标值
第五个公式其实就相当于首先进行归一化处理,然后乘上\(K_r\)得到右相机下的深度图(归一化的)

posted @ 2022-11-03 20:15  乞力马扎罗山的雪  阅读(580)  评论(0编辑  收藏  举报