之前我们已经把有关三维重建最基础的相机标定的部分完整说完了,具体内容可以看之前的三章内容:从零开始的三维重建(二)—— 相机标定(上)、从零开始的三维重建(三)—— 相机标定(下)、从零开始的三维重建(四)——相机标定(补充)。接下来我们会开始进行最初的三维重建尝试,首先我们面对的就是单视图测量的问题。常理来说我们进行三维重建是需要多个视角的摄像机得到的图片的,但在一些特殊情况下,我们也可以通过单一视角完成对于图片的三维重建,这就需要我们用到有关无穷远的知识。
无穷远的点、线、面
我们先来考虑一下无穷远的定义,在二维平面下什么样的点我们会称之为无穷远点呢?
我们考虑三维空间中的一个点x= [ x 1 x 2 x 3 ] \begin{bmatrix} x_{1} \\ x_{2} \\ x_{3} \end{bmatrix}
x1x2x3
,我们将它做归一化,对应得到二维空间中的点就是x= [ x 1 / x 3 x 2 / x 3 1 ] \begin{bmatrix} x_{1}/x_{3} \\ x_{2}/x_{3} \\ 1 \end{bmatrix}
x1/x3x2/x31
,我们可以看到如果我们想要前两个坐标值为正无穷,只需要让x 3 _{3} 3=0,因此二维空间中无穷远点的坐标对应到三维空间中就是x= [ x 1 x 2 0 ] \begin{bmatrix} x_{1} \\ x_{2} \\ 0 \end{bmatrix}
x1x20
.
然后我们来看二维空间中的直线方程,首先对于一个直线方程ax 1 _{1} 1+bx 2 _{2} 2+c=0,我们可以把它写成如下形式:x T ^T Tl=0,其中l= [ a b c ] \begin{bmatrix} a \\ b \\ c \end{bmatrix}
abc
x= [ x 1 x 2 1 ] \begin{bmatrix} x_{1} \\ x_{2} \\ 1 \end{bmatrix}
x1x21
。其中我们可以发现x可以代表直线上所有的点,又因为x T ^T Tl=0,所以l向量就是直线的法向量。
那么如果我们有两条直线l、l’,我们就可以计算得到两条直线的交点为x=l×l’,证明过程如下:
l × l ′ ⊥ l → ( l × l ′ ) ⋅ l = 0 → x ∈ l l × l ′ ⊥ l ′ → ( l × l ′ ) ⋅ l ′ = 0 → x ∈ l ′ l×l'⊥l→(l×l')·l=0→x∈l\\ \\\ \\ l×l'⊥l'→(l×l')·l'=0→x∈l' l×l′⊥l→(l×l′)⋅l=0→x∈l l×l′⊥l′→(l×l′)⋅l′=0→x∈l′
因为x既在l上又在l’上,所以x为交点。
那么假设我们有两条平行的直线,即l= [ a b c ] \begin{bmatrix} a \\ b \\ c \end{bmatrix}
abc
l’= [ a ′ b ′ c ′ ] \begin{bmatrix} a' \\ b' \\ c' \end{bmatrix}
a′b′c′
,-a/b=-a’/b’,如果我们想求它们两个的交点,就可以用l×l’,根据矩阵叉乘的计算公式以及未知数之间的关系我们可以得到:
l × l ′ = [ b ( c ′ − a ′ c / a ) − a ( c ′ − a ′ c / a ) 0 ] ∝ [ b − a 0 ] l×l'=\begin{bmatrix} b(c'-a'c/a) \\ -a(c'-a'c/a) \\ 0 \end{bmatrix}\propto\begin{bmatrix} b \\ -a \\ 0 \end{bmatrix} l×l′=
b(c′−a′c/a)