针孔相机模型是实际研究中最常用的模型。针孔是一个中间有一个小孔的假想墙壁,光只能从小孔通过。
f f f是摄像机焦距, Z Z Z是摄像机到物体的距离, X X X是物体长度,是图像平面上的物体长度。由相似三角形可得:
− x = f X Z -x = f\frac{X}{Z} −x=fZX
可将上图等价转换为如下所示系统,图像平面防止在针孔前方的摄像机模型(数学上等价,形式更简单)。
经过转换得到
X p = f X c Z c Y p = f Y c Z c ⟺ Z c [ X p Y p 1 ] = [ f 0 0 0 f 0 0 0 1 ] [ X c Y c Z c ] \begin{aligned} X_p = f\frac{X_c}{Z_c}\\ Y_p = f\frac{Y_c}{Z_c} \end{aligned}\iff Z_c\begin{bmatrix} X_p\\ Y_p\\ 1 \end{bmatrix}= \begin{bmatrix} f&0&0\\ 0&f&0\\ 0&0&1 \end{bmatrix} \begin{bmatrix} X_c\\Y_c\\Z_c \end{bmatrix} Xp=fZcXcYp=fZcYc⟺Zc⎣⎡XpYp1⎦⎤=⎣⎡f000f0001⎦⎤⎣⎡XcYcZc⎦⎤
物体投影到成像平面之后由采样器件采样后转换为数字信号,成为像素图像。 d x , d y \rm dx,dy dx,dy分别为一个像素占据的成像平面的物理尺寸(x方向,y方向)。
由于像素坐标系的原点和图像坐标系的原点不同,建模时需要加上两者原点的偏移和 u 0 u_0 u0和 v 0 v_0 v0。
u = X p d x + u 0 v = Y p d y + v 0 ⟺ [ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ X p Y p 1 ] \begin{aligned} u &= \frac{X_p}{\rm dx}+u_0 \\ v &= \frac{Y_p}{\rm dy}+v_0 \end{aligned}\iff \begin{bmatrix} u\\v\\1 \end{bmatrix}= \begin{bmatrix} \frac{1}{\rm dx}&0&u_0\\ 0&\frac{1}{\rm dy}&v_0\\ 0&0&1 \end{bmatrix} \begin{bmatrix} X_p\\Y_p\\1 \end{bmatrix} uv=dxXp+u0=dyYp+v0⟺⎣⎡uv1⎦⎤=⎣⎡dx1000dy10u0v01⎦⎤⎣⎡XpYp1⎦⎤
上述推导假设感光板的横轴和纵轴是正交的,但在实际中由于制造精度不会完美正交,假设感光板的横轴与纵轴(像素系的u轴和v轴)的夹角为 θ \theta θ,则模型变为
u = X p d x + u 0 − Y p d x tan θ v = Y p d y sin θ + v 0 ⟺ [ u v 1 ] = [ 1 d x − 1 d x tan θ u 0 0 1 d y sin θ v 0 0 0 1 ] [ X p Y p 1 ] \begin{aligned} u &= \frac{X_p}{\rm dx}+u_0-\frac{Y_p}{\rm dx\tan\theta} \\ v &= \frac{Y_p}{\rm dy\sin\theta}+v_0 \end{aligned}\iff \begin{bmatrix} u\\v\\1 \end{bmatrix}= \begin{bmatrix} \frac{1}{\rm dx}&-\frac{1}{\rm dx\tan\theta}&u_0\\ 0&\frac{1}{\rm dy\sin\theta}&v_0\\ 0&0&1 \end{bmatrix} \begin{bmatrix} X_p\\Y_p\\1 \end{bmatrix} uv=dxXp+u0−dxtanθYp=dysinθYp+v0⟺⎣⎡uv1⎦⎤=⎣⎡dx100−dxtanθ1dysinθ10u0v01⎦⎤⎣⎡XpYp1⎦⎤
于是
[ u v 1 ] = 1 Z c [ 1 d x − 1 d x tan θ u 0 0 1 d y sin θ v 0 0 0 1 ] [ f 0 0 0 f 0 0 0 1 ] [ X c Y c Z c ] = [ f d x − f d x tan θ u 0 0 f d y sin θ v 0 0 0 1 ] [ X c Z c Y c Z c 1 ] ⟺ q = K x = [ α β u 0 0 γ v 0 0 0 1 ] [ x y 1 ] (1) \begin{aligned} \begin{bmatrix} u\\v\\1 \end{bmatrix}&=\dfrac{1}{Z_c}\begin{bmatrix} \frac{1}{\rm dx}&-\frac{1}{\rm dx\tan\theta}&u_0\\ 0&\frac{1}{\rm dy\sin\theta}&v_0\\ 0&0&1 \end{bmatrix} \begin{bmatrix} f&0&0\\ 0&f&0\\ 0&0&1 \end{bmatrix} \begin{bmatrix} X_c\\Y_c\\Z_c \end{bmatrix}\\ &= \begin{bmatrix} \frac{f}{\rm dx}&-\frac{f}{\rm dx \tan\theta}&u_0\\ 0&\frac{f}{\rm d_y\sin\theta}&v_0\\ 0&0&1 \end{bmatrix} \begin{bmatrix} \frac{X_c}{Z_c}\\ \frac{Y_c}{Z_c}\\ 1 \end{bmatrix} \end{aligned} \iff \tag{1} \boldsymbol{q}=\boldsymbol{K}\boldsymbol{x}=\begin{bmatrix}\alpha&\beta&u_0\\0&\gamma&v_0\\0&0&1\end{bmatrix} \begin{bmatrix} {x}\\ {y}\\ 1 \end{bmatrix} ⎣⎡uv1⎦⎤=Zc1⎣⎡dx100−dxtanθ1dysinθ10u0v01⎦⎤⎣⎡f000f0001⎦⎤⎣⎡XcYcZc⎦⎤=⎣⎡dxf00−dxtanθfdysinθf0u0v01⎦⎤⎣⎡ZcXcZcYc1⎦⎤⟺q=Kx=⎣⎡α00βγ0u0v01⎦⎤⎣⎡xy1⎦⎤(1)
其中 x = X c Z c {x}=\dfrac{X_c}{Z_c} x=ZcXc和 y = Y c Z c {y}=\dfrac{Y_c}{Z_c} y=ZcYc是归一化坐标(相当于成像与 Z c = 1 Z_c=1 Zc=1平面上)。
通常 θ \theta θ与 9 0 ∘ 90^\circ 90∘ 相差很小,当 θ = 9 0 ∘ \theta=90^\circ θ=90∘时, γ = 0 \gamma=0 γ=0,令 α = f x = f d x \alpha=f_x=\dfrac{f}{\rm dx} α=fx=dxf和 β = f y = f d y \beta=f_y=\dfrac{f}{\rm dy} β=fy=dyf是x, y方向的缩放系数,另一种惯例将 u 0 u_0 u0写作 c x c_x cx, v 0 v_0 v0写作 c y c_y cy,则上式写作:
[ u v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ x y 1 ] \begin{bmatrix} u\\v\\1 \end{bmatrix}=\begin{bmatrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{bmatrix} \begin{bmatrix} {x}\\ {y}\\ 1 \end{bmatrix} ⎣⎡uv1⎦⎤=⎣⎡fx000fy0cxcy1⎦⎤⎣⎡xy1⎦⎤
为了获得好的成像效果,通常在相机的前方加上透镜。透镜的引入会对成像过程中光线的传播产生新的影响:一是透镜自身的形状会对光线的传播产生影响,二是在机械组装过程中,透镜和成像平面不完全平行,这也会֯得光线穿过透镜投影到成像面时的位置发生变化。
由透镜形状引起的畸变称为径向畸变 。在针孔模型中,一条直线投影到像素平面上还是一条直线。可是,实际拍摄的照片中,摄像机的透镜往往使得真实环境中的一条直线在图片中变成了曲线。越靠近图像的边缘,这种现象越明显。由于实际加工制作的透镜往往是中心对称的,这使得不规则的畸变通常径向对称。它们主要分为两大类:桶形畸变和枕形畸变,如下图所示。
桶形畸变图像放大率随着与光轴之间的距离增加而减小,而枕形畸变则恰好相反。在这两种畸变中,穿过图像中心和光轴有交点的直线还能保持形状不变。
除了透镜的形状会引入径向畸变,由于在相机的组装过程中不能使透镜和成像面严格平行,所以也会引入切向畸变。
通常选用较为规则的图形例如黑白棋盘格进行相机标定,标定效果较好。使用OpenCV中摄像机标定的相关函数定得出相机内参数 c x , c y , f x , f y c_x, c_y, f_x, f_y cx,cy,fx,fy以及畸变系数 k 1 , k 2 , k 3 k_1, k_2, k_3 k1,k2,k3。
对于径向畸变,可以用一个多项式函数来描述畸变前后的坐标变化:这类畸变可以用与距中心的距离有关的二次及高次多项式函数进行拟合。考虑归一化平面上任意一点 p \boldsymbol{p} p,其坐标为 [ x , y ] T [{x},{y}]^T [x,y]T,是理想成像点(未畸变)的坐标,也可以写成极坐标的形式 [ r , θ ] T [r,\theta]^T [r,θ]T,其中 r r r表示点与坐标原点之间的距离, θ \theta θ表示与水平轴的夹角。
x d i s t o r t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y d i s t o r t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) {x}_{distorted} = {x}(1 + k_1r^2 + k_2r^4 + k_3r^6) \\ {y}_{distorted} = {y}(1 + k_1r^2 + k_2r^4 + k_3r^6) xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)
其中 [ x d i s t o r t e d , y d i s t o r t e d ] T [{x}_{distorted}, {y}_{distorted}]^T [xdistorted,ydistorted]T是畸变后的点的归一化坐标。
上述畸变模型中,对于畸变较小的图像中心区域,畸变校正主要是 k 1 k_1 k1起作用;对于畸变较大的边缘区域,主要是 k 2 k_2 k2起作用。对于切向畸变,可以使用另外的两个参数 p 1 p_1 p1, p 2 p_2 p2来进行表征:
x d i s t o r t e d = x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y d i s t o r t e d = y + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y {x}_{distorted} = {x} + 2p_1{x}{y} + p_2(r^2 + 2{x}^2) \\ {y}_{distorted} = {y} + p_1(r^2 + 2{y}^2) + 2p_2{x}{y} xdistorted=x+2p1xy+p2(r2+2x2)ydistorted=y+p1(r2+2y2)+2p2xy
联合上式,对于相机坐标系中的一点P ( x c , y c , z c ) (x_c,y_c,z_c) (xc,yc,zc),能够通过5个畸变系数找到这个点在像素平面上的真实位置:
张正友标定法利用棋盘格标定,在得到一张标定板的图像之后,利用相应的图像检测算法得到每一个角点的像素坐标 ( u , v ) (u,v) (u,v)。世界坐标系固定于棋盘格上,则棋盘格上任一点的世界系坐标 Z = 0 Z=0 Z=0,由于标定板上每一个格子的大小是已知的,可以计算得到每一个角点在世界坐标系下的坐标 ( X , Y , Z ) (X,Y,Z) (X,Y,Z)。利用每一个角点的像素坐标 ( u , v ) (u,v) (u,v)和每一个角点在世界坐标系下的物理坐标 ( X , Y , Z = 0 ) (X,Y,Z=0) (X,Y,Z=0),来进行相机的标定,获得相机的内外参矩阵、畸变参数。
对每一幅图像得到一个单应性矩阵(像素平面到标定板平面的映射矩阵) H \boldsymbol{H} H
内参矩阵设为 K \boldsymbol{K} K,假定模板平面在世界坐标系 Z = 0 Z=0 Z=0的平面上,对于一张图片上的每一个角点有
s [ u v 1 ] = K [ r 1 r 2 r 3 t ] [ X Y Z = 0 1 ] = K [ r 1 r 2 t ] [ X Y 1 ] \begin{aligned} s\begin{bmatrix}u\\v\\1\end{bmatrix} &=\boldsymbol{K}\begin{bmatrix}\boldsymbol{r}_1&\boldsymbol{r}_2&\boldsymbol{r}_3&\boldsymbol{t}\end{bmatrix} \begin{bmatrix}X\\Y\\Z=0\\1\end{bmatrix} \\&= \boldsymbol{K}\begin{bmatrix}\boldsymbol{r}_1&\boldsymbol{r}_2&\boldsymbol{t}\end{bmatrix} \begin{bmatrix}X\\Y\\1\end{bmatrix} \end{aligned} s⎣⎡uv1⎦⎤=K[r1r2r3t]⎣⎢⎢⎡XYZ=01⎦⎥⎥⎤=K[r1r2t]⎣⎡XY1⎦⎤
设单应矩阵
H = [ h 1 h 2 h 3 ] = K [ r 1 r 2 t ] \boldsymbol{H} = \begin{bmatrix}\boldsymbol{h}_1& \boldsymbol{h}_2& \boldsymbol{h}_3\end{bmatrix}=\boldsymbol{K}\begin{bmatrix}\boldsymbol{r}_1&\boldsymbol{r}_2&\boldsymbol{t}\end{bmatrix} H=[h1h2h3]=K[r1r2t]
则对于每一个像素点都可以得到一个等式:
q = 1 s H P [ u v 1 ] = 1 s H [ X Y 1 ] = 1 s [ H 11 H 12 H 13 H 21 H 22 H 23 H 31 H 32 H 33 ] [ X Y 1 ] \begin{aligned} \boldsymbol{q}&=\dfrac{1}{s}\boldsymbol{HP}\\ \begin{bmatrix}u\\v\\1\end{bmatrix} &=\dfrac{1}{s}\boldsymbol{H}\begin{bmatrix}X\\Y\\1\end{bmatrix} \\&= \dfrac{1}{s} \begin{bmatrix} H_{11}&H_{12}&H_{13} \\ H_{21}&H_{22}&H_{23} \\ H_{31}&H_{32}&H_{33} \end{bmatrix} \begin{bmatrix}X\\Y\\1\end{bmatrix} \end{aligned} q⎣⎡uv1⎦⎤=s1HP=s1H⎣⎡XY1⎦⎤=s1⎣⎡H11H21H31H12H22H32H13H23H33⎦⎤⎣⎡XY1⎦⎤
因为使用的是齐次坐标,所以单应矩阵 H \boldsymbol{H} H与尺度无关,可以乘以任意非零因子,因此的自由度是8,然后根据第三行,去掉非零因子,于是有
{ u = H 11 X + H 12 Y + H 13 H 31 X + H 32 Y + H 33 v = H 21 X + H 22 Y + H 23 H 31 X + H 32 Y + H 33 \begin{cases} u=\dfrac{H_{11}X+H_{12}Y+H_{13}}{H_{31}X+H_{32}Y+H_{33}} \\ v=\dfrac{H_{21}X+H_{22}Y+H_{23}}{H_{31}X+H_{32}Y+H_{33}} \end{cases} ⎩⎪⎨⎪⎧u=H31X+H32Y+H33H11X+H12Y+H13v=H31X+H32Y+H33H21X+H22Y+H23
最少需要四个角点就可以解出单应矩阵 H \boldsymbol{H} H,求解方法参考。因此,当一张图片上的标定板角点数量等于4时,即可求得该图片对应的矩阵 H \boldsymbol{H} H。当一张图片上的标定板角点数量大于4时,利用最小二乘法回归最佳的矩阵 H \boldsymbol{H} H。
利用约束条件线性求解内参矩阵 K \boldsymbol{K} K
由旋转矩阵的性质: r 1 T r 2 = 0 , r 1 T r 1 = 1 , r 2 T r 2 = 1 \boldsymbol{r}_1^T\boldsymbol{r}_2=0,\ \boldsymbol{r}_1^T\boldsymbol{r}_1=1,\ \boldsymbol{r}_2^T\boldsymbol{r}_2=1 r1Tr2=0, r1Tr1=1, r2Tr2=1,得到内参矩阵 K \boldsymbol{K} K的约束条件
( K − 1 h 1 ) T ( K − 1 h 2 ) = 0 ⟹ h 1 T K − T K − 1 h 2 = 0 (\boldsymbol{K}^{-1}\boldsymbol{h}_1)^T(\boldsymbol{K}^{-1}\boldsymbol{h}_2)=0\\ \implies \boldsymbol{h}_1^T\boldsymbol{K}^{-T}\boldsymbol{K}^{-1}\boldsymbol{h}_2=0 (K−1h1)T(K−1h2)=0⟹h1TK−TK−1h2=0
设
B = K − T K − 1 = [ B 11 B 12 B 13 B 12 B 22 B 23 B 13 B 23 B 33 ] = [ 1 α 2 − γ α 2 β v 0 γ − u 0 β α 2 β − γ α 2 β γ 2 α 2 β 2 + 1 β 2 − γ ( v 0 γ − u 0 β ) α 2 β 2 − v 0 β 2 v 0 γ − u 0 β α 2 β − γ ( v 0 γ − u 0 β ) α 2 β 2 − v 0 β 2 ( v 0 γ − u 0 β ) 2 α 2 β 2 + v 0 2 β 2 + 1 ] \begin{aligned} \boldsymbol{B}&=\boldsymbol{K}^{-T}\boldsymbol{K}^{-1}=\begin{bmatrix} B_{11}&B_{12}&B_{13}\\ B_{12}&B_{22}&B_{23}\\ B_{13}&B_{23}&B_{33} \end{bmatrix} \\&= \begin{bmatrix} \dfrac{1}{\alpha ^{2}} & -\dfrac{\gamma }{\alpha ^{2}\beta } & \dfrac{v_{0}\gamma -u_{0}\beta }{\alpha ^{2}\beta } \\ -\dfrac{\gamma }{\alpha ^{2}\beta } & \dfrac{\gamma ^{2}}{\alpha ^{2}\beta ^{2}}+\dfrac{1}{\beta ^{2}} & -\dfrac{\gamma \left( v_{0}\gamma -u_0 \beta \right) }{\alpha ^{2}\beta ^{2}}-\dfrac{v_{0}}{\beta ^{2}} \\ \dfrac{v_{0}\gamma -u_{0}\beta }{\alpha ^{2}\beta } & -\dfrac{\gamma \left( v_{0}\gamma -u_0\beta \right) }{\alpha ^{2}\beta ^{2}}-\dfrac{v_{0}}{\beta ^{2}} & \dfrac{\left( v_{0}\gamma-u_0 \beta \right) ^{2}}{\alpha ^{2}\beta ^{2}}+\dfrac{v_{0}^{2}}{\beta ^{2}}+1 \end{bmatrix} \end{aligned} B=K−TK−1=⎣⎡B11B12B13B12B22B23B13B23B33⎦⎤=⎣⎢⎢⎢⎢⎢⎢⎡α21−α2βγα2βv0γ−u0β−α2βγα2β2γ2+β21−α2β2γ(v0γ−u0β)−β2v0α2βv0γ−u0β−α2β2γ(v0γ−u0β)−β2v0α2β2(v0γ−u0β)2+β2v02+1⎦⎥⎥⎥⎥⎥⎥⎤
B \boldsymbol{B} B为对称正定矩阵
则有:
h 1 T B h 2 = 0 h 1 T B h 1 = h 2 T B h 2 = 1 (2) \begin{aligned} \boldsymbol{h}_1^T\boldsymbol{Bh}_2&=0\\ \boldsymbol{h}_1^T\boldsymbol{Bh}_1&= \boldsymbol{h}_2^T\boldsymbol{Bh}_2=1 \end{aligned}\tag{2} h1TBh2h1TBh1=0=h2TBh2=1(2)
上式的几何解释见附录1。 H \boldsymbol{H} H本身有8个自由度,外参有6个(3个用于旋转,3个用于平移),因此给定一个单应矩阵 H \boldsymbol{H} H只能提供2个关于内参的约束。
将 B \boldsymbol{B} B向量化 b = [ B 11 B 12 B 22 B 13 B 23 B 33 ] T \boldsymbol{b}= \begin{bmatrix} B_{11}&B_{12}&B_{22}& B_{13}&B_{23}&B_{33} \end{bmatrix}^{T} b=[B11B12B22B13B23B33]T, 设 v i j = [ h i 1 h j 1 , h i 1 h j 2 + h i 2 h j 1 , h i 2 h j 2 , h i 3 h j 1 + h i 1 h j 3 , h i 3 h j 2 + h i 2 h j 3 , h i 3 h j 3 ] T \bold{v}_{ij}=\left[h_{i1}h_{j1},\ h_{i1}h_{j2}+h_{i2}h_{j1},\ h_{i2}h_{j2},\ h_{i3}h_{j1}+h_{i1}h_{j3},\ h_{i3}h_{j2}+h_{i2}h_{j3},\ h_{i3}h_{j3}\right]^T vij=[hi1hj1, hi1hj2+hi2hj1, hi2hj2, hi3hj1+hi1hj3, hi3hj2+hi2hj3, hi3hj3]T,则上面三个等式可以化为
v 12 T b = 0 ( v 11 T − v 22 T ) b = 1 ⟺ [ v 12 T v 11 T − v 22 T ] b = 0 ⟺ V b = 0 \begin{aligned} \begin{aligned} \bold{v}_{12}^T\boldsymbol{b}=0\\ \left(\bold{v}_{11}^{T}-\bold{v}_{22}^{T}\right)\boldsymbol{b}=1\\ \end{aligned} \iff& \begin{bmatrix} \bold{v}_{12}^T\\ \bold{v}_{11}^T-\bold{v}_{22}^T \end{bmatrix}\boldsymbol{b}=\bf{0} \\ \iff&\bold{V}\boldsymbol{b}=0 \end{aligned} v12Tb=0(v11T−v22T)b=1⟺⟺[v12Tv11T−v22T]b=0Vb=0
根据线性齐次方程组的理论,齐次方程的一个解乘上任意常数依然是方程的解,上述齐次方程的解构成向量空间。既然解是尺度无关的,那我们可以假设 ∥ b ∥ = 1 \Vert\boldsymbol{b}\Vert=1 ∥b∥=1。每张标定板图片可以提供两个约束方程,n张图片对应的 V \bold{V} V 是一个 2 n × 6 \rm 2n\times6 2n×6的矩阵。 当 n ⩾ 3 \rm n\geqslant 3 n⩾3时,我们可以将解空间缩小至一维,在 ∥ b ∥ = 1 \Vert\boldsymbol{b}\Vert=1 ∥b∥=1的假设下可以得到唯一解。求解的方法就是计算 V T V \bold{V}^T\bold{V} VTV最小特征值对应的特征向量(也就是 V \bold{V} V的最小奇异值对应的右奇异向量):在 ∥ b ∥ = 1 \Vert\boldsymbol{b}\Vert=1 ∥b∥=1的条件下,求使 V b = 0 \bold{V}\boldsymbol{b}=0 Vb=0的向量 b \boldsymbol{b} b,也就是使 ∥ V b ∥ 2 = b T V T V b \Vert\bold{V}\boldsymbol{b}\Vert^2=\boldsymbol{b}^T\bold{V}^T\bold{V}\boldsymbol{b} ∥Vb∥2=bTVTVb的最小的向量 b \boldsymbol{b} b,由Rayleigh商理论可知, b T V T V b ∣ ∥ b ∥ = 1 \boldsymbol{b}^T\bold{V}^T\bold{V}\boldsymbol{b}\vert_{\Vert\boldsymbol{b}\Vert=1} bTVTVb∣∥b∥=1的最小值是 V T V \bold{V}^T\bold{V} VTV的最小特征值, b \boldsymbol{b} b对应的特征向量。
求解出的 B \boldsymbol{B} B矩阵是尺度无关的,可以乘以任意非零因子,因此 B = λ K − T K − 1 \boldsymbol{B}=\lambda\boldsymbol{K}^{-T}\boldsymbol{K}^{-1} B=λK−TK−1,可从中导出内参矩阵 K \boldsymbol{K} K,求解过程见附录2,再由 K \boldsymbol{K} K和单应矩阵 H \boldsymbol{H} H计算外参 R \boldsymbol{R} R和 t \boldsymbol{t} t:
[ r 1 r 2 t ] = λ K − 1 H \begin{bmatrix}\boldsymbol{r}_1&\boldsymbol{r}_2&\boldsymbol{t}\end{bmatrix}=\lambda\boldsymbol{K}^{-1}\boldsymbol{H} [r1r2t]=λK−1H
其中 λ = 1 ∥ K − 1 h 1 ∥ = 1 ∥ K − 1 h 2 ∥ \lambda=\dfrac{1}{\Vert\boldsymbol{K}^{-1}\boldsymbol{h}_1}\Vert=\dfrac{1}{\Vert\boldsymbol{K}^{-1}\boldsymbol{h}_2\Vert} λ=∥K−1h11∥=∥K−1h2∥1
完整的外参矩阵为 [ r 1 r 2 r 3 t ] \begin{bmatrix}\boldsymbol{r}_1&\boldsymbol{r}_2&\boldsymbol{r}_3&\boldsymbol{t}\end{bmatrix} [r1r2r3t] 。但是,由于张正友标定板将世界坐标系的 x O y \rm xOy xOy平面选取在棋盘格上,则棋盘格上任一点的世界坐标 Z = 0 Z=0 Z=0 ,因此, r 3 \boldsymbol{r}_3 r3 在坐标转化中并没有作用。但是 r 3 \boldsymbol{r}_3 r3要使得满足旋转矩阵的性质,即列与列之间单位正交,因此可以通过向量 r 1 , r 2 \boldsymbol{r}_1,\boldsymbol{r}_2 r1,r2的叉乘计算得到,即
r 3 = r 1 × r 2 \boldsymbol{r}_3=\boldsymbol{r}_1\times \boldsymbol{r}_2 r3=r1×r2
由于数据存在噪声,所以计算得到的 [ r 1 r 2 r 3 ] \begin{bmatrix}\boldsymbol{r}_1&\boldsymbol{r}_2&\boldsymbol{r}_3\end{bmatrix} [r1r2r3] 可能并不满足旋转矩阵的条件,使用附录3的方法可以由一个普通三维矩阵估计出最优的旋转矩阵。
最大似然估计
上述解决方案是通过最小化代数距离得到的,这在物理上是没有意义的。我们可以通过最大似然估计来进一步优化,上述方案的解作为初值。
arg min K , R i , t i ∑ i = 1 n ∑ j = 1 m ∥ q i j − q ^ ( K , R i , t i , P j ) ∥ 2 (opt1) \underset{\boldsymbol{K},\boldsymbol{R}_i,\boldsymbol{t}_i}{\arg\min}\sum_{i=1}^n\sum_{j=1}^m\Vert \boldsymbol{q}_{ij}-\hat{\boldsymbol{q}}(\boldsymbol{K},\boldsymbol{R}_i,\boldsymbol{t}_i,\boldsymbol{P}_j)\Vert^2\tag{opt1} K,Ri,tiargmini=1∑nj=1∑m∥qij−q^(K,Ri,ti,Pj)∥2(opt1)
其中 q ^ ( K , R i , t i , P j ) \hat{\boldsymbol{q}}(\boldsymbol{K},\boldsymbol{R}_i,\boldsymbol{t}_i,\boldsymbol{P}_j) q^(K,Ri,ti,Pj)是图像i中的棋盘格角点 P j \boldsymbol{P}_j Pj的重投影像素。上式本质上是最小化重投影误差的非线性最小二乘问题,可以使用Levenberg-Marquardt优化算法求解。
迭代求解畸变系数
目前为止我们还没有考虑畸变,这是因为张正友标定法采用迭代求解的思路,在求解 K , R i , t i \boldsymbol{K},\boldsymbol{R}_i,\boldsymbol{t}_i K,Ri,ti的时候假设畸变已知,求解出 K , R i , t i \boldsymbol{K},\boldsymbol{R}_i,\boldsymbol{t}_i K,Ri,ti之后再求解畸变参数,如此反复迭代。
设世界系下的棋盘格角点 P \boldsymbol{P} P经过理想针孔模型投影(无畸变)后的像素坐标为 ( u , v ) (u,v) (u,v), ( u ˘ , v ˘ ) (\breve{u},\breve{v}) (u˘,v˘)是真实观测到的对应像素坐标点。类似的, ( x , y ) (x,y) (x,y)和 ( x ˘ , y ˘ ) (\breve{x},\breve{y}) (x˘,y˘)分别是理想的(无畸变)和真实的(有畸变)的归一化坐标。则根据畸变模型
{ x ˘ = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y ˘ = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y (3) \begin{cases} \breve{x} = {x}(1+k_1r^2+k_2r^4+k_3r^6)+2p_1{x}{y}+p_2(r^2+2{x}^2)\\ \breve{y} = {y}(1+k_1r^2+k_2r^4+k_3r^6)+p_1(r^2+2{y}^2)+2p_2{x}{y} \end{cases}\tag{3} {x˘=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)y˘=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy(3)
整理成畸变系数的线性方程形式:
( x r 2 x r 4 x r 6 2 x y r 2 + 2 x 2 y r 2 y r 4 y r 6 r 2 + 2 y 2 2 x y ) ( k 1 k 2 k 3 p 1 p 2 ) = ( x ˘ − x y ˘ − y ) \begin{pmatrix} xr^{2} & xr^{4} & xr^{6} & 2xy & r^{2}+2x^{2} \\ yr^{2} & yr^{4} & yr^{6} & r^{2}+2y^{2} & 2xy \end{pmatrix}\begin{pmatrix} k_{1} \\ k_{2} \\ k_{3} \\ p_{1} \\ p_{2} \end{pmatrix}=\begin{pmatrix} \breve{x}-x \\ \breve{y}-y \end{pmatrix} (xr2yr2xr4yr4xr6yr62xyr2+2y2r2+2x22xy)⎝⎜⎜⎜⎜⎛k1k2k3p1p2⎠⎟⎟⎟⎟⎞=(x˘−xy˘−y)
其中 r = x 2 + y 2 r=\sqrt{x^2+y^2} r=x2+y2,可由 [ u ˘ v ˘ 1 ] = K [ x ˘ y ˘ 1 ] \begin{bmatrix}\breve{u}\\\breve{v}\\1\end{bmatrix}=\boldsymbol{K}\begin{bmatrix}\breve{x}\\\breve{y}\\1\end{bmatrix} ⎣⎡u˘v˘1⎦⎤=K⎣⎡x˘y˘1⎦⎤从 ( u ˘ , v ˘ ) (\breve{u},\breve{v}) (u˘,v˘)计算出 ( x ˘ , y ˘ ) (\breve{x},\breve{y}) (x˘,y˘)
给定n张图片,每张图片有m对对应点,每一对对应点都可以得到上面两个等式,将所有2mn个等式合并,设畸变向量 d = [ k 1 , k 2 , k 3 , p 1 , p 2 ] T \boldsymbol{d}=[k_1,k_2,k_3,p_1,p_2]^T d=[k1,k2,k3,p1,p2]T写成矩阵形式:
A d = a \bold{A}\boldsymbol{d}=\bold{a} Ad=a
线性最小二乘解为:
d = ( A T A ) − 1 A T a \boldsymbol{d}=(\bold{A}^T\bold{A})^{-1}\bold{A}^T\bold{a} d=(ATA)−1ATa
求解出畸变系数之后,按照(3)式将原优化问题 ( o p t 1 ) \rm (opt1) (opt1)中的 q ^ \hat{\boldsymbol{q}} q^替换为 q ˘ = ( x ˘ , y ˘ ) T \breve{\boldsymbol{q}}=(\breve{x},\breve{y})^T q˘=(x˘,y˘)T,优化求解 K , R i , t i \boldsymbol{K},\boldsymbol{R}_i,\boldsymbol{t}_i K,Ri,ti,再执行步骤4.求解畸变系数,如此反复迭代,直到收敛。
完整的最大似然估计:
在步骤3.的基础上将畸变系数考虑进去,构建更大规模的最大似然估计问题:
arg min K , d , R i , t i ∑ i = 1 n ∑ j = 1 m ∥ q i j − q ^ ( K , d , R i , t i , P j ) ∥ 2 (opt2) \underset{\boldsymbol{K},\boldsymbol{d},\boldsymbol{R}_i,\boldsymbol{t}_i}{\arg\min}\sum_{i=1}^n\sum_{j=1}^m\Vert \boldsymbol{q}_{ij}-\hat{\boldsymbol{q}}(\boldsymbol{K},\boldsymbol{d},\boldsymbol{R}_i,\boldsymbol{t}_i,\boldsymbol{P}_j)\Vert^2\tag{opt2} K,d,Ri,tiargmini=1∑nj=1∑m∥qij−q^(K,d,Ri,ti,Pj)∥2(opt2)
其中 q ^ ( K , d , R i , t i , P j ) \hat{\boldsymbol{q}}(\boldsymbol{K},\boldsymbol{d},\boldsymbol{R}_i,\boldsymbol{t}_i,\boldsymbol{P}_j) q^(K,d,Ri,ti,Pj)是图像i中的棋盘格角点 P j \boldsymbol{P}_j Pj的重投影像素。上式本质上是最小化重投影误差的非线性最小二乘问题,可以使用Levenberg-Marquardt优化算法求解。步骤4.求得的畸变系数可以作为优化问题的初值。
我们定义一个正交矩阵 Z = V T R T U \bold{Z}=\bold{V}^T\boldsymbol{R}^T\bold{U} Z=VTRTU,则
t r ( R T Q ) = t r ( R T U Σ V T ) = t r ( V T R T U Σ ) = t r ( Z Σ ) = ∑ i = 1 3 z i i σ i ⩽ ∑ i = 1 3 σ i \begin{aligned} {\rm tr}(\boldsymbol{R}^T\bold{Q})&={\rm tr}(\boldsymbol{R}^T\bold{U\Sigma V}^T)\\ &={\rm tr}(\bold{V}^T\boldsymbol{R}^T\bold{U\Sigma})\\ &={\rm tr}(\bold{Z}\bold{\Sigma})=\sum_{i=1}^3z_{ii}\sigma_i\leqslant\sum_{i=1}^3\sigma_i \end{aligned} tr(RTQ)=tr(RTUΣVT)=tr(VTRTUΣ)=tr(ZΣ)=i=1∑3ziiσi⩽i=1∑3σi
显然,等式成立的条件是 Z = I ⟹ R = U V T \bold{Z}=\bf{I}\implies\boldsymbol{R}=\bold{UV}^T Z=I⟹R=UVT
A Flexible New Technique for Camera Calibration
知乎-张正友标定法
内参约束(2)的几何解释
棋盘格平面上一点由世界坐标系到相机坐标系的转换关系式:
[ X c Y c Z c ] = [ r 1 r 2 t ] [ X Y 1 ] = X r 1 + Y r 2 + t \begin{bmatrix}X_c\\Y_c\\Z_c\end{bmatrix}=\begin{bmatrix}\boldsymbol{r}_1&\boldsymbol{r}_2&\boldsymbol{t}\end{bmatrix}\begin{bmatrix}X\\Y\\1\end{bmatrix}=X\boldsymbol{r}_1+Y\boldsymbol{r}_2+\boldsymbol{t} ⎣⎡XcYcZc⎦⎤=[r1r2t]⎣⎡XY1⎦⎤=Xr1+Yr2+t
则棋盘格平面在相机坐标系下是由 r 1 \boldsymbol{r}_1 r1和 r 2 \boldsymbol{r}_2 r2张成的向量空间(平面)加上一个偏移 t \boldsymbol{t} t组成。
由于 r 3 \boldsymbol{r}_3 r3与 r 1 \boldsymbol{r}_1 r1和 r 2 \boldsymbol{r}_2 r2正交,故该平面的法向量与 r 3 \boldsymbol{r}_3 r3共线
r 3 T [ X c Y c Z c ] = r 3 T ( X r 1 + Y r 2 + t ) = r 3 T t \boldsymbol{r}_3^T\begin{bmatrix}X_c\\Y_c\\Z_c\end{bmatrix}=\boldsymbol{r}_3^T(X\boldsymbol{r}_1+Y\boldsymbol{r}_2+\boldsymbol{t})=\boldsymbol{r}_3^T\boldsymbol{t} r3T⎣⎡XcYcZc⎦⎤=r3T(Xr1+Yr2+t)=r3Tt
使用齐次坐标的形式重塑平面方程:
[ r 3 r 3 T t ] T [ X c Y c Z c w ] = 0 \begin{bmatrix}\boldsymbol{r}_3\\ \boldsymbol{r}_3^T\boldsymbol{t}\end{bmatrix}^T \begin{bmatrix}X_c\\Y_c\\Z_c\\w\end{bmatrix}=0 [r3r3Tt]T⎣⎢⎢⎡XcYcZcw⎦⎥⎥⎤=0
当 w = 0 w=0 w=0时代表无穷远点,当 w = 1 w=1 w=1时代表其他。
这个平面与无穷远平面相交于一条线,并且易得 [ r 1 0 ] \begin{bmatrix}\boldsymbol{r}_1\\ 0\end{bmatrix} [r10]和 [ r 2 0 ] \begin{bmatrix}\boldsymbol{r}_2\\ 0\end{bmatrix} [r20]是相交线上的两个特殊点。相交线上的任意点都可以表示为这两点的线性组合:
p ∞ = a [ r 1 0 ] + b [ r 2 0 ] = [ a r 1 + b r 2 0 ] \bold{p}_\infty=a\begin{bmatrix}\boldsymbol{r}_1\\ 0\end{bmatrix}+b\begin{bmatrix}\boldsymbol{r}_2\\ 0\end{bmatrix}=\begin{bmatrix}a\boldsymbol{r}_1+b\boldsymbol{r}_2\\ 0\end{bmatrix} p∞=a[r10]+b[r20]=[ar1+br20] ↩︎
从矩阵 B \boldsymbol{B} B提取内参
求解出的 B \boldsymbol{B} B矩阵与尺度无关,可以乘以任意非零因子
B = λ K − T K − 1 = [ B 11 B 12 B 13 B 12 B 22 B 23 B 13 B 23 B 33 ] = λ [ 1 α 2 − γ α 2 β v 0 γ − u 0 β α 2 β − γ α 2 β γ 2 α 2 β 2 + 1 β 2 − γ ( v 0 γ − u 0 β ) α 2 β 2 − v 0 β 2 v 0 γ − u 0 β α 2 β − γ ( v 0 γ − u 0 β ) α 2 β 2 − v 0 β 2 ( v 0 γ − u 0 β ) 2 α 2 β 2 + v 0 2 β 2 + 1 ] \begin{aligned} \boldsymbol{B}&=\lambda\boldsymbol{K}^{-T}\boldsymbol{K}^{-1}=\begin{bmatrix} B_{11}&B_{12}&B_{13}\\ B_{12}&B_{22}&B_{23}\\ B_{13}&B_{23}&B_{33} \end{bmatrix} \\&=\lambda \begin{bmatrix} \dfrac{1}{\alpha ^{2}} & -\dfrac{\gamma }{\alpha ^{2}\beta } & \dfrac{v_{0}\gamma -u_{0}\beta }{\alpha ^{2}\beta } \\ -\dfrac{\gamma }{\alpha ^{2}\beta } & \dfrac{\gamma ^{2}}{\alpha ^{2}\beta ^{2}}+\dfrac{1}{\beta ^{2}} & -\dfrac{\gamma \left( v_{0}\gamma -u_0 \beta \right) }{\alpha ^{2}\beta ^{2}}-\dfrac{v_{0}}{\beta ^{2}} \\ \dfrac{v_{0}\gamma -u_{0}\beta }{\alpha ^{2}\beta } & -\dfrac{\gamma \left( v_{0}\gamma -u_0\beta \right) }{\alpha ^{2}\beta ^{2}}-\dfrac{v_{0}}{\beta ^{2}} & \dfrac{\left( v_{0}\gamma-u_0 \beta \right) ^{2}}{\alpha ^{2}\beta ^{2}}+\dfrac{v_{0}^{2}}{\beta ^{2}}+1 \end{bmatrix} \end{aligned} B=λK−TK−1=⎣⎡B11B12B13B12B22B23B13B23B33⎦⎤=λ⎣⎢⎢⎢⎢⎢⎢⎡α21−α2βγα2βv0γ−u0β−α2βγα2β2γ2+β21−α2β2γ(v0γ−u0β)−β2v0α2βv0γ−u0β−α2β2γ(v0γ−u0β)−β2v0α2β2(v0γ−u0β)2+β2v02+1⎦⎥⎥⎥⎥⎥⎥⎤
可以唯一的提取出相机内参:
v 0 = B 12 B 13 − B 11 B 23 B 11 B 22 − B 12 2 λ = B 33 − B 13 2 + v 0 ( B 12 B 13 − B 11 B 23 ) B 11 α = λ B 11 β = λ B 11 B 11 B 22 − B 12 2 γ = − B 12 α 2 β λ u 0 = γ v 0 β − B 13 α 2 λ \begin{aligned} v_{0}&=\dfrac{B _{12}B _{13}-B _{11}B_{23}}{B _{11}B_{22}-B _{12}^{2}} \\ \lambda &=B_{33}-\dfrac{B_{13}^{2}+v_{0}\left( B_{12}B_{13}-B_{11}B_{23}\right) }{B_{11}} \\ \alpha &=\sqrt{\dfrac{\lambda }{B_{11}}} \\ \beta &=\sqrt{\dfrac{\lambda B_{11}}{B_{11}B_{22}-B_{12}^{2}}}\\ \gamma&=-\dfrac{B_{12}\alpha ^{2}\beta }{\lambda }\\ u_{0}&=\dfrac{\gamma v_{0}}{\beta }-\dfrac{B_{13}\alpha ^{2}}{\lambda } \end{aligned} v0λαβγu0=B11B22−B122B12B13−B11B23=B33−B11B132+v0(B12B13−B11B23)=B11λ=B11B22−B122λB11=−λB12α2β=βγv0−λB13α2 ↩︎
由普通矩阵近似旋转矩阵
给定一个普通的 3 × 3 3\times3 3×3矩阵 Q \bold{Q} Q,求解出一个最优的旋转矩阵 R \boldsymbol{R} R来近似它。这里,最优的定义事使 R − Q \boldsymbol{R}-\bold{Q} R−Q的Frobenius范数最小:
min R ∥ R − Q ∥ F 2 s . t . R T R = I \min_{\boldsymbol{R}}\Vert\boldsymbol{R}-\bold{Q}\Vert_F^2 \quad \rm s.t.\ \boldsymbol{R}^T\boldsymbol{R}=\bf{I} Rmin∥R−Q∥F2s.t. RTR=I
因为
∥ R − Q ∥ F 2 = t r ( ( R − Q ) T ( R − Q ) ) = 3 + t r ( Q T Q ) − 2 t r ( R T Q ) \begin{aligned} \Vert\boldsymbol{R}-\bold{Q}\Vert_F^2&={\rm tr}\left((\boldsymbol{R}-\bold{Q})^T(\boldsymbol{R}-\bold{Q})\right)\\ &=3+{\rm tr}\left(\bold{Q}^T\bold{Q}\right)-2{\rm tr}(\boldsymbol{R}^T\bold{Q}) \end{aligned} ∥R−Q∥F2=tr((R−Q)T(R−Q))=3+tr(QTQ)−2tr(RTQ)
于是问题简化为最大化 t r ( R T Q ) {\rm tr}(\boldsymbol{R}^T\bold{Q}) tr(RTQ)
设 Q \bold{Q} Q的奇异值分解为:
Q = U Σ V T \bold{Q}=\bold{U}\bold{\Sigma}\bold{V}^T Q=UΣVT
其中 Σ = d i a g ( σ 1 , σ 2 , σ 3 ) \bold{\Sigma}=\rm diag(\sigma_1,\sigma_2,\sigma_3) Σ=diag(σ1,σ2,σ3),对角线元素为奇异值。 ↩︎