我们首先要明白两个问题:1、相机是如何成像的?2、相机标定的目的是什么?
相机成像系统中,共包含四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。
其中, ( U , V , W ) (U, V, W) (U,V,W)为在世界坐标系下一点的物理坐标, ( u , v ) (u, v) (u,v)为该点对应的在像素坐标系下的像素坐标, Z Z Z为尺度因子。
我们将矩阵:
( 1 d X − c o t θ d X u 0 0 1 d Y s i n θ v 0 0 0 1 ) ( f 0 0 0 0 f 0 0 0 0 1 0 ) = ( f d X − f c o t θ d X u 0 0 0 f d Y s i n θ v 0 0 0 0 1 0 ) \left( \begin{matrix} \frac{1}{dX} & -\frac{cot\theta}{dX} & u_0\\ \ \\ 0 & \frac{1}{dYsin\theta} & v_0\\ \ \\ 0 & 0 & 1 \end{matrix} \right) \left( \begin{matrix} f & 0 & 0 & 0\\ \ \\ 0 & f & 0 & 0\\ \ \\ 0 & 0 & 1 & 0 \end{matrix} \right) = \left( \begin{matrix} \frac{f}{dX} & -\frac{fcot\theta}{dX} & u_0 & 0\\ \ \\ 0 & \frac{f}{dYsin\theta} & v_0 & 0\\ \ \\ 0 & 0 & 1 & 0 \end{matrix} \right) ⎝⎜⎜⎜⎜⎛dX1 0 0−dXcotθdYsinθ10u0v01⎠⎟⎟⎟⎟⎞⎝⎜⎜⎜⎜⎛f 0 00f0001000⎠⎟⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎛dXf 0 0−dXfcotθdYsinθf0u0v01000⎠⎟⎟⎟⎟⎞
称为相机的内参矩阵,内参矩阵取决于相机的内部参数。其中, f f f为焦距, d X , d Y dX, dY dX,dY分别表示 X , Y X, Y X,Y方向上的一个像素在相机感光板上的物理长度(即一个像素在感光板上是多少毫米), u 0 , v 0 u_0, v_0 u0,v0分别表示相机感光板中心在像素坐标系下的坐标, θ \theta θ表示感光板的横边和纵边之间的角度(90°表示无误差)。
我们将矩阵 ( R T 0 1 ) \left(\begin{matrix} R & T\\ 0 & 1\end{matrix}\right) (R0T1)称为相机的外参矩阵,外参矩阵取决于相机坐标系和世界坐标系的相对位置, R R R表示旋转矩阵, T T T表示平移矢量。
即单点无畸变的相机成像模型如下:
Z ( u v 1 ) = ( f d X − f c o t θ d X u 0 0 0 f d Y s i n θ v 0 0 0 0 1 0 ) ( R T 0 1 ) ( U V W 1 ) Z\left(\begin{matrix} u\\ \ \\ v\\ \ \\ 1 \end{matrix}\right) = \left(\begin{matrix} \frac{f}{dX} & -\frac{fcot\theta}{dX} & u_0 & 0\\ \ \\ 0 & \frac{f}{dYsin\theta} & v_0 & 0\\ \ \\ 0 & 0 & 1 & 0 \end{matrix}\right) \left(\begin{matrix} R & T\\ \ \\ 0 & 1\end{matrix}\right) \left(\begin{matrix} U\\ \ \\ V\\ \ \\ W\\ \ \\ 1 \end{matrix}\right) Z⎝⎜⎜⎜⎜⎛u v 1⎠⎟⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎛dXf 0 0−dXfcotθdYsinθf0u0v01000⎠⎟⎟⎟⎟⎞⎝⎛R 0T1⎠⎞⎝⎜⎜⎜⎜⎜⎜⎜⎜⎛U V W 1⎠⎟⎟⎟⎟⎟⎟⎟⎟⎞
为什么要进行相机标定呢?比如,当我们拿到一张图片,进行识别之后,得到的两部分之间的距离为多少像素,但是这多少像素究竟对应实际世界中的多少米呢?这就需要利用相机标定的结果来将像素坐标转换到物理坐标来计算距离(当然这里值得说明,仅仅利用单目相机标定的结果,是无法直接从像素坐标转化到物理坐标的,因为透视投影丢失了一个维度的坐标,所以测距其实需要双目相机)。
相机标定的目的其实很简单,我们要想对一个成像系统建模,进而进行相应的计算,所必须的参数就是相机的内参矩阵 ( f d X − f c o t θ d X u 0 0 0 f d Y s i n θ v 0 0 0 0 1 0 ) \left(\begin{matrix} \frac{f}{dX} & -\frac{fcot\theta}{dX} & u_0 & 0\\ \ \\ 0 & \frac{f}{dYsin\theta} & v_0 & 0\\ \ \\ 0 & 0 & 1 & 0 \end{matrix}\right) ⎝⎜⎜⎜⎜⎛dXf 0 0−dXfcotθdYsinθf0u0v01000⎠⎟⎟⎟⎟⎞和相机的外参矩阵 ( R T 0 1 ) \left(\begin{matrix} R & T\\ 0 & 1\end{matrix}\right) (R0T1)。因此,相机标定的第一个目的就是获得相机的内参矩阵和外参矩阵。
另外,相机拍摄的图片还存在一定的畸变,畸变包括桶形畸变和枕形畸变。
畸变模型包括径向畸变和切向畸变。
径向畸变公式(3阶)如下:
x ^ = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y ^ = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) \hat{x} = x(1 + k_1r^2 + k_2r^4 + k_3r^6) \\ \ \\ \hat{y} = y(1 + k_1r^2 + k_2r^4 + k_3r^6) x^=x(1+k1r2+k2r4+k3r6) y^=y(1+k1r2+k2r4+k3r6)
切向畸变公式如下:
x ^ = x + ( 2 p 1 y + p 2 ( r 2 + 2 x 2 ) ) y ^ = y + ( p 1 ( r 2 + 2 y 2 ) + 2 p 2 x ) \hat{x} = x + (2p_1y + p_2(r^2 + 2x^2)) \\ \ \\ \hat{y} = y + (p_1(r^2 +2y^2) + 2p_2x) x^=x+(2p1y+p2(r2+2x2)) y^=y+(p1(r2+2y2)+2p2x)
其中, ( x , y ) , ( x ^ , y ^ ) (x, y), (\hat{x}, \hat{y}) (x,y),(x^,y^)分别为理想的无畸变的归一化的图像坐标、畸变后的归一化图像坐标, r r r为图像像素点到图像中心点的距离,即 r 2 = x 2 + y 2 r^2 = x^2 + y^2 r2=x2+y2。
相机标定的第二个目的就是获得相机的畸变参数,如上式中的 k 1 , k 2 , k 3 , p 1 , p 2 k_1, k_2, k_3, p_1, p_2 k1,k2,k3,p1,p2等,进而对拍摄的图片进行去畸变处理。
张正友标定法利用如下图所示的棋盘格标定板,在得到一张标定板的图像之后,可以利用相应的图像检测算法得到每一个角点的像素坐标 ( u , v ) (u, v) (u,v)。
张正友标定法将世界坐标系固定于棋盘格上,则棋盘格上任一点的物理坐标 W = 0 W=0 W=0,由于标定板的世界坐标系是人为事先定义好的,标定板上每一个格子的大小是已知的,我们可以计算得到每一个角点在世界坐标系下的物理坐标 ( U , V , W = 0 ) (U, V, W = 0) (U,V,W=0)。
我们将利用这些信息:每一个角点的像素坐标 ( u , v ) (u, v) (u,v) 、每一个角点在世界坐标系下的物理坐标 ( U , V , W = 0 ) (U, V, W = 0) (U,V,W=0),来进行相机的标定,获得相机的内外参矩阵、畸变参数。
张正友标定法标定相机的内外参数的思路如下:
1)、求解内参矩阵与外参矩阵的积;
2)、求解内参矩阵;
3)、求解外参矩阵。
将世界坐标系固定于棋盘格上,则棋盘格上任一点的物理坐标 W = 0 W = 0 W=0。因此,原单点无畸变的成像模型可以化为下式:
Z ( u v 1 ) = ( f d X − f c o t θ d X u 0 0 f d Y s i n θ v 0 0 0 1 ) ( R 1 R 2 T ) ( U V 1 ) = A ( R 1 R 2 T ) ( U V 1 ) Z\left(\begin{matrix} u\\ \ \\ v\\ \ \\ 1 \end{matrix}\right) = \left(\begin{matrix} \frac{f}{dX} & -\frac{fcot\theta}{dX} & u_0\\ \ \\ 0 & \frac{f}{dYsin\theta} & v_0\\ \ \\ 0 & 0 & 1 \end{matrix}\right) \left(\begin{matrix} R1 & R2 & T\end{matrix}\right) \left(\begin{matrix} U\\ \ \\ V\\ \ \\ 1 \end{matrix}\right) = A\left(\begin{matrix} R1 & R2 & T\end{matrix}\right) \left(\begin{matrix} U\\ \ \\ V\\ \ \\ 1 \end{matrix}\right) Z⎝⎜⎜⎜⎜⎛u v 1⎠⎟⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎛dXf 0 0−dXfcotθdYsinθf0u0v01⎠⎟⎟⎟⎟⎞(R1R2T)⎝⎜⎜⎜⎜⎛U V 1⎠⎟⎟⎟⎟⎞=A(R1R2T)⎝⎜⎜⎜⎜⎛U V 1⎠⎟⎟⎟⎟⎞
其中, R 1 , R 2 R1, R2 R1,R2为旋转矩阵 R R R的前两列。为了简便,将内参矩阵记为 A A A。
对于不同的图片,内参矩阵 A A A为定值;对于同一张图片,内参矩阵 A A A,外参矩阵 ( R 1 R 2 T ) \left(\begin{matrix} R1 & R2 & T\end{matrix}\right) (R1R2T)为定值;对于同一张图片上的单点,内参矩阵 A A A,外参矩阵 ( R 1 R 2 T ) \left(\begin{matrix} R1 & R2 & T\end{matrix}\right) (R1R2T),尺度因子 Z Z Z为定值。
我们将 A ( R 1 R 2 T ) A\left(\begin{matrix} R1 & R2 & T\end{matrix}\right) A(R1R2T)记为矩阵 H H H, H H H即为内参矩阵和外参矩阵的积,记矩阵 H H H的三列为 ( H 1 H 2 H 3 ) \left(\begin{matrix} H1 & H2 & H3\end{matrix}\right) (H1H2H3),则有:
( u v 1 ) = 1 Z H ( U V 1 ) = 1 Z ( H 11 H 12 H 13 H 12 H 22 H 32 H 31 H 32 H 33 ) ( U V 1 ) \left(\begin{matrix} u\\ v\\ 1 \end{matrix}\right) = \frac{1}{Z}H \left(\begin{matrix} U\\ V\\ 1 \end{matrix}\right) = \frac{1}{Z} \left(\begin{matrix} H_{11} & H_{12} & H_{13}\\ H_{12} & H_{22} & H_{32}\\ H_{31} & H_{32} & H_{33} \end{matrix}\right) \left(\begin{matrix} U\\ V\\ 1 \end{matrix}\right) ⎝⎛uv1⎠⎞=Z1H⎝⎛UV1⎠⎞=Z1⎝⎛H11H12H31H12H22H32H13H32H33⎠⎞⎝⎛UV1⎠⎞
利用上式,消去尺度因子 Z Z Z,可得:
u = H 11 U + H 12 V + H 13 H 31 U + H 32 V + H 33 v = H 21 U + H 22 V + H 23 H 31 U + H 32 V + H 33 u = \frac{H_{11}U+H_{12}V+H_{13}}{H_{31}U+H_{32}V+H_{33}}\\ \ \\ v = \frac{H_{21}U+H_{22}V+H_{23}}{H_{31}U+H_{32}V+H_{33}} u=H31U+H32V+H33H11U+H12V+H13 v=H31U+H32V+H33H21U+H22V+H23
此时,尺度因子 Z Z Z已经被消去,因此上式对于同一张图片上所有的角点均成立。 ( u , v ) (u, v) (u,v)是像素坐标系下的标定板角点的坐标, ( U , V ) (U, V) (U,V)是世界坐标系下的标定板角点的坐标。通过图像识别算法,我们可以得到标定板角点的像素坐标 ( u , v ) (u, v) (u,v),又由于标定板的世界坐标系是人为定义好的,标定板上每一个格子的大小是已知的,我们可以计算得到世界坐标系下的 ( U , V ) (U, V) (U,V)。
由这里的 H H H是齐次矩阵,有8个独立未知元素。每一个标定板角点可以提供两个约束方程( u , U , V u, U, V u,U,V的对应关系, v , U , V v, U, V v,U,V的对应关系提供了两个约束方程)。因此,当一张图片上的标定板角点数量等于4时,即可求得该图片对应的矩阵H。当一张图片上的标定板角点数量大于4时,利用最小二乘法回归最佳的矩阵 H H H。
我们已知了矩阵 H = A ( R 1 R 2 T ) H = A\left(\begin{matrix} R1 & R2 & T\end{matrix}\right) H=A(R1R2T),接下来需要求解相机的内参矩阵 A A A。
我们利用 R 1 , R 2 R1, R2 R1,R2作为旋转矩阵 R R R的两列,存在单位正交的关系,即:
R 1 T R 2 = 0 R 1 T R 1 = R 2 T R 2 = 1 R1^TR2 = 0\\ \ \\ R1^TR1 = R2^TR2 = 1 R1TR2=0 R1TR1=R2TR2=1
则由 H H H和 R 1 , R 2 R1, R2 R1,R2的关系,可知:
R 1 = A − 1 H 1 R 2 = A − 1 H 2 R1 = A^{-1}H1\\ \ \\ R2 = A^{-1}H2 R1=A−1H1 R2=A−1H2
代入可得:
H 1 T A − T A − 1 H 2 = 0 H 1 T A − T A − 1 H 1 = H 2 T A − T A − 1 H 2 = 1 H1^TA^{-T}A^{-1}H2 = 0\\ \ \\ H1^TA^{-T}A^{-1}H1 = H2^TA^{-T}A^{-1}H2 = 1 H1TA−TA−1H2=0 H1TA−TA−1H1=H2TA−TA−1H2=1
另外,我们发现,上述两个约束方程中均存在矩阵 A − T A − 1 A^{-T}A^{-1} A−TA−1。因此,我们记 A − T A − 1 = B A^{-T}A^{-1} = B A−TA−1=B,则 B B B为对称阵。我们视图先求解出矩阵 B B B,通过矩阵 B B B再求解相机的内参矩阵 A A A。
同时,为了简便,我们记相机内参矩阵 A A A为:
A = ( f d X − f c o t θ d X u 0 0 0 f d Y s i n θ v 0 0 0 0 1 0 ) = [ α γ u 0 0 β v 0 0 0 1 ] A = \left(\begin{matrix} \frac{f}{dX} & -\frac{fcot\theta}{dX} & u_0 & 0\\ \ \\ 0 & \frac{f}{dYsin\theta} & v_0 & 0\\ \ \\ 0 & 0 & 1 & 0 \end{matrix}\right) = \left[\begin{matrix} \alpha & \gamma & u_0\\ \ \\ 0 & \beta & v_0\\ \ \\ 0 & 0 & 1 \end{matrix}\right] A=⎝⎜⎜⎜⎜⎛dXf 0 0−dXfcotθdYsinθf0u0v01000⎠⎟⎟⎟⎟⎞=⎣⎢⎢⎢⎢⎡α 0 0γβ0u0v01⎦⎥⎥⎥⎥⎤
则:
A − 1 = [ 1 α − γ α β γ v 0 − β u 0 α β 0 1 β − v 0 β 0 0 1 ] A^{-1} = \left[\begin{matrix} \frac{1}{\alpha} & -\frac{\gamma}{\alpha\beta} & \frac{\gamma v_0 - \beta u_0}{\alpha\beta}\\ \ \\ 0 & \frac{1}{\beta} & -\frac{v_0}{\beta}\\ \ \\ 0 & 0 & 1 \end{matrix}\right] A−1=⎣⎢⎢⎢⎢⎡α1 0 0−αβγβ10αβγv0−βu0−βv01⎦⎥⎥⎥⎥⎤
则用矩阵 A A A表示矩阵 B B B得:
B = A − T A − 1 = [ 1 α 2 − γ α 2 β γ v 0 − β u 0 α 2 β − γ α 2 β 1 β 2 + γ 2 α 2 β 2 γ ( β u 0 − γ v 0 ) α 2 β 2 − v 0 β 2 γ v 0 − β u 0 α 2 β γ ( β u 0 − γ v 0 ) α 2 β 2 − v 0 β 2 ( β u 0 − γ v 0 ) 2 α 2 β 2 + v 0 2 β 2 + 1 ] = [ B 11 B 12 B 13 B 12 B 22 B 23 B 13 B 23 B 33 ] B=A^{-T}A^{-1}= \left[\begin{matrix} \frac{1}{\alpha^2} & -\frac{\gamma}{\alpha^2\beta} & \frac{\gamma v_0 - \beta u_0}{\alpha^2\beta}\\ \ \\ -\frac{\gamma}{\alpha^2\beta} & \frac{1}{\beta^2}+\frac{\gamma^2}{\alpha^2\beta^2} & \frac{\gamma(\beta u_0-\gamma v_0)}{\alpha^2\beta^2}-\frac{v_0}{\beta^2}\\ \ \\ \frac{\gamma v_0-\beta u_0}{\alpha^2\beta} & \frac{\gamma(\beta u_0-\gamma v_0)}{\alpha^2\beta^2}-\frac{v_0}{\beta^2} & \frac{(\beta u_0-\gamma v_0)^2}{\alpha^2\beta^2}+\frac{{v_0}^2}{\beta^2}+1 \end{matrix}\right]= \left[\begin{matrix} B_{11} & B_{12} & B_{13}\\ \ \\ B_{12} & B_{22} & B_{23}\\ \ \\ B_{13} & B_{23} & B_{33} \end{matrix}\right] B=A−TA−1=⎣⎢⎢⎢⎢⎢⎡α21 −α2βγ α2βγv0−βu0−α2βγβ21+α2β2γ2α2β2γ(βu0−γv0)−β2v0α2βγv0−βu0α2β2γ(βu0−γv0)−β2v0α2β2(βu0−γv0)2+β2v02+1⎦⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡B11 B12 B13B12B22B23B13B23B33⎦⎥⎥⎥⎥⎤
注意:由于 B B B为对称阵,上式出现了两次 B 12 , B 13 , B 23 B_{12}, B_{13}, B_{23} B12,B13,B23。
这里,我们可以使用 B = A − T A − 1 B = A^{-T}A^{-1} B=A−TA−1将前面通过 R 1 , R 2 R1, R2 R1,R2单位正交得到的约束方程化为:
H 1 T B H 2 = 0 H 1 T B H 1 = H 2 T B H 2 = 1 H1^TBH2 = 0\\ \ \\ H1^TBH1 = H2^TBH2 = 1 H1TBH2=0 H1TBH1=H2TBH2=1
因此,为了求解矩阵 B B B,我们必须计算 H i T B H j H_i^TBH_j HiTBHj。则:
H i T B H j = [ H 1 i H 2 i H 3 i ] [ B 11 B 12 B 13 B 12 B 22 B 23 B 13 B 23 B 33 ] [ H 1 j H 2 j H 3 j ] = [ H 1 i H 1 j H 1 i H 2 j + H 2 i H 1 j H 2 i H 2 j H 1 i H 3 j + H 3 i H 1 j H 2 i H 3 j + H 3 i H 2 j H 3 i H 3 j ] [ B 11 B 12 B 13 B 22 B 23 B 33 ] H_i^TBH_j = \left[\begin{matrix} H_{1i} & H_{2i} & H_{3i}\\ \end{matrix}\right] \left[\begin{matrix} B_{11} & B_{12} & B_{13}\\ \ \\ B_{12} & B_{22} & B_{23}\\ \ \\ B_{13} & B_{23} & B_{33} \end{matrix}\right] \left[\begin{matrix} H_{1j}\\ \ \\ H_{2j}\\ \ \\ H_{3j} \end{matrix}\right]\\ = \left[\begin{matrix} H_{1i}H_{1j} & H_{1i}H_{2j} + H_{2i}H_{1j} & H_{2i}H_{2j} & H_{1i}H_{3j} + H_{3i}H_{1j} & H_{2i}H_{3j} + H_{3i}H_{2j} & H_{3i}H_{3j} \end{matrix}\right] \left[\begin{matrix} B_{11}\\ \ \\ B_{12}\\ \ \\ B_{13}\\ \ \\ B_{22}\\ \ \\ B_{23}\\ \ \\ B_{33} \end{matrix}\right] HiTBHj=[H1iH2iH3i]⎣⎢⎢⎢⎢⎡B11 B12 B13B12B22B23B13B23B33⎦⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎡H1j H2j H3j⎦⎥⎥⎥⎥⎤=[H1iH1jH1iH2j+H2iH1jH2iH2jH1iH3j+H3iH1jH2iH3j+H3iH2jH3iH3j]⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡B11 B12 B13 B22 B23 B33⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
上述方程看起来有点复杂,但是其实不然,我们可以记:
v i j = [ H 1 i H 1 j H 1 i H 2 j + H 2 i H 1 j H 2 i H 2 j H 1 i H 3 j + H 3 i H 1 j H 2 i H 3 j + H 3 i H 2 j H 3 i H 3 j ] T b = [ B 11 B 12 B 13 B 22 B 23 B 33 ] T v_{ij} = {\left[\begin{matrix} H_{1i}H_{1j} & H_{1i}H_{2j} + H_{2i}H_{1j} & H_{2i}H_{2j} & H_{1i}H_{3j} + H_{3i}H_{1j} & H_{2i}H_{3j} + H_{3i}H_{2j} & H_{3i}H_{3j} \end{matrix}\right]}^T\\ \ \\ b = {\left[\begin{matrix} B_{11} & B_{12} & B_{13} & B_{22} & B_{23} & B_{33} \end{matrix}\right] }^T vij=[H1iH1jH1iH2j+H2iH1jH2iH2jH1iH3j+H3iH1jH2iH3j+H3iH2jH3iH3j]T b=[B11B12B13B22B23B33]T
则上述方程化为:
H i T B H j = v i j b H_i^TBH_j = v_{ij}b HiTBHj=vijb
此时,通过 R 1 , R 2 R1, R2 R1,R2单位正交得到的约束方程可化为:
v 12 T b = 0 v 11 T b = v 22 T b = 1 v_{12}^Tb = 0\\ \ \\ v_{11}^Tb = v_{22}^Tb = 1 v12Tb=0 v11Tb=v22Tb=1
即:
[ v 12 T v 11 T − v 22 T ] b = v b = 0 \left[\begin{matrix} v_{12}^T\\ \ \\ v_{11}^T-v_{22}^T \end{matrix}\right]b=vb=0 ⎣⎡v12T v11T−v22T⎦⎤b=vb=0
其中,矩阵 v = [ v 12 T v 11 T − v 22 T ] v=\left[\begin{matrix} v_{12}^T\\ \ \\ v_{11}^T-v_{22}^T \end{matrix}\right] v=⎣⎡v12T v11T−v22T⎦⎤
由于矩阵 H H H已知,矩阵 v v v又全部由矩阵 H H H的元素构成,因此矩阵 v v v已知。
此时,我们只要求解出向量 b b b,即可得到矩阵 B B B。每张标定板图片可以提供一个 v b = 0 vb=0 vb=0的约束关系,该约束关系含有两个约束方程。但是,向量 b b b有6个未知元素。因此,单张图片提供的两个约束方程是不足以解出来向量 b b b。因此,我们只要取3张标定板照片,得到3个 v b = 0 vb=0 vb=0的约束关系,即6个方程,即可求解向量 b b b。当标定板图片的个数大于3时(事实上一般需要15到20张标定板图片),可采用最小二成拟合最佳的向量 b b b,并得到矩阵 B B B。
B = [ 1 α 2 − γ α 2 β γ v 0 − β u 0 α 2 β − γ α 2 β 1 β 2 + γ 2 α 2 β 2 γ ( β u 0 − γ v 0 ) α 2 β 2 − v 0 β 2 γ v 0 − β u 0 α 2 β γ ( β u 0 − γ v 0 ) α 2 β 2 − v 0 β 2 ( β u 0 − γ v 0 ) 2 α 2 β 2 + v 0 2 β 2 + 1 ] = [ B 11 B 12 B 13 B 12 B 22 B 23 B 13 B 23 B 33 ] B= \left[\begin{matrix} \frac{1}{\alpha^2} & -\frac{\gamma}{\alpha^2\beta} & \frac{\gamma v_0 - \beta u_0}{\alpha^2\beta}\\ \ \\ -\frac{\gamma}{\alpha^2\beta} & \frac{1}{\beta^2}+\frac{\gamma^2}{\alpha^2\beta^2} & \frac{\gamma(\beta u_0-\gamma v_0)}{\alpha^2\beta^2}-\frac{v_0}{\beta^2}\\ \ \\ \frac{\gamma v_0-\beta u_0}{\alpha^2\beta} & \frac{\gamma(\beta u_0-\gamma v_0)}{\alpha^2\beta^2}-\frac{v_0}{\beta^2} & \frac{(\beta u_0-\gamma v_0)^2}{\alpha^2\beta^2}+\frac{{v_0}^2}{\beta^2}+1 \end{matrix}\right]= \left[\begin{matrix} B_{11} & B_{12} & B_{13}\\ \ \\ B_{12} & B_{22} & B_{23}\\ \ \\ B_{13} & B_{23} & B_{33} \end{matrix}\right] B=⎣⎢⎢⎢⎢⎢⎡α21 −α2βγ α2βγv0−βu0−α2βγβ21+α2β2γ2α2β2γ(βu0−γv0)−β2v0α2βγv0−βu0α2β2γ(βu0−γv0)−β2v0α2β2(βu0−γv0)2+β2v02+1⎦⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡B11 B12 B13B12B22B23B13B23B33⎦⎥⎥⎥⎥⎤
根据矩阵 B B B的元素和相机内参 α , β , γ , u 0 , v 0 \alpha, \beta, \gamma, u_0, v_0 α,β,γ,u0,v0的对应关系(如上式),可得到:
v 0 = B 12 B 13 − B 11 B 23 B 11 B 22 − B 12 2 α = 1 B 11 β = B 11 B 11 B 22 − B 12 2 γ = − B 12 α 2 β u 0 = γ v 0 β − B 13 α 2 v_0 = \frac{B_{12}B_{13}-B_{11}B_{23}}{B_{11}B_{22}-B_{12}^2}\\ \ \\ \alpha = \sqrt{\frac{1}{B_{11}}}\\ \ \\ \beta = \sqrt{\frac{B_{11}}{B_{11}B_{22}-B_{12}^2}}\\ \ \\ \gamma = -B_{12}\alpha^2\beta\\ \ \\ u_0 = \frac{\gamma v_0}{\beta}-B_{13}\alpha^2 v0=B11B22−B122B12B13−B11B23 α=B111 β=B11B22−B122B11 γ=−B12α2β u0=βγv0−B13α2
即可求得相机的内参矩阵 A = ( f d X − f c o t θ d X u 0 0 0 f d Y s i n θ v 0 0 0 0 1 0 ) = [ α γ u 0 0 β v 0 0 0 1 ] A=\left(\begin{matrix} \frac{f}{dX} & -\frac{fcot\theta}{dX} & u_0 & 0\\ \ \\ 0 & \frac{f}{dYsin\theta} & v_0 & 0\\ \ \\ 0 & 0 & 1 & 0 \end{matrix}\right) = \left[\begin{matrix} \alpha & \gamma & u_0\\ \ \\ 0 & \beta & v_0\\ \ \\ 0 & 0 & 1 \end{matrix}\right] A=⎝⎜⎜⎜⎜⎛dXf 0 0−dXfcotθdYsinθf0u0v01000⎠⎟⎟⎟⎟⎞=⎣⎢⎢⎢⎢⎡α 0 0γβ0u0v01⎦⎥⎥⎥⎥⎤
这里再次强调一下,对于同一个相机,相机的内参矩阵取决于相机的内部参数,无论标定板和相机的位置关系是怎么样的,相机的内参矩阵不变。这也正是在第2部分“求解内参矩阵”中,我们可以利用不同的图片(标定板和相机位置关系不同)获取的矩阵 H H H,共同求解相机内参矩阵 A A A的原因。
但是,外参矩阵反映的是标定板和相机的位置关系。对于不同的图片,标定板和相机的位置关系已经改变,此时每一张图片对应的外参矩阵都是不同的。
在关系: A ( R 1 R 2 T ) = H A\left(\begin{matrix} R1 & R2 & T\end{matrix}\right) = H A(R1R2T)=H中,我们已经求解得到了矩阵 H H H(对于同一张图片相同,对于不同的图片不同)、矩阵 A A A(对于不同的图片都相同)。通过公式: ( R 1 R 2 T ) = A − 1 H \left(\begin{matrix} R1 & R2 & T\end{matrix}\right)=A^{-1}H (R1R2T)=A−1H,即可求得每一张图片对应的外参矩阵 ( R 1 R 2 T ) \left(\begin{matrix} R1 & R2 & T\end{matrix}\right) (R1R2T)。
注意,这里值得指出,完整的外参矩阵为 ( R T 0 1 ) \left(\begin{matrix} R & T\\ 0 & 1\end{matrix}\right) (R0T1)。但是,由于张正友标定板将世界坐标系的原点选取在棋盘格上,则棋盘格上任一点的物理坐标 W = 0 W=0 W=0,将旋转矩阵的 R R R的第三列 R 3 R3 R3消掉。因此, R 3 R3 R3在坐标转化中并没有作用。但是 R 3 R3 R3要使得 R R R满足旋转矩阵的性质,即列与列之间单位正交。因此可以通过向量 R 1 , R 2 R1, R2 R1,R2的叉乘,即 R 3 = R 1 × R 2 R3=R1\times R2 R3=R1×R2,计算得到 R 3 R3 R3。
此时,相机的内参矩阵和外参矩阵均已得到。
注:以上推导都是假设不存在畸变参数的情况下成立的。但是事实上,相机是存在畸变参数的,因此张正友标定法还需要通过L-M算法对于参数进行迭代优化。
张正友标定法仅仅考虑了畸变模型中影响较大的径向畸变。
径向畸变公式(2阶)如下:
x ^ = x ( 1 + k 1 r 2 + k 2 r 4 ) y ^ = y ( 1 + k 1 r 2 + k 2 r 4 ) \hat{x} = x(1 + k_1r^2 + k_2r^4) \\ \ \\ \hat{y} = y(1 + k_1r^2 + k_2r^4) x^=x(1+k1r2+k2r4) y^=y(1+k1r2+k2r4)
其中, ( x , y ) , ( x ^ , y ^ ) (x, y), (\hat{x}, \hat{y}) (x,y),(x^,y^)分别为理想的无畸变的归一化的图像坐标、畸变后的归一化图像坐标, r r r为图像像素点到图像中心点的距离,即 r 2 = x 2 + y 2 r^2 = x^2 + y^2 r2=x2+y2。
图像坐标和像素坐标的转化关系为:
( u v 1 ) = ( 1 d X − c o t θ d X u 0 0 1 d Y s i n θ v 0 0 0 1 ) ( x y 1 ) \left(\begin{matrix} u\\ v\\ 1 \end{matrix}\right) = \left(\begin{matrix} \frac{1}{dX} & -\frac{cot\theta}{dX} & u_0\\ \ \\ 0 & \frac{1}{dYsin\theta} & v_0\\ \ \\ 0 & 0 & 1 \end{matrix}\right) \left(\begin{matrix} x\\ y\\ 1 \end{matrix}\right) ⎝⎛uv1⎠⎞=⎝⎜⎜⎜⎜⎛dX1 0 0−dXcotθdYsinθ10u0v01⎠⎟⎟⎟⎟⎞⎝⎛xy1⎠⎞
其中, ( u , v ) (u, v) (u,v)为理想的无畸变的像素坐标。由于 θ \theta θ接近于90°,则上式近似为:
u = x d X + u 0 v = y d Y + v 0 u = \frac{x}{dX} + u_0\\ \ \\ v = \frac{y}{dY} + v_0 u=dXx+u0 v=dYy+v0
同理可得畸变后的像素坐标 ( u ^ , v ^ ) (\hat{u}, \hat{v}) (u^,v^)的表达式为:
u ^ = x ^ d X + u 0 v ^ = y ^ d Y + v 0 \hat{u} = \frac{\hat{x}}{dX} + u_0\\ \ \\ \hat{v} = \frac{\hat{y}}{dY} + v_0 u^=dXx^+u0 v^=dYy^+v0
代入径向畸变公式(2阶)则有:
u ^ − u 0 = ( u − u 0 ) ( 1 + k 1 r 2 + k 2 r 4 ) v ^ − v 0 = ( v − v 0 ) ( 1 + k 1 r 2 + k 2 r 4 ) \hat{u}-u_0 = (u-u_0)(1 + k_1r^2 + k_2r^4) \\ \ \\ \hat{v}-v_0 = (v-v_0)(1 + k_1r^2 + k_2r^4) u^−u0=(u−u0)(1+k1r2+k2r4) v^−v0=(v−v0)(1+k1r2+k2r4)
可化简得:
u ^ = u + ( u − u 0 ) ( k 1 r 2 + k 2 r 4 ) v ^ = v + ( v − v 0 ) ( k 1 r 2 + k 2 r 4 ) \hat{u} = u+(u-u_0)(k_1r^2 + k_2r^4) \\ \ \\ \hat{v} = v+(v-v_0)(k_1r^2 + k_2r^4) u^=u+(u−u0)(k1r2+k2r4) v^=v+(v−v0)(k1r2+k2r4)
即为:
[ ( u − u 0 ) r 2 ( u − u 0 ) r 4 ( v − v 0 ) r 2 ( v − v 0 ) r 4 ] [ k 1 k 2 ] = [ u ^ − u v ^ − v ] \left[ \begin{matrix} (u-u_0)r^2 & (u-u_0)r^4\\ \ \\ (v-v_0)r^2 & (v-v_0)r^4 \end{matrix} \right] \left[ \begin{matrix} k_1\\ \ \\ k_2 \end{matrix} \right]= \left[ \begin{matrix} \hat{u}-u\\ \ \\ \hat{v}-v \end{matrix} \right] ⎣⎡(u−u0)r2 (v−v0)r2(u−u0)r4(v−v0)r4⎦⎤⎣⎡k1 k2⎦⎤=⎣⎡u^−u v^−v⎦⎤
每一个角点,只要知道畸变后的像素坐标 ( u ^ , v ^ ) (\hat{u}, \hat{v}) (u^,v^)、理想的无畸变的像素坐标 ( u , v ) (u, v) (u,v),就可以构造两个上述等式。那么,有 m m m幅图像,每幅图像上有 n n n个标定板角点,则将得到的所有等式组合起来,可以得到 m n mn mn个未知数为 k = [ k 1 , k 2 ] T k=[k_1, k_2]^T k=[k1,k2]T的约束方程,将约束方程系数矩阵记为 D D D,等式右端非齐次项记为 d d d,可将其记为矩阵形式:
D k = d Dk=d Dk=d
之后,利用最小二乘法可得:
k = [ k 1 k 2 ] = ( D T D ) − 1 D T d k=\left[\begin{matrix}k_1\\ \ \\ k_2 \end{matrix}\right] =(D^TD)^{-1}D^Td k=⎣⎡k1 k2⎦⎤=(DTD)−1DTd
此时,相机畸变矫正参数已经标定好。
那么,如何获得畸变后的像素坐标 ( u ^ , v ^ ) (\hat{u}, \hat{v}) (u^,v^)和理想的无畸变的像素坐标 ( u , v ) (u, v) (u,v)呢?
( u ^ , v ^ ) (\hat{u}, \hat{v}) (u^,v^)可以通过识别标定板的角点获得, ( u , v ) (u, v) (u,v)可以通过如下方法近似求得。世界坐标系下的每一个角点的坐标 ( U , V ) (U, V) (U,V)是可以计算得到的,我们利用已经求得的外参矩阵 ( R 1 R 2 T ) \left(\begin{matrix} R1 & R2 & T\end{matrix}\right) (R1R2T)和内参矩阵 A A A进行反投影。
Z ( u v 1 ) = A ( R 1 R 2 T ) ( U V 1 ) = H ( U V 1 ) Z\left(\begin{matrix} u\\ \ \\ v\\ \ \\ 1 \end{matrix}\right) =A \left(\begin{matrix} R1 & R2 & T\end{matrix}\right) \left(\begin{matrix} U\\ \ \\ V\\ \ \\ 1 \end{matrix}\right) = H \left(\begin{matrix} U\\ \ \\ V\\ \ \\ 1 \end{matrix}\right) Z⎝⎜⎜⎜⎜⎛u v 1⎠⎟⎟⎟⎟⎞=A(R1R2T)⎝⎜⎜⎜⎜⎛U V 1⎠⎟⎟⎟⎟⎞=H⎝⎜⎜⎜⎜⎛U V 1⎠⎟⎟⎟⎟⎞
利用上式,消去尺度因子 Z Z Z,可得:
u = H 11 U + H 12 V + H 13 H 31 U + H 32 V + H 33 v = H 21 U + H 22 V + H 23 H 31 U + H 32 V + H 33 u = \frac{H_{11}U+H_{12}V+H_{13}}{H_{31}U+H_{32}V+H_{33}}\\ \ \\ v = \frac{H_{21}U+H_{22}V+H_{23}}{H_{31}U+H_{32}V+H_{33}} u=H31U+H32V+H33H11U+H12V+H13 v=H31U+H32V+H33H21U+H22V+H23
即可得到理想的、无畸变的像素坐标 ( u , v ) (u, v) (u,v)。当然,由于外参矩阵 ( R 1 R 2 T ) \left(\begin{matrix} R1 & R2 & T\end{matrix}\right) (R1R2T)和内参矩阵 A A A是在有畸变的情况下获得的,这里得到的像素坐标 ( u , v ) (u, v) (u,v)并不是完全理想的、无畸变的。我们的总逻辑是,在进行内参矩阵和外参矩阵的求解的时候,我们假设不存在畸变;在进行畸变系数的求解的时候,我们假设求得的内参矩阵和外参矩阵都是无误差的。最后,我们再通过L-M算法对于参数进行迭代优化。
需要指出,上述公式推导的时候以2阶径向畸变为例,但实际上更高阶的径向畸变同理,只是需要的约束方程个数更多而已。
注意:
在 D D D矩阵的构建过程中,需要用到 r 2 = x 2 + y 2 r^2=x^2+y^2 r2=x2+y2。而由于张正友标定法不能直接求出焦距 f f f,理想的无畸变的归一化的图像坐标 ( x , y ) (x, y) (x,y)无法求解,造成 D D D矩阵无法构建的问题。
以下方案可以作为一种解决方案。
世界坐标系下的标定板角点的坐标 ( U , V ) (U, V) (U,V)乘上刚体变换矩阵(外参矩阵)即可转化为相机坐标系下的标定板角点坐标 ( X , Y , Z ) (X, Y, Z) (X,Y,Z)。
( X Y Z ) = ( R 1 R 2 T ) ( U V 1 ) \left(\begin{matrix} X\\ \ \\ Y\\ \ \\ Z \end{matrix}\right) = \left(\begin{matrix} R1 & R2 & T\end{matrix}\right) \left(\begin{matrix} U\\ \ \\ V\\ \ \\ 1 \end{matrix}\right) ⎝⎜⎜⎜⎜⎛X Y Z⎠⎟⎟⎟⎟⎞=(R1R2T)⎝⎜⎜⎜⎜⎛U V 1⎠⎟⎟⎟⎟⎞
此时,相机坐标系下的标定板角点坐标 ( X , Y , Z ) (X, Y, Z) (X,Y,Z)乘上透视投影矩阵可得:
Z ( x y 1 ) = ( f 0 0 0 0 f 0 0 0 0 1 0 ) ( X Y Z ) Z\left(\begin{matrix} x\\ \ \\ y\\ \ \\ 1 \end{matrix}\right) = \left(\begin{matrix} f & 0 & 0 & 0\\ \ \\ 0 & f & 0 & 0\\ \ \\ 0 & 0 & 1 & 0 \end{matrix}\right) \left(\begin{matrix} X\\ \ \\ Y\\ \ \\ Z \end{matrix}\right) Z⎝⎜⎜⎜⎜⎛x y 1⎠⎟⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎛f 0 00f0001000⎠⎟⎟⎟⎟⎞⎝⎜⎜⎜⎜⎛X Y Z⎠⎟⎟⎟⎟⎞
其中, ( x , y ) (x, y) (x,y)为理想的无畸变的归一化的图像坐标。即为:
x = f X Z y = f Y Z x = \frac{fX}{Z}\\ \ \\ y = \frac{fY}{Z} x=ZfX y=ZfY
记 R 2 = X 2 + Y 2 R^2=X^2+Y^2 R2=X2+Y2,则有 r 2 = x 2 + y 2 = f 2 R 2 Z 2 r^2=x^2+y^2=\frac{f^2R^2}{Z^2} r2=x2+y2=Z2f2R2。
代入 D k = d Dk=d Dk=d中,可得:
[ ( u − u 0 ) R 2 Z 2 ( u − u 0 ) R 4 Z 4 ( v − v 0 ) R 2 Z 2 ( v − v 0 ) R 4 Z 4 ] [ f 2 k 1 f 4 k 2 ] = [ u ^ − u v ^ − v ] \left[ \begin{matrix} (u-u_0)\frac{R^2}{Z^2} & (u-u_0)\frac{R^4}{Z^4}\\ \ \\ (v-v_0)\frac{R^2}{Z^2} & (v-v_0)\frac{R^4}{Z^4} \end{matrix} \right] \left[ \begin{matrix} f^2k_1\\ \ \\ f^4k_2 \end{matrix} \right]= \left[ \begin{matrix} \hat{u}-u\\ \ \\ \hat{v}-v \end{matrix} \right] ⎣⎡(u−u0)Z2R2 (v−v0)Z2R2(u−u0)Z4R4(v−v0)Z4R4⎦⎤⎣⎡f2k1 f4k2⎦⎤=⎣⎡u^−u v^−v⎦⎤
我们将上式重新记为 D ′ k ′ = d D\prime k\prime=d D′k′=d,此时这个系数矩阵 D ′ D\prime D′是可以完全求出来的,利用最小二乘法求解 k ′ k\prime k′为:
k ′ = [ k 1 ′ k 2 ′ ] = [ f 2 k 1 f 2 k 2 ] = ( D ′ T D ′ ) − 1 D ′ T d k\prime = \left[ \begin{matrix} k_1\prime\\ \ \\ k_2\prime \end{matrix} \right] = \left[ \begin{matrix} f^2k_1\\ \ \\ f^2k_2 \end{matrix} \right] = (D\prime^TD\prime)^{-1}D\prime^Td k′=⎣⎡k1′ k2′⎦⎤=⎣⎡f2k1 f2k2⎦⎤=(D′TD′)−1D′Td
这里解得的 k ′ k\prime k′虽然不是真正的畸变系数,但是由于焦距 f f f是定值,因此 k ′ k\prime k′也是定值,当求得 k ′ k\prime k′之后,可以将畸变模型化为:
u ^ − u 0 = ( u − u 0 ) ( 1 + k 1 ′ R 2 Z 2 + k 2 ′ R 4 Z 4 ) v ^ − v 0 = ( v − v 0 ) ( 1 + k 1 ′ R 2 Z 2 + k 2 ′ R 4 Z 4 ) \hat{u}-u_0 = (u-u_0)(1+k_1\prime\frac{R^2}{Z^2}+k_2\prime\frac{R^4}{Z^4})\\ \ \\ \hat{v}-v_0 = (v-v_0)(1+k_1\prime\frac{R^2}{Z^2}+k_2\prime\frac{R^4}{Z^4}) u^−u0=(u−u0)(1+k1′Z2R2+k2′Z4R4) v^−v0=(v−v0)(1+k1′Z2R2+k2′Z4R4)
此时可以直接在像素坐标系下对畸变参数进行矫正。
从上述推导过程就可以看出,张正友标定法是有很多近似的,所以仅仅利用上述的过程进行标定误差肯定是很大的。所以张正友标定法还利用L-M(Levenberg-Marquardt)算法对参数进行了优化。
准备一个张正友标定法的棋盘格,棋盘格大小已知,用相机对其进行不同角度的拍摄,得到一组图像;
对图像中的特征点如标定板角点进行检测,得到标定板角点的像素坐标值,根据已知的棋盘格大小和世界坐标系原点,计算得到标定板角点的物理坐标值;
求解内参矩阵与外参矩阵;
根据物理坐标值和像素坐标值的关系,求出 H H H矩阵,进而构造 v v v矩阵,求解 B B B矩阵,利用 B B B矩阵求解相机内参矩阵 A A A,最后求解每张图片对应的相机外参矩阵 ( R T 0 1 ) \left(\begin{matrix} R & T\\ 0 & 1\end{matrix}\right) (R0T1);
求解畸变参数;
利用 u ^ , u , v ^ , v \hat{u}, u, \hat{v}, v u^,u,v^,v构造 D D D矩阵,计算径向畸变参数;
利用L-M(Levenberg-Marquardt)算法对上述参数进行优化。
python基于opencv的源代码:
Calibration_ZhangZhengyou_Method