您好,欢迎来到爱玩科技网。
搜索
您的当前位置:首页【张正友标定法解析与C++代码实现】

【张正友标定法解析与C++代码实现】

来源:爱玩科技网

介绍

张正友标定法是一种求解相机内外参的标定方法。相比使用三维标定板的标定方法,张正友标定法使用二维平面标定板,优点是标定板制作成本低,应用更为灵活,但缺点是需要拍摄多张不同姿态的标定板图像(PS:也可以在一张图片中同时拍摄多个不同姿态的标定板),效率上总体不如三维标定板标定方法。

本文介绍张正友标定法的数学原理,并给出代码实现。数学原理方面,介绍了相机模型,对单应矩阵、内参矩阵、外参矩阵的求解做了详细解释,但内容上为了更为简洁实用,省略skewness参数以及畸变参数的估计,原因如下:

数学原理

相机模型

相机模型表征了三维世界坐标系或物体坐标系中的点,如何经过镜头和图像传感器成像,映射为二维像素坐标的过程。相机模型的关键参数是内参和外参,内参包括主点、焦距、畸变参数,外参包括每幅图像中标定板在相机坐标系的旋转和平移参数。计算机视觉中常用的相机模型是“针孔+畸变”相机模型。,本节仅简要介绍其中的重点内容。

  1. 世界/物体坐标系中的点 P = [ X , Y , Z ] T P=[X,Y,Z]^T P=[X,Y,Z]T经过旋转平移变换后成为相机坐标系中的点 P ′ = [ X ′ , Y ′ , Z ′ ] T P'=[X',Y',Z']^T P=[X,Y,Z]T,表示为: P ′ = R P + t [ X ′ Y ′ Z ′ ] = [ r 11 r 12 r 13 t 1 r 21 r 22 r 23 t 2 r 31 r 32 r 33 t 3 ] [ X Y Z 1 ] P'=RP+t\\\begin{bmatrix}X'\\Y'\\Z'\end{bmatrix}=\begin{bmatrix}r_{11}&r_{12}&r_{13}&t_1\\r_{21}&r_{22}&r_{23}&t_2\\r_{31}&r_{32}&r_{33}&t_3\end{bmatrix}\begin{bmatrix}X\\Y\\Z\\1\end{bmatrix} P=RP+t XYZ = r11r21r31r12r22r32r13r23r33t1t2t3 XYZ1 其中, R R R为旋转矩阵, t t t为平移矩阵。
  2. P ′ = [ X ′ , Y ′ , Z ′ ] T P'=[X',Y',Z']^T P=[X,Y,Z]T经过沿相机坐标系 Z Z Z的透视投影后,成为归一化坐标系中的二维点 [ x , y ] T [x,y]^T [x,y]T,表示为: x = X ′ Z ′ y = Y ′ Z ′ x = \frac{X'}{Z'}\\y = \frac{Y'}{Z'} x=ZXy=ZY
  3. 由于畸变的存在,点 [ x , y ] T [x,y]^T [x,y]T偏移至点 [ x d , y d ] T [x_d,y_d]^T [xd,yd]T,这一过程由畸变模型描述。这里使用Brown-Conrady模型描述,表示为: r 2 = x 2 + y 2 x d = 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 d = 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 r^2=x^2+y^2\\x_d=x(1+k_1r^2+k_2r^4+k_3r^6)+2p_1xy+p_2(r^2+2x^2)\\y_d=y(1+k_1r^2+k_2r^4+k_3r^6)+p_1(r^2+2y^2)+2p_2xy r2=x2+y2xd=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)yd=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy其中, k 1 , k 2 , k 3 k_1,k_2,k_3 k1,k2,k3为描述径向畸变的畸变系数, p 1 , p 2 p_1,p_2 p1,p2为描述切向畸变的畸变系数。
  4. [ x d , y d ] T [x_d,y_d]^T [xd,yd]T经过像素采样,成为像素坐标系中的点 U = [ u , v ] T U=[u,v]^T U=[u,v]T,表示为: u = f x x d + c x v = f y y d + c y [ u v 1 ] = K [ x d y d 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ x d y d 1 ] u=f_xx_d+c_x\\v=f_yy_d+c_y\\\begin{bmatrix}u\\v\\1\end{bmatrix}=K\begin{bmatrix}x_d\\y_d\\1\end{bmatrix}=\begin{bmatrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{bmatrix}\begin{bmatrix}x_d\\y_d\\1\end{bmatrix} u=fxxd+cxv=fyyd+cy uv1 =K xdyd1 = fx000fy0cxcy1 xdyd1 其中, K K K为内参矩阵, f x , f y f_x,f_y fx,fy为焦距(物理意义为镜头焦距与像素大小的比值), c x , c y c_x,c_y cx,cy为主点(光轴与图像传感器交点的像素坐标)。

相机标定

相机标定的目的是找到最小化如下目标函数的相机参数 min ⁡ K , D , R i , t i ∑ i ∑ j ( U i , j − cam ( R i P i , j + t i ) ) 2 \min_{K,D,R_i,t_i} \sum_i\sum_j(U_{i,j}-\text{cam}(R_iP_{i,j}+t_i))^2 K,D,Ri,timinij(Ui,jcam(RiPi,j+ti))2其中, i i i表示标定板姿态的索引, j j j表示标定板中特征点的索引, cam ( ) \text{cam}() cam()表示相机对相机坐标系中的3D点的成像过程,包含了透视投影、畸变模型、像素采样。

相机标定过程中的已知量为:

  1. 特征点在物体坐标系的坐标 P = [ X , Y , Z ] T P=[X,Y,Z]^T P=[X,Y,Z]T
  2. 通过特征点检测方法获得的标定板特征点在像素坐标系中的坐标 U = [ u , v ] T U=[u,v]^T U=[u,v]T

需要求解的未知量为:

  1. 相机内参矩阵 K K K:包含主点 c x , c y c_x,c_y cx,cy、焦距 f x , f y f_x,f_y fx,fy
  2. 畸变参数 D D D:包含 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
  3. 外参,标定板在每幅图像中的位姿 R i , t i R_i,t_i Ri,ti

目标函数需要通过迭代进行求解,常用的迭代方法是L-M法,但由于畸变函数比较复杂,雅可比矩阵解析形式太复杂,不好实现,但好在有很多非线性优化库提供了自动求导和数值求导方法,本文的程序调用Ceres实现目标函数构造与求解。
同时,迭代需要提供好的初值参数才能正确收敛。通常采用的方法是在忽略畸变的情况下使用解析的方法求解内参(主点 c x , c y c_x,c_y cx,cy、焦距 f x , f y f_x,f_y fx,fy)和外参( R i , t i R_i,t_i Ri,ti),以此为初值进行迭代优化。根据标定板特征点的维度(在三维空间中、在二维平面上、在一维线上),有几类不同的解析求解方法【1】。本文介绍的是张正友提出的基于二维平面标定板的解析求解方法【2,3】。

单应、内参、外参初值估计

单应矩阵计算

无畸变情况下,相机模型表示为: [ u v 1 ] ⋍ [ f x 0 c x 0 f y c y 0 0 1 ] [ r 11 r 12 r 13 t 1 r 21 r 22 r 23 t 2 r 31 r 32 r 33 t 3 ] [ X Y Z 1 ] \begin{bmatrix}u\\v\\1\end{bmatrix}\backsimeq\begin{bmatrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{bmatrix}\begin{bmatrix}r_{11}&r_{12}&r_{13}&t_1\\r_{21}&r_{22}&r_{23}&t_2\\r_{31}&r_{32}&r_{33}&t_3\end{bmatrix}\begin{bmatrix}X\\Y\\Z\\1\end{bmatrix} uv1 fx000fy0cxcy1 r11r21r31r12r22r32r13r23r33t1t2t3 XYZ1 其中, ⋍ \backsimeq 表示经过透视投影之后的相等,即左侧向量等于右侧向量除以其最后一个元素。

假定标定平面位于物体坐标系中 Z = 0 Z=0 Z=0的平面上,对上述公式进行简化,得 [ u v 1 ] ⋍ [ f x 0 c x 0 f y c y 0 0 1 ] [ r 11 r 12 r 13 t 1 r 21 r 22 r 23 t 2 r 31 r 32 r 33 t 3 ] [ X Y 0 1 ] [ u v 1 ] ⋍ [ f x 0 c x 0 f y c y 0 0 1 ] [ r 11 r 12 t 1 r 21 r 22 t 2 r 31 r 32 t 3 ] [ X Y 1 ] \begin{bmatrix}u\\v\\1\end{bmatrix}\backsimeq\begin{bmatrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{bmatrix}\begin{bmatrix}r_{11}&r_{12}&r_{13}&t_1\\r_{21}&r_{22}&r_{23}&t_2\\r_{31}&r_{32}&r_{33}&t_3\end{bmatrix}\begin{bmatrix}X\\Y\\0\\1\end{bmatrix} \\\begin{bmatrix}u\\v\\1\end{bmatrix}\backsimeq\begin{bmatrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{bmatrix}\begin{bmatrix}r_{11}&r_{12}&t_1\\r_{21}&r_{22}&t_2\\r_{31}&r_{32}&t_3\end{bmatrix}\begin{bmatrix}X\\Y\\1\end{bmatrix} uv1 fx000fy0cxcy1 r11r21r31r12r22r32r13r23r33t1t2t3 XY01 uv1 fx000fy0cxcy1 r11r21r31r12r22r32t1t2t3 XY1 定义矩阵 h h h,表示为 h = [ h 1 h 2 h 3 ] = [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ r 11 r 12 t 1 r 21 r 22 t 2 r 31 r 32 t 3 ] = K [ r 1 r 2 t ] h=\begin{bmatrix}h_1&h_2&h_3\end{bmatrix}=\begin{bmatrix}h_{11}&h_{12}&h_{13}\\h_{21}&h_{22}&h_{23}\\h_{31}&h_{32}&h_{33}\end{bmatrix}=\begin{bmatrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{bmatrix}\begin{bmatrix}r_{11}&r_{12}&t_1\\r_{21}&r_{22}&t_2\\r_{31}&r_{32}&t_3\end{bmatrix}=K\begin{bmatrix}r_1&r_2&t\end{bmatrix} h=[h1h2h3]= h11h21h31h12h22h32h13h23h33 = fx000fy0cxcy1 r11r21r31r12r22r32t1t2t3 =K[r1r2t]这个矩阵表示了物体平面上的点,经过透视变换,投影到图像传感器平面的坐标,称为单应矩阵。有以下等式成立
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 1 = h 31 X + h 32 Y + h 33 h 31 X + h 32 Y + h 33 u = \frac{h_{11}X+h_{12}Y+h_{13}}{h_{31}X+h_{32}Y+h_{33}}\\ v = \frac{h_{21}X+h_{22}Y+h_{23}}{h_{31}X+h_{32}Y+h_{33}}\\ 1 = \frac{h_{31}X+h_{32}Y+h_{33}}{h_{31}X+h_{32}Y+h_{33}} u=h31X+h32Y+h33h11X+h12Y+h13v=h31X+h32Y+h33h21X+h22Y+h231=h31X+h32Y+h33h31X+h32Y+h33
对前两个等式进行变换,可得 h 11 X + h 12 Y + h 13 − u ( h 31 X + h 32 Y + h 33 ) = 0 h 21 X + h 22 Y + h 23 − v ( h 31 X + h 32 Y + h 33 ) = 0 h_{11}X+h_{12}Y+h_{13}-u(h_{31}X+h_{32}Y+h_{33})=0\\h_{21}X+h_{22}Y+h_{23}-v(h_{31}X+h_{32}Y+h_{33})=0 h11X+h12Y+h13u(h31X+h32Y+h33)=0h21X+h22Y+h23v(h31X+h32Y+h33)=0写成矩阵形式为 [ X Y 1 0 0 0 − u X − u Y − u 0 0 0 X Y 1 − v X − v Y − v ] [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] = 0 (1) \begin{bmatrix}X&Y&1&0&0&0&-uX&-uY&-u\\0&0&0&X&Y&1&-vX&-vY&-v\\\end{bmatrix}\begin{bmatrix}h_{11}\\h_{12}\\h_{13}\\h_{21}\\h_{22}\\h_{23}\\h_{31}\\h_{32}\\h_{33}\\\end{bmatrix}=0\tag{1} [X0Y0100X0Y01uXvXuYvYuv] h11h12h13h21h22h23h31h32h33 =0(1)
虽然 h h h有九个未知数,但矩阵元素乘以任意非零常数后,等式仍然成立,因此 h h h的自由度实际只有8。只要找到任意三点不共线的四个点,提供八组约束方程就能求解,实际标定板的特征点数更多,多出来的约束可以用最小二乘法求解。这里求解的是 A x = 0 Ax=0 Ax=0问题的最小二乘解,目标函数为 min ⁡ ∣ ∣ A x ∣ ∣ 2 2 \min ||Ax||^2_2 min∣∣Ax22,求解时需固定 x x x的尺度,满足 ∣ ∣ x ∣ ∣ 2 2 = 1 ||x||^2_2=1 ∣∣x22=1,否则 x x x模长越接近0,目标函数越小,得不到有效解。下面给出了有关 A x = 0 Ax=0 Ax=0求解的总结。

在OpenCV里,可以使用函数SVD::solveZ得到 A x = 0 Ax=0 Ax=0满足 ∣ ∣ x ∣ ∣ 2 2 = 1 ||x||^2_2=1 ∣∣x22=1的解。注意这里求解得到的单应矩阵与内参矩阵和旋转平移矩阵的乘积差一个未知的尺度参数 λ \lambda λ,表示为
λ h = [ f x 0 c x 0 f y c y 0 0 1 ] [ r 11 r 12 t 1 r 21 r 22 t 2 r 31 r 32 t 3 ] \lambda h=\begin{bmatrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{bmatrix}\begin{bmatrix}r_{11}&r_{12}&t_1\\r_{21}&r_{22}&t_2\\r_{31}&r_{32}&t_3\end{bmatrix} λh= fx000fy0cxcy1 r11r21r31r12r22r32t1t2t3 由于旋转平移矩阵的特殊约束,这个未知尺度 λ \lambda λ后续可以被求出来。

归一化处理

在求解单应矩阵时,对 [ X , Y , 1 ] T [X,Y,1]^T [X,Y,1]T [ u , v , 1 ] T [u,v,1]^T [u,v,1]T进行归一化处理可提高单应矩阵 h h h求解的稳定性。对 [ X , Y , 1 ] T [X,Y,1]^T [X,Y,1]T的归一化处理表示如下
[ X ˉ Y ˉ 1 ] = N P [ X Y 1 ] = [ 1 X std 0 − X mean X std 0 1 Y std − Y mean Y std 0 0 1 ] [ X Y 1 ] (2) \begin{bmatrix}\bar{X}\\\bar{Y}\\1\end{bmatrix} = N_P\begin{bmatrix}{X}\\{Y}\\1\end{bmatrix}= \begin{bmatrix} \frac{1}{X_\text{std}}&0&-\frac{X_\text{mean}}{X_\text{std}}\\ 0&\frac{1}{Y_\text{std}}&-\frac{Y_\text{mean}}{Y_\text{std}}\\0&0&1 \end{bmatrix} \begin{bmatrix}{X}\\{Y}\\1\end{bmatrix}\tag{2} XˉYˉ1 =NP XY1 = Xstd1000Ystd10XstdXmeanYstdYmean1 XY1 (2)得到归一化矩阵 N P N_P NP和归一化的坐标 [ X ˉ , Y ˉ , 1 ] T [\bar{X},\bar{Y},1]^T [Xˉ,Yˉ,1]T,其中下标 mean , std \text{mean},\text{std} mean,std表示均值和标准差。同理,得到 [ u , v , 1 ] T [u,v,1]^T [u,v,1]T的归一化矩阵 N U N_U NU和归一化的坐标 [ u ˉ , v ˉ , 1 ] T [\bar{u},\bar{v},1]^T [uˉ,vˉ,1]T
带入归一化的坐标,求解单应矩阵 h ′ h' h
[ X ˉ Y ˉ 1 0 0 0 − u ˉ X ˉ − u ˉ Y ˉ − u ˉ 0 0 0 X ˉ Y ˉ 1 − v ˉ X ˉ − v ˉ Y ˉ − v ˉ ] [ h 11 ′ h 12 ′ h 13 ′ h 21 ′ h 22 ′ h 23 ′ h 31 ′ h 32 ′ h 33 ′ ] = 0 \begin{bmatrix}\bar{X}&\bar{Y}&1&0&0&0&-\bar{u}\bar{X}&-\bar{u}\bar{Y}&-\bar{u}\\0&0&0&\bar{X}&\bar{Y}&1&-\bar{v}\bar{X}&-\bar{v}\bar{Y}&-\bar{v}\\\end{bmatrix}\begin{bmatrix}h'_{11}\\h'_{12}\\h'_{13}\\h'_{21}\\h'_{22}\\h'_{23}\\h'_{31}\\h'_{32}\\h'_{33}\\\end{bmatrix}=0 [Xˉ0Yˉ0100Xˉ0Yˉ01uˉXˉvˉXˉuˉYˉvˉYˉuˉvˉ] h11h12h13h21h22h23h31h32h33 =0最后,对单应矩阵进行补偿
h = inv ( N U ) ⋅ h ′ ⋅ N P (3) h=\text{inv}(N_U)\cdot h'\cdot N_P\tag{3} h=inv(NU)hNP(3)

内参估计

求解完单应矩阵后,可以利用旋转矩阵的单位正交性从单应矩阵中恢复内参。 r 1 = λ K − 1 h 1 r 2 = λ K − 1 h 2 r 1 T r 2 = 0 r 1 T r 1 − r 2 T r 2 = 0 ⇓ h 1 T K − T K − 1 h 2 = 0 h 1 T K − T K − 1 h 1 − h 2 T K − T K − 1 h 2 = 0 r_1 = \lambda K^{-1}h_1\\r_2 = \lambda K^{-1}h_2\\r_1^Tr_2=0\\r_1^Tr_1-r_2^Tr_2=0\\\Downarrow\\h_1^TK^{-T}K^{-1}h_2=0\\h_1^TK^{-T}K^{-1}h_1-h_2^TK^{-T}K^{-1}h_2=0 r1=λK1h1r2=λK1h2r1Tr2=0r1Tr1r2Tr2=0h1TKTK1h2=0h1TKTK1h1h2TKTK1h2=0由于是两个等于0的等式,求解并不涉及未知尺度 λ \lambda λ。令 B = K − T K − 1 B=K^{-T}K^{-1} B=KTK1,则有 B = K − T K − 1 ⇔ [ B 11 0 B 13 0 B 22 B 23 B 13 B 23 B 33 ] = [ 1 f x 2 0 − c x f x 2 0 1 f y 2 − c y f y 2 − c x f x 2 − c y f y 2 1 + c x 2 f x 2 + c y 2 f y 2 ] B=K^{-T}K^{-1}\Harr\begin{bmatrix}B_{11}&0&B_{13}\\0&B_{22}&B_{23}\\B_{13}&B_{23}&B_{33}\end{bmatrix}=\begin{bmatrix}\frac{1}{f_x^2}&0&-\frac{c_x}{f_x^2}\\0&\frac{1}{f_y^2}&-\frac{c_y}{f_y^2}\\-\frac{c_x}{f_x^2}&-\frac{c_y}{f_y^2}&1+\frac{c_x^2}{f_x^2}+\frac{c_y^2}{f_y^2}\end{bmatrix} B=KTK1 B110B130B22B23B13B23B33 = fx210fx2cx0fy21fy2cyfx2cxfy2cy1+fx2cx2+fy2cy2 结合上述两个公式,整理为 A x = 0 Ax=0 Ax=0的形式,表示为: [ h 11 h 12 h 21 h 22 h 31 h 12 + h 11 h 32 h 31 h 22 + h 21 h 32 h 31 h 32 h 11 2 − h 12 2 h 21 2 − h 22 2 2 h 11 h 31 − 2 h 12 h 32 2 h 21 h 31 − 2 h 22 h 32 h 31 2 − h 32 2 ] [ B 11 B 22 B 13 B 23 B 33 ] = 0 (4) \begin{bmatrix}h_{11}h_{12}&h_{21}h_{22}&h_{31}h_{12}+h_{11}h_{32}&h_{31}h_{22}+h_{21}h_{32}&h_{31}h_{32}\\h_{11}^2-h_{12}^2&h_{21}^2-h_{22}^2&2h_{11}h_{31}-2h_{12}h_{32}&2h_{21}h_{31}-2h_{22}h_{32}&h_{31}^2-h_{32}^2\end{bmatrix}\begin{bmatrix}B_{11}\\B_{22}\\B_{13}\\B_{23}\\B_{33}\end{bmatrix}=0\tag{4} [h11h12h112h122h21h22h212h222h31h12+h11h322h11h312h12h32h31h22+h21h322h21h312h22h32h31h32h312h322] B11B22B13B23B33 =0(4)同样是求解 A x = 0 Ax=0 Ax=0问题,令解为 B ˉ i j \bar B_{ij} Bˉij,这个解与内参之间存在未知尺度 η \eta η,表示为
[ B ˉ 11 0 B ˉ 13 0 B ˉ 22 B ˉ 23 B ˉ 13 B ˉ 23 B ˉ 33 ] = η [ 1 f x 2 0 − c x f x 2 0 1 f y 2 − c y f y 2 − c x f x 2 − c y f y 2 1 + c x 2 f x 2 + c y 2 f y 2 ] \begin{bmatrix}\bar B_{11}&0&\bar B_{13}\\0&\bar B_{22}&\bar B_{23}\\\bar B_{13}&\bar B_{23}&\bar B_{33}\end{bmatrix}=\eta\begin{bmatrix}\frac{1}{f_x^2}&0&-\frac{c_x}{f_x^2}\\0&\frac{1}{f_y^2}&-\frac{c_y}{f_y^2}\\-\frac{c_x}{f_x^2}&-\frac{c_y}{f_y^2}&1+\frac{c_x^2}{f_x^2}+\frac{c_y^2}{f_y^2}\end{bmatrix} Bˉ110Bˉ130Bˉ22Bˉ23Bˉ13Bˉ23Bˉ33 =η fx210fx2cx0fy21fy2cyfx2cxfy2cy1+fx2cx2+fy2cy2 但由于内参矩阵的最后一个元素为1,可以将内参与尺度参数 η \eta η一同求出。
{ η f x 2 = B ˉ 11 η f y 2 = B ˉ 22 − η c x f x 2 = B ˉ 13 − η c y f y 2 = B ˉ 23 η ( 1 + c x 2 f x 2 + c y 2 f y 2 ) = B ˉ 33 ⇔ { c x = − B ˉ 13 B ˉ 11 c y = − B ˉ 23 B ˉ 22 η = B ˉ 33 − B ˉ 13 2 B ˉ 11 − B ˉ 23 2 B ˉ 22 f x = η B ˉ 11 f y = η B ˉ 22 (5) \begin{cases}\frac{\eta}{f_x^2}=\bar B_{11}\\\frac{\eta}{f_y^2}=\bar B_{22}\\-\eta\frac{c_x}{f_x^2}=\bar B_{13}\\ -\eta\frac{c_y}{f_y^2}=\bar B_{23}\\\eta(1+\frac{c_x^2}{f_x^2}+\frac{c_y^2}{f_y^2})=\bar B_{33}\end{cases}\Harr\begin{cases}c_x=-\frac{\bar B_{13}}{\bar B_{11}}\\ c_y=-\frac{\bar B_{23}}{\bar B_{22}}\\ \eta=\bar B_{33}-\frac{\bar B_{13}^2}{\bar B_{11}}-\frac{\bar B_{23}^2}{\bar B_{22}}\\ f_x=\sqrt{\frac{\eta}{\bar B_{11}}}\\ f_y=\sqrt{\frac{\eta}{\bar B_{22}}}\end{cases}\tag{5} fx2η=Bˉ11fy2η=Bˉ22ηfx2cx=Bˉ13ηfy2cy=Bˉ23η(1+fx2cx2+fy2cy2)=Bˉ33 cx=Bˉ11Bˉ13cy=Bˉ22Bˉ23η=Bˉ33Bˉ11Bˉ132Bˉ22Bˉ232fx=Bˉ11η fy=Bˉ22η (5)OpenCV相机标定程序使用了另一种内参估计方法,在函数cvInitIntrinsicParams2D()中,假定主点位于图像中间,即 c x , c y c_x,c_y cx,cy已知,仅求解 f x , f y f_x,f_y fx,fy。详细可参考博客:

外参估计

得到内参之后,因 λ [ h 1 h 2 h 3 ] = K [ r 1 r 2 t ] \lambda\begin{bmatrix}h_1&h_2&h_3\end{bmatrix}=K\begin{bmatrix}r_1&r_2&t\end{bmatrix} λ[h1h2h3]=K[r1r2t],易得外参
r 1 = λ K − 1 h 1 r 2 = λ K − 1 h 2 t = λ K − 1 h 3 r 3 = r 1 × r 2 (6) r_1 = \lambda K^{-1}h_1\\ r_2 = \lambda K^{-1}h_2\\ t = \lambda K^{-1}h_3\\ r_3 = r_1\times r_2\tag{6} r1=λK1h1r2=λK1h2t=λK1h3r3=r1×r2(6)其中,利用 r 1 T r 1 = r 2 T r 2 = 1 r_1^Tr_1=r_2^Tr_2=1 r1Tr1=r2Tr2=1的性质,可得 λ = 1 / ∣ ∣ K − 1 h 1 ∣ ∣ 2 = 1 / ∣ ∣ K − 1 h 2 ∣ ∣ 2 \lambda = 1/||K^{-1}h_1||_2=1/||K^{-1}h_2||_2 λ=1/∣∣K1h12=1/∣∣K1h22

这里还需要注意,单应矩阵的正负号会导致外参有两种相反的结果。但是,由于所有特征点都需要在相机前方才可以被观测到,故可以用其中一个特征点的经过外参变换后 Z Z Z值的正负号做检验。一个简单的方法是,假定标定板原点的齐次坐标 [ 0 , 0 , 0 , 1 ] T [0,0,0,1]^T [0,0,0,1]T在相机前,则有 t 3 > 0 t_3>0 t3>0,经过内参矩阵变换后,单应矩阵应满足 h 33 > 0 h_{33}>0 h33>0,因此求解单应矩阵后,可将结果直接除以 h 33 h_{33} h33做归一化,以消除另一组错误的外参。

另外,由于噪声的影响,求得的旋转矩阵 R = [ r 1 r 2 r 3 ] R=\begin{bmatrix}r_1&r_2&r_3 \end{bmatrix} R=[r1r2r3]不一定满足 R R T = I , det ⁡ ( R ) = 1 RR^T=I,\det(R)=1 RRT=I,det(R)=1,可对矩阵做如下SVD分解处理以确保 R R R满足旋转矩阵约束
[ U , Σ , V ] = SVD ( R ) R = U V T (7) [U,\Sigma,V] = \text{SVD}(R)\\R=UV^T\tag{7} [U,Σ,V]=SVD(R)R=UVT(7)证明如下:

找到矩阵 M M M最接近的旋转矩阵 R R R,定义如下优化问题 min ⁡ ∣ ∣ M − R ∣ ∣ F 2 = trace ( ( M − R ) T ( M − R ) ) subject to  R T R = I , det ⁡ ( R ) = 1 \min ||M-R||^2_F = \text{trace}((M-R)^T(M-R))\\\text{subject to }R^TR=I,\det(R)=1 min∣∣MRF2=trace((MR)T(MR))subject to RTR=I,det(R)=1使用拉格朗日乘子法,定义 L ( R , Λ ) = trace ( ( M − R ) T ( M − R ) ) + trace ( Λ ( R T R − I ) ) L(R,\Lambda)=\text{trace}((M-R)^T(M-R))+\text{trace}(\Lambda(R^TR-I)) L(R,Λ)=trace((MR)T(MR))+trace(Λ(RTRI))求偏导可得
∂ L ∂ R = − 2 ( M − R ) + R ( Λ + Λ T ) = 0 \frac{\partial L}{\partial R}=-2(M-R)+R(\Lambda+\Lambda^T)=0 RL=2(MR)+R(Λ+ΛT)=0因为 Λ = Λ T \Lambda = \Lambda^T Λ=ΛT,可得 M = R ( I + Λ ) M = R(I+\Lambda) M=R(I+Λ)注意到 M T M = ( I + Λ ) T R T R ( I + Λ ) = ( I + Λ ) 2 M^TM = (I+\Lambda)^TR^TR(I+\Lambda)=(I+\Lambda)^2 MTM=(I+Λ)TRTR(I+Λ)=(I+Λ)2故有 I + Λ = ( M T M ) 1 / 2 I+\Lambda = (M^TM)^{1/2} I+Λ=(MTM)1/2综上可得 R = M ( M T M ) − 1 / 2 R=M(M^TM)^{-1/2} R=M(MTM)1/2
定义矩阵 M M M的SVD分解,表示为 M = U Σ V T M=U\Sigma V^T M=UΣVT,则有 R = U Σ V T ( V Σ T U T U Σ V T ) − 1 / 2 = U Σ V T ( V Σ 2 V T ) − 1 / 2 = U Σ V T ( V Σ V T V Σ V T ) − 1 / 2 = U Σ V T ( V Σ V T ) − 1 = U Σ V T V − T Σ − 1 V − 1 = U V T R=U\Sigma V^T(V\Sigma^TU^TU\Sigma V^T)^{-1/2}\\=U\Sigma V^T(V\Sigma ^2V^T)^{-1/2}\\=U\Sigma V^T(V\Sigma V^TV\Sigma V^T)^{-1/2}\\=U\Sigma V^T(V\Sigma V^T)^{-1}\\=U\Sigma V^TV^{-T}\Sigma^{-1}V^{-1}\\=UV^T R=UΣVT(VΣTUTUΣVT)1/2=UΣVT(VΣ2VT)1/2=UΣVT(VΣVTVΣVT)1/2=UΣVT(VΣVT)1=UΣVTVTΣ1V1=UVT

程序实现

参考文献

【1】
【2】Zhang Z. A flexible new technique for camera calibration[J]. IEEE Transactions on pattern analysis and machine intelligence, 2000, 22(11): 1330-1334.
【3】Burger W. Zhang’s camera calibration algorithm: in-depth tutorial and implementation[J]. HGB16-05, 2016: 1-6.

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- aiwanbo.com 版权所有 赣ICP备2024042808号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务