相机模型

一、相机投影模型

针孔相机模型(Pinhole Projection Model)

对于相机坐标系下的一个3D点\bf{x} := (x,y,z)^{T} 首先定义一个通用的投影函数 \pi : 表示将3D空间坐标转换到归一化坐标。

{\pi}( {\bf {x}}) =\begin{bmatrix} u_u \\ v _u\\ 1\end{bmatrix} := \frac{1}{z} \begin{bmatrix} x\\ y \\ z\end{bmatrix}
{\bf K}指的是相机的内参矩阵。
{\bf{K}}=\begin{bmatrix} f_x & 0 & c_x\\0 & f_y & c_y \\ 0 & 0 &1 \end{bmatrix}

因此可以得到3D点\bf{x} 在的像素坐标(u,v)

\begin{bmatrix} u \\v \\ 1 \end{bmatrix} ={\bf K}\pi(\bf{x})

相反的通过像素坐标{(u,v)},z, {\bf K} 也可以求解3D坐标{\bf x}
{\bf x} = {\bf{K}^{-1}}z\begin{bmatrix} u\\v\\1\end{bmatrix}

全向投影模型(Unified Omnidirectional Projection Model)

对于针孔投影模型,其视场角不能超过180°。用这种全向投影模型,则可以表示任意大的视场角的情况。 对于相机坐标系下的一个3D点\bf{x} := (x,y,z)^{T} 首先将其投影到一个单位球上面,接着将相机的中心移动 \xi 然后进行透视投影:
\pi_{\bf U}({\bf x}) = \begin{bmatrix}{\frac{x}{z+\xi {\bf ||x||}}}\\{ \frac{y}{z+\xi {\bf|| x||} }} \\ 1 \end{bmatrix}
对于其逆:\pi^{-1}_{{\bf U}}
\pi^{-1}_{{\bf U}}(\begin{bmatrix} u\\v \end{bmatrix}, {\bf ||x||}) = {\bf ||x||}(\frac{\xi+\sqrt{1+(1-\xi^2)(u^2+v^2)}}{u^2+v^2+1}\begin{bmatrix} u\\v \\1\end{bmatrix} -\begin{bmatrix}0\\0\\1\end{bmatrix} )
给定相机内参{\bf K} 就能得到3D点{\bf x}的像素坐标(u,v)
\begin{bmatrix} u\\v\\1\end{bmatrix} = {\bf K}\pi_{\bf U}({\bf x})
这里可以清楚看到当 {\xi = 0 } 时候,此模型就等价于针孔投影型了。

二、图像非线性畸变模型

FOV模型

这个畸变模型是专门用于鱼眼相机的。这个模型假设:某个3D点 {\bf x} 在图像中的投影(u,v)到主点(principle point)的距离,正比于光轴与光心到3D点{\bf x}连线的夹角。
这里的畸变模型都是应用于归一化坐标{(u_u,v_u)}, 这里用 \gamma(\vec x) 表示畸变函数。
\begin{bmatrix} u_d \\ v_d \end{bmatrix}= \gamma_{\bf F}(\begin{bmatrix} u_u \\ v_u \end{bmatrix}) = \frac{R(r_u)}{r_u}\begin{bmatrix} u_u \\ v_u \end{bmatrix},
其中:
r_u = \sqrt {u^2_u + v^2_u}
R(r_u)=\frac{1}{\omega}\arctan(2r_u\tan(\frac{\omega}{2}))

去畸变时候可以使用:
\gamma^{-1}_{\bf F}(\begin{bmatrix} u_d \\ v_d \end{bmatrix}) = \begin{bmatrix} u_u \\ v_u \end{bmatrix}= \frac{R^{-1}(r_d)}{r_d}\begin{bmatrix} u_d \\ v_d \end{bmatrix},
r_d = \sqrt {u^2_d + v^2_d} , \ \ \ \ R^{-1}(r_d) = \frac{r_d\omega}{2\tan\frac{\omega}{2}}

Radio-Tangential Model

这是最常见的畸变模型。但是这种畸变模型对于视场角超过120°或者有很大畸变的鱼眼相机就显得不合适。同样这里用 {\gamma(\vec x)} 函数来表示畸变。
\gamma_{\bf T}(\begin{bmatrix}u_u\\v_u\end{bmatrix} ) = \begin{bmatrix}u_d\\v_d\end{bmatrix} =\begin{bmatrix}u_u\frac{1 + k_1r^2_u + k_2 r^4_u + k_3r^6_u}{1+ k_4r^2_u + k_5r^4_u + k_6r^6_u}+2p_1u_uv_u + p_2(r^2_u + 2u^2_u)\\ v_u\frac{1 + k_1r^2_u + k_2 r^4_u + k_3r^6_u}{1+ k_4r^2_u + k_5r^4_u + k_6r^6_u}+2p_2u_uv_u + p_1(r^2_u + 2v^2_u) \end{bmatrix}
其中:
r_u = \sqrt{u^2_u + v^2_u}
对于这个模型,没有显示的去畸变的表达式,可以采用优化方法或是采用OpenCV里面高效的去畸变方法。

三、总结

实际的相机投影加上畸变模型,一个3D点{\bf x} = [x,y,z]^T 投影到像素坐标的过程是:
\begin{bmatrix} u\\v\end{bmatrix} = {\bf K} \gamma(\pi({\bf x}));
这里的 {\gamma}(\vec x) 对应第二节的畸变函数, \pi(\vec x) 对于第一节讲的相机投影投影函数。

参考:
Large-Scale Direct SLAM for Omnidirectional Cameras
Large-Scale Direct SLAM and3D Reconstruction in Real-Time

作者 功夫熊猫panda

你可能感兴趣的:(相机模型)