三维重建基础: 坐标系 (更新中)

概述

世界坐标系与相机坐标系之间存在着互逆的转换。
具体有:
在这里插入图片描述
在这里插入图片描述
对某个三维点的坐标进行变换:

  • 世界坐标系到相机坐标系: W2C (我们俗称的相机pose,colmap默认输出)
  • 相机坐标系到世界坐标系: C2W

在这里插入图片描述


左右手坐标系的xyz通过拇指、食指、中指三者的组合来确定。

参考链接


目标是,三维坐标转换至屏幕上的像素坐标。

我们假定起初的三维坐标是在世界坐标系下,那么为了获得其在像片上的对应坐标,我们首先需要做的事情是将三维点的坐标先从世界坐标系转换至相机坐标系下。然后我们再根据摄像机空间中的点坐标,将其投影至像平面上就可以了。
声明:部分图片摘自李博博客:https://ethanli.blog.csdn.net/article/details/113248118,本文主要用于个人笔记,若侵则删。


计算机视觉:投影矩阵M: 世界坐标系 -> 像平面坐标系

投影矩阵是用于将三维空间中的点投影到二维平面上的一种数学变换矩阵,通常用于计算机图形学、机器视觉等领域。
在计算机视觉和图形学中,投影矩阵经常被用来表示相机内参和外参

在这里插入图片描述
简写为:
在这里插入图片描述
如上式所示,K[R t]可以简写为M矩阵,即投影矩阵,是一个 3 ∗ 4 3 * 4 34的矩阵,是内参矩阵和外参矩阵的乘积。
通常来说,投影矩阵 M M M也往往会被称之为 P P P


下面举一个简单的例子:
假设我们有一个摄像机,其焦距为700像素,图像分辨率为640x480,该摄像机位于三维坐标系原点处。我们需要求解该摄像机的投影矩阵P。

我们先定义一个包含摄像机内参的4x4单位矩阵K(齐次坐标):

K = [[700,   0, 320,   0],
     [  0, 700, 240,   0],
     [  0,   0,   1,   0],
     [  0,   0,   0,   1]]

其中前两列代表像素尺度参数,第二列代表光心坐标,第三列对应于透视投影(单应性),最后一行始终为[0, 0, 0, 1]。

然后,我们定义外参Rt矩阵(3x4),它描述了摄像机在全局坐标系中的姿态:

Rt = [[cos(theta), -sin(theta), 0, tx],
      [sin(theta),  cos(theta), 0, ty],
      [         0,           0, 1, tz]]

其中θ是摄像机旋转角度,[tx, ty, tz]是摄像机位置坐标。假设摄像机位于全局坐标系的(5, 2, 7)处,并沿着y轴旋转了30度,则Rt可以计算为:

Rt = [[ 0.87,  0.00,  0.50,  5],
      [ 0.00,  1.00,  0.00,  2],
      [-0.50,  0.00,  0.87,  7]]

相机坐标系 -> 像平面坐标系:

在这里插入图片描述
在这里插入图片描述

世界坐标系 -> 相机坐标系

在这里插入图片描述

计算机图形:MVP变换

在这里插入图片描述

本小结先主要关注view/camera变换,即相机坐标系和世界坐标系之间的变换。

view/camera 变换

首先定义 e ⃗ \vec{e} e g ⃗ \vec{g} g t ⃗ \vec{t} t
在这里插入图片描述
一个非常简单的观察就是,如果相机和物体都进行移动的话(保持相机中心和物体的相对关系持续一致),那么我们拍摄的图像理论上是不变的咯。
那么我们就可以考虑把相机先移动到世界坐标系的原点上,然后再旋转对应的轴,使得其能够世界坐标系重合上,然后我们把物体也做一样的变换,就可以保持其与相机的相对关系不变。【需要进一步地解释】
小结一下,变换过程总共可以分为两步:

  1. 将相机平移到原点;
  2. 将相机旋转到理想状态。
    在这里插入图片描述

平移矩阵很简单,直接就是:
在这里插入图片描述

我们考虑旋转矩阵的逆矩阵(描述了世界坐标系到相机坐标系的旋转过程):
在这里插入图片描述

现在我们考虑世界坐标系下 x x x轴的基向量为 [ 1 , 0 , 0 , 0 ] T [1,0,0,0]^T [1,0,0,0]T,其进行旋转后,理应变成 [ x g ^ × t ^ , y g ^ × t ^ , z g ^ × t ^ ] [x_{\hat{g} \times \hat{t}}, y_{\hat{g} \times \hat{t}}, z_{\hat{g} \times \hat{t}}] [xg^×t^,yg^×t^,zg^×t^], 即,有:
在这里插入图片描述
带入后进行解算,有:
在这里插入图片描述
参考链接

在games101_lecture_04中的描述为:
在这里插入图片描述
参考slides

常见坐标系定义

参考:https://zhuanlan.zhihu.com/p/593204605?utm_source=zhihu
在这里插入图片描述

colmap中的坐标系

colmap坐标系默认输出的是W2C的矩阵,如果想要进行正确的可视化,那么就需要将其变换到世界坐标系下:

在这里插入图片描述https://blog.csdn.net/weixin_44120025/article/details/124604229

线性代数相关基础

几何角度理解线性代数(1):向量、线性组合、矩阵乘法、行列式
几何角度理解线性代数(2): 逆矩阵、列空间与零空间

几何角度理解线性代数(3):点积与叉积

Q & A

  • 问:为什么有些旋转矩阵换轴的时候更换列向量,而有些是换行
    答: 以C2W为例,更换列向量是换的Camera坐标系,更换行向量是换的World坐标系。

待办

  1. C++中的using是什么作用的?
  2. 如何理解dll导出的宏定义?
  3. 怎么理解 inline Camera() = default; ?
  4. std::move()
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Matlab进行双目相机三维重建,首先需要获取双目相机的标定参数,包括内参数矩阵、畸变系数和外参数矩阵。这些参数可以通过双目相机的标定板图像进行标定得到。接下来,我们可以使用双目视差匹配算法计算左右两个摄像机的视差图像。视差图像表示了同一点在两个摄像机的像素位移差异,可以用于计算深度信息。 使用视差图像和标定参数,我们可以将像素点转换为相机坐标系的点,并通过三角测量算法来计算对应点的三维坐标。三角测量算法基于视差-深度关系,通过已知的标定参数和视差图,计算出每个像素点的深度值。最终形成一个三维点云。Matlab提供了一些函数和工具箱,如视差计算函数和相机标定工具箱,可以方便地进行这些操作。 一旦获取了三维点云,我们可以进一步进行数据处理和可视化。例如,可以通过滤波算法对三维点云进行去噪处理,去除异常点。然后,可以使用Matlab内置的三维可视化工具来查看和分析重建结果。还可以利用Matlab的点云处理函数来进行进一步的分析和应用,例如点云配准和重建建模等。 总之,在Matlab进行双目相机三维重建,需要标定双目相机获取内外参数,计算视差图像,使用三角测量算法得到三维点云,进行数据处理和可视化等步骤。Matlab提供了相应的函数和工具箱,方便实现双目相机三维重建的各个步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FLOWVERSE

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

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

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

打赏作者

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

抵扣说明:

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

余额充值