UTF8gbsn
本文主要做一个简要的稀疏点云重建方法的梳理,
梳理的粒度比较大.略去了非常多的技术细节.
其实这项技术也叫做SFM(Structured From Motion).
特征
在3D重建中, 我们的输入是一系列的照片.
这些图片通常是围绕一个物体并拍摄的一系列照片.
实际上对于同一个物体所拍摄的照片中存在一些特征点. 这些特征点,
和拍摄角度位置无关. 我们可以通过算法去计算出这些特征点.
这个方法就是SIFT方法, 注意SIFT方法, 只是一个函数. 他的作用如下.
f e a t u r e s = S I F T ( i m a g e ) features=SIFT(image) features=SIFT(image)
它通过一个图像的输入,
计算出这个图像的不变形特征.这些特征是一个集合
f
e
a
t
u
r
e
s
=
{
f
1
,
f
2
,
⋯
,
f
n
}
features = \{f_1,f_2,\cdots , f_n\}
features={f1,f2,⋯,fn}.
f
i
=
{
p
o
s
i
t
i
o
n
,
s
c
a
l
e
,
d
i
r
e
c
t
i
o
n
}
f_i=\{position, scale, direction\}
fi={position,scale,direction}. 由此可见.
每一张图片都有一个这样的features向量. 在图像与图像之间.
这些特征实际上有一个对应关系.
但是我们通过
S
I
F
T
SIFT
SIFT计算,并不知道这个对应关系.
我们只是朴素的提取每一张图片的不变性特征.
这些特征在不同图片之间怎么一一对应的, 我们目前不得而知.
特征匹配
特征比配的策略主要是比较SFIT特征.
这些特征靠计算欧拉距离和优化算法可以得到一个个一一对应的关系.形式化表示就可以.对于任意两张图片上的2D点
x
i
m
g
1
,
x
i
m
g
2
\mathbf{x}^{img_1}, \mathbf{x}^{img_2}
ximg1,ximg2.会有一个对应关系.
也就是说, 有一个这样的列表.
( x 1 i m g 1 x 1 i m g 2 x 2 i m g 1 x 2 i m g 2 ⋮ ⋮ x n i m g 1 x n i m g 2 ) \left( \begin{array}{cc} \mathbf{x}^{img_1}_1 & \mathbf{x}^{img_2}_1 \\ \mathbf{x}^{img_1}_2 & \mathbf{x}^{img_2}_2\\ \vdots & \vdots \\ \mathbf{x}^{img_1}_n & \mathbf{x}^{img_2}_n \end{array} \right) ⎝⎜⎜⎜⎛x1img1x2img1⋮xnimg1x1img2x2img2⋮xnimg2⎠⎟⎟⎟⎞
稀疏重建过程
对于上一步获得对应2D点.
我们可以利用这个对应关系一步一步计算出很多东西.其中包括
K
,
R
,
T
,
X
\mathbf{K, R, T, X}
K,R,T,X.
我们慢慢来看这些东西是什么.
-
x = ( x y 1 ) \mathbf{x}=\left( \begin{array}{c} x \\ y \\ 1 \end{array} \right) x=⎝⎛xy1⎠⎞, 2D点坐标的齐次表示形式. 数据是成对的.
因为2D点对是一一对应关系. -
K \mathbf{K} K 相机内参. ( f x 0 c x 0 f y c y 0 0 1 ) \left( \begin{array}{ccc} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{array} \right) ⎝⎛fx000fy0cxcy1⎠⎞ 相机内参的初始化方式可以有两种.
一种是读取输入图片中的exif信息.另一种是设一个初始的值.
然后这些设置仅仅是初始值. 后面会有算法来优化它们.
也就是说到目前为止, 可以人为 K \mathbf{K} K是已知的 -
X \mathbf{X} X, 为世界坐标系下的3D点的齐次坐标 X = ( x y z 1 ) \mathbf{X}=\left( \begin{array}{c} x\\ y \\ z \\ 1 \end{array} \right) X=⎝⎜⎜⎛xyz1⎠⎟⎟⎞
-
R , T \mathbf{R, T} R,T, 相机外参. R 3 × 3 \mathbf{R}_{3\times 3} R3×3是一个旋转矩阵.
T 3 × 1 \mathbf{T}_{3\times 1} T3×1是一个位移向量.
实际上 [ R ∣ T ] ⋅ X [\mathbf{R}|\mathbf{T}]\cdot \mathbf{X} [R∣T]⋅X
的作用就是把3D点变换到摄像机坐标系中.
再次强调:到目前为止, 我们可以说我们的已知为
x
\mathbf{x}
x点对,
K
\mathbf{K}
K, 而未知的东西位
X
,
R
,
T
\mathbf{X, R, T}
X,R,T.
我们来看看怎么来求这些东西.
求解 R , T \mathbf{R, T} R,T
实际上, 我们还需要另外的知识. 也就是essential matrix 本质矩阵.
对于两张图片摄像机坐标系中的配对点理论上存在一个本质矩阵
E
3
×
3
\mathbf{E}_{3\times3}
E3×3使得
x
~
1
T
E
x
~
2
=
0
\tilde{\mathbf{x}}^{T}_{1} \mathbf{E} \tilde{\mathbf{x}}_{2}=0
x~1TEx~2=0
其中
x
~
∈
\tilde{\mathbf{x}}\in
x~∈ 第一张图片的摄像机坐标系.
x
~
2
\tilde{\mathbf{x}}_{2}
x~2 属于第二张图片的摄像机坐标系. 又因为
x
~
=
K
−
1
x
\tilde{\mathbf{x}}=K^{-1}x
x~=K−1x 也就是说, 把2D点逆变换到摄像机坐标系里面.
通过上面的变换
x
~
\tilde{\mathbf{x}}
x~ 就变为已知了.
那么我们同样可以解方程组接触
E
\mathbf{E}
E.
注意
E
\mathbf{E}
E是一个选对旋转矩阵.
所以我们这里要假设图片1的摄像机坐标系位
R
=
I
,
T
=
0
\mathbf{R=I, T=0}
R=I,T=0.
这样我们对
E
\mathbf{E}
E做SVD分解就可以解出一个
R
E
,
T
E
\mathbf{R}_E, \mathbf{T}_E
RE,TE.
因为我们假设第一个相机位基准相机.
所以虽然
E
\mathbf{E}
E是一个相对旋转矩阵.
是从第一章图的摄像机坐标系旋转到第二张图的摄像机坐标系.
可是由于第一张图是基准
R
=
I
,
T
=
0
\mathbf{R=I, T=0}
R=I,T=0.
那么我们从
E
\mathbf{E}
E中分离出来的
R
E
,
T
E
\mathbf{R}_E, \mathbf{T}_E
RE,TE
就是第二张图的摄像机坐标系
R
2
,
T
2
\mathbf{R}_2, \mathbf{T}_2
R2,T2.
再次强调: 到目前为止,我们知道了
K
,
R
,
T
,
x
\mathbf{K, R, T, x}
K,R,T,x,
注意
x
\mathbf{x}
x是点对. 要求的对象变为
X
\mathbf{X}
X
求解 X \mathbf{X} X
现在求解
X
\mathbf{X}
X就变得十分的简单了. 就是一个线性优化问题.
而且变成一个线性最小二乘法.
假设我们有N张图片中含有同一个
X
\mathbf{X}
X那么,可以把优化函数写为
X
=
arg
min
X
∑
i
=
1
N
∥
P
i
X
−
x
i
∥
2
2
,
P
i
=
K
i
[
R
i
,
T
i
]
\mathbf{X}=\arg \min_{\mathbf{X}} \sum_{i=1}^{N}\| \mathbf{P}_{i} \mathbf{X}-\mathbf{x}_{i} \|^{2}_2, \mathbf{P}_i=K_i[R_i,T_i]
X=argXmini=1∑N∥PiX−xi∥22,Pi=Ki[Ri,Ti]
下标
i
i
i,表示第几张图片. 用这个方法可以成功的解出一个
X
\mathbf{X}
X.
也就是一个3D点. 最后, 解若干个这样的方程.
你可以恢复出一个3D点云.也就是2D像素对应的3D点云. 至此我们的目的就完成了.
我们最终解出了
X
\mathbf{X}
X. 可是遗憾的是, 还不够.
因为误差和匹配错误的问题. 效果不够好. 所以最后还需要做一次优化.
优化 K , R , T , X \mathbf{K, R, T, X} K,R,T,X
[
P
,
X
]
=
arg
min
P
,
X
∑
i
=
1
N
∑
j
=
1
D
∥
P
i
X
j
−
x
j
∥
2
2
[\mathbf{P, X}] = \arg \min_{\mathbf{P, X}} \sum_{i=1}^{N}\sum_{j=1}^{D} \|\mathbf{P}_i\mathbf{X}_j-x_j\|^2_2
[P,X]=argP,Xmini=1∑Nj=1∑D∥PiXj−xj∥22
其中
P
=
{
P
1
,
P
2
,
⋯
,
P
N
}
,
X
=
{
X
1
,
X
2
,
⋯
,
X
D
}
\mathbf{P}=\{\mathbf{P_1, P_2, \cdots , P_N}\}, \mathbf{X}=\{\mathbf{X}_1, \mathbf{X}_2, \cdots, \mathbf{X}_D\}
P={P1,P2,⋯,PN},X={X1,X2,⋯,XD},
其中N
N
N
N是图像数量.
D
D
D是特征点数量. 這個優化是一個非線性最小二乘法.
優化具體細節在這裏暫時不提. 不过至此我们就完成了所有SFM过程.
注意我这里简化了变量实际上
P
i
=
K
i
[
R
i
,
T
i
]
\mathbf{P_i=K_i[R_i,T_i]}
Pi=Ki[Ri,Ti]. 具体来说,
非线性最小二乘是怎么优化这些参数的.还要具体详细的查阅这方面的资料.
加粗样式