三维感知
单张图像
通过图像上点的位置,来估计该点在三维空间中的位置。
单目相机,理论上三维重建是不准确的。通过一个二维点恢复三维坐标是一对多的
双目/多目
物体的深度值越大,在两幅图之间的视觉差越小。我们可以基于这个来判断物体在三维空间中的深度
基于双目计算深度(RGB->RGBD)
三角化
通过两张图片对应点与相机所在的直线,来确定三维空间中物体所在的位置
那么进行三角化时,需要知道哪些信息呢?
- 相机参数
- 外参:相机的位置和朝向(对应着平移和旋转)
- 知道两个相机坐标系之间的相对关系就能求解
- 我们下面所做的所有工作都是为了求出两个坐标系之间的相对关系 [ R , t ] [R,t] [R,t]
- 内参:相机的焦距等参数
- 外参:相机的位置和朝向(对应着平移和旋转)
- 像素对应关系(就像上图所示,需要通过对应像素来确定位置)
针孔相机模型
( x , y ) (x,y) (x,y) 为成像面上成像点的坐标 , ( X , Y ) (X,Y) (X,Y) 为空间中的三维点的坐标
转换成矩阵形式表达
相机坐标系
主点偏移
与针孔相机模型的区别就是,增加了
x
x
x 方向上的平移参数
p
x
p_x
px 和
y
y
y 方向上的平移参数
p
y
p_y
py
像素长宽比
CCD(将图像转换为电信号的半导体元件,用于成像)单元长宽比不为一,因此需要乘以额外的比例系数
我们可以将上述式子简化,就是将前两个矩阵合并,将
f
f
f 区分为
f
x
f_x
fx 和
f
y
f_y
fy
像素不是矩形
这就代表着CCD行与列不垂直,其实就是切变。因此,我们对
x
x
x 坐标加上与
y
y
y 相关的额外参数。这个并不常用
相机内参
焦距f ,CCD长宽比,CCD行与列不垂直,都是相机内部影响,因此上面式子的第一个矩阵表示的其实是相机内参
X
c
a
m
X_{cam}
Xcam 代表相机坐标系中的坐标
上面论述的情况都基于这样一个假设:三维空间中的点处于相机坐标系中,但是如果这个点不在相机坐标系中呢?
我们利用相机的位置和旋转矩阵来将世界坐标系中的一点,转换到相机坐标系中。其中
X
−
C
X-C
X−C 是世界坐标中的一点相对于相机关心的偏移向量。
R
R
R 是相机的旋转矩阵,
C
C
C 代表着相机的平移
我们将这个式子也表示成矩阵的形式,并且与相机内参的矩阵进行合并
我们考虑了各种情况后,得到一般性的相机投影矩阵
P
=
K
[
R
∣
t
]
,
t
=
−
R
C
P = K[R|t],t=-RC
P=K[R∣t],t=−RC。其中
K
K
K 是相机内参矩阵,
[
R
∣
t
]
[R|t]
[R∣t] 是相机外参矩阵
相机外参
包括
R
R
R 和
t
t
t,其中
R
R
R 是旋转矩阵,
t
=
−
R
C
t=-RC
t=−RC,
C
C
C 是相机在世界坐标系中的坐标
总结:三维重建需要相机内参(内参矩阵
K
K
K),相机外参
R
,
t
R,t
R,t,立体匹配(像素对应关系)
运动推断结构
Structure from Motion , SFM:从相机运动太获取场景的三维点云
如果运动已知
但是相机运动和三维点云都未知
极线
概念
极线约束
由极线约束,引出本质矩阵
左边视图上的点在右边视图上的对应点一定在极线上。右边视图上的点在左边视图上的对应点也在极线上。
-
上面得到过 x = K [ 1 ∣ 0 ] X c a m x = K[1|0]X_{cam} x=K[1∣0]Xcam ,其实就是 x = K X c a m x = KX_{cam} x=KXcam,因此,可以可以通过 x 得到点的三维坐标
-
R , t R,t R,t 是将将左边坐标系中的点转到右边坐标系中所需要的旋转和平移参数。 R , t R,t R,t 是右边坐标系相对于左边坐标系的位置和姿态
-
p 0 p_0 p0 和 p 1 p_1 p1 分别是 p p p 在两个相机坐标系中的坐标。这里的 p 0 p_0 p0 和 p 1 p_1 p1 是不知道的,因为深度不知道。我们的目的就是要求出 p 0 p_0 p0 和 p 1 p_1 p1。但是要先求出 [ R , t ] [R,t] [R,t]
知道
[
R
,
t
]
[R,t]
[R,t] 之后有好几种方法可以求出
p
0
,
p
1
p_0,p_1
p0,p1。理论上
c
0
x
0
,
c
1
x
1
c_0x_0,c_1x_1
c0x0,c1x1会交于同一点,但是由于图像分辨率以及噪声的存在,实际的情况更可能是上图所描述的那样:
c
0
x
0
c_0x_0
c0x0和
c
1
p
1
c_1p_1
c1p1在空间中没有交点,这时我们需要找到一个
c
0
x
0
c_0x_0
c0x0与
c
1
p
1
c_1p_1
c1p1之间的公垂线,然后取其上的中点作为我们重建出的三维点。
通过一系列推导我们可以得到一个简洁的表达式,也就是推导的最后一行得到的结果。我们称
E
E
E 为本质矩阵
由 E E E 的表达式可知,本质矩阵 E E E 由 R , t R,t R,t 决定。那我们已知 E E E 的话,能否求出 R , t R,t R,t 呢?
从 E E E 到 R , t R,t R,t
结论:任意本质矩阵都可以通过SVD分解为如下形式,因为本质矩阵的秩为2,且两个非零奇异值相等(不懂)
相应的
[
R
,
t
]
[R,t]
[R,t] 存在四种可能
这四种可能的解分别对应四种物理意义
可见,只有一中解满足实际的物理意义,因此已知本质矩阵
E
E
E 可以求出
R
,
t
R,t
R,t。
如何算本质矩阵 E E E
方法一:通过基础矩阵
其中
K
j
K_j
Kj 为相机
j
j
j 的内参矩阵,
E
E
E 为本质矩阵。最后我们得到了关于基础矩阵的等式,基础矩阵
F
=
K
1
−
T
E
K
0
−
1
F = K_1^{-T}EK_0^{-1}
F=K1−TEK0−1。其中,
x
1
x_1
x1 和
x
0
x_0
x0 分别是两张图片中对应像素点。
一个点对贡献一个等式,我们可以计算出基础矩阵
F
F
F
有了
F
F
F 之后,就能通过
F
F
F 与 本质矩阵
E
E
E 的对应关系求解
E
=
K
1
T
F
K
0
E = K_1^TFK_0
E=K1TFK0。其中
K
K
K 都是相机内参
方法二:通过点对直接估计
将图像上的二维点转换成三维点,利用三维点点对直接对本质矩阵 E E E 进行估计,就像求解基础矩阵 F F F 时一样
SFM总结
二视图
因为我们求的
[
R
,
t
]
[R,t]
[R,t] 是两个相机坐标系之间的相对参数,因此只能两张图两张图来处理
多个视图
同一个三维点可能在多个视图中被同时观察到(这里的
[
R
,
t
]
[R,t]
[R,t] 应该都是相对于世界坐标系的)
红框内的为优化目标(使公式算出的投影点和点在图像中的实际位置尽量一致),我们采用集束调整的方法