想知道如何从二维图像中如何恢复三维点,需要先知道三维点是如何映射成二维点的。
原理很简单,就是我们小学学的小孔成像原理。
为了方便我们对针孔相机模型进行数学建模,我们往往对虚拟像平面进行研究,因为虚拟像平面的方向与我们实际物体的方向一致。
根据相似三角形原理,可以得到三维坐标到二维坐标的映射:
P = [ x y z ] ⟹ P ′ = [ x ′ y ′ ] ( x ′ = f x z y ′ = f y z ) P = \begin{bmatrix}x \\ y\\ z \end{bmatrix} \Longrightarrow P' = \begin{bmatrix}x' \\ y' \end{bmatrix} \left ( \begin{matrix} x' = f\frac{x}{z} \\ y' = f\frac{y}{z} \end{matrix} \right) P= xyz ⟹P′=[x′y′](x′=fzxy′=fzy)
将像平面原点坐标移动到图像的左下角: ( x , y , z ) ⟶ ( f x z + c x , f x z + c y ) \left(x,y,z \right) \longrightarrow \left(f\frac{x}{z} +c_x,f\frac{x}{z}+c_y \right) (x,y,z)⟶(fzx+cx,fzx+cy)
加上现实世界单位(m)到数码图片单位(pixel)的转换量: ( x , y , z ) ⟶ ( f k x z + c x , f k x z + c y ) \left(x,y,z \right) \longrightarrow \left(fk\frac{x}{z} +c_x,fk\frac{x}{z}+c_y \right) (x,y,z)⟶(fkzx+cx,fkzx+cy)
至此,完成了相机坐标到像平面坐标的映射: P = ( x , y , z ) ⟶ P ′ = ( α x z + c x , β y z + c y ) \mathbf{P=(x,y,z) \longrightarrow P'= \left(\alpha \frac{x}{z} + c_x,\beta \frac{y}{z} + c_y\right)} P=(x,y,z)⟶P′=(αzx+cx,βzy+cy)
在上面这个公式中, z z z是会改变的,因此 P P P到 P ′ P' P′并不是线性变换,我们需要引入齐次坐标,使它成为线性变换。
欧式坐标变为齐次坐标就是在最后增加一个维度,并让它的值为1:
( x , y ) ⟶ [ x y 1 ] ( x , y , z ) ⟶ [ x y z 1 ] (x,y) \longrightarrow \begin{bmatrix}x \\ y\\1 \end{bmatrix} {\kern 20pt} (x,y,z) \longrightarrow \begin{bmatrix}x \\ y\\z\\1 \end{bmatrix} (x,y)⟶ xy1 (x,y,z)⟶ xyz1
齐次坐标转欧式坐标:
[ x y w ] ⟶ ( x w , y w ) [ x y z w ] ⟶ ( x w , y w , z w ) \begin{bmatrix}x\\y\\w \end{bmatrix} \longrightarrow (\frac{x}{w},\frac{y}{w}) {\kern 20pt}\begin{bmatrix}x\\y\\z\\w \end{bmatrix} \longrightarrow (\frac{x}{w},\frac{y}{w},\frac{z}{w}) xyw ⟶(wx,wy) xyzw ⟶(wx,wy,wz)
齐次坐标转到欧式坐标的结果并不是一一对应的,比如(1,1,1)和(2,2,2)转到欧式坐标都是(1,1),它们之间相差一个系数。
变为齐次坐标后 P P P到 P ′ P' P′就是线性变换的, z z z的变化不会影响最后的投影结果。
由于制造工艺的原因,像平面可能不是一个矩形,所以需要引入 θ \theta θ进行建模:
在进行三维重建的时候往往需要用到多个相机,因此需要外参矩阵将所有点的坐标系进行统一。