当前位置:   article > 正文

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

张正友标定法c++

介绍

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

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

  1. 现代CMOS工艺制造精度的保证,使得表征像素水平与竖直方向倾斜角度的skewness参数非常小,可直接设为0;
  2. 畸变参数需要非线性优化求解,一般情况下镜头畸变较小,畸变参数迭代初值设为0就能收敛。

代码实现上,调用OpenCV实现图片读取与特征点提取,手写函数实现单应、内参、外参初值估计,最后调用Ceres创建目标函数并优化求解,并与OpenCV calibrateCamera()函数进行标定结果对比。代码地址:https://github.com/zxcn/zhangzy_single_camera_calibration.git

数学原理

相机模型

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

  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\\
    [XYZ]
    =
    [r11r12r13t1r21r22r23t2r31r32r33t3]
    [XYZ1]
    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\\
    [uv1]
    =K
    [xdyd1]
    =
    [fx0cx0fycy001]
    [xdyd1]
    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 ]

[uv1]
\backsimeq
[fx0cx0fycy001]
[r11r12r13t1r21r22r23t2r31r32r33t3]
[XYZ1]
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 ]

[uv1]
\backsimeq
[fx0cx0fycy001]
[r11r12r13t1r21r22r23t2r31r32r33t3]
[XY01]
\\
[uv1]
\backsimeq
[fx0cx0fycy001]
[r11r12t1r21r22t2r31r32t3]
[XY1]
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=
[h1h2h3]
=
[h11h12h13h21h22h23h31h32h33]
=
[fx0cx0fycy001]
[r11r12t1r21r22t2r31r32t3]
=K
[r1r2t]
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)
[XY1000uXuYu000XY1vXvYv]
[h11h12h13h21h22h23h31h32h33]
=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求解的总结。

A x = 0 Ax=0 Ax=0的求解
欠定

非零解的数量取决于矩阵 A A A的秩,若 x x x维度为 n n n,非零解的个数为 n − R a n k ( A ) n-Rank(A) nRank(A)

超定

超定情况下求解满足单位长度约束下的最小二乘问题
min ⁡ ∣ ∣ A x ∣ ∣ 2 2 subject to  ∣ ∣ x ∣ ∣ 2 2 = 1 \min ||Ax||^2_2\\\text{subject to }||x||^2_2=1 min∣∣Ax22subject to ∣∣x22=1构造拉格朗日函数 min ⁡ L ( x , λ ) = ∣ ∣ A x ∣ ∣ 2 2 + λ ( 1 − ∣ ∣ x ∣ ∣ 2 2 ) \min L(x,\lambda)=||Ax||^2_2+\lambda(1-||x||^2_2) minL(x,λ)=∣∣Ax22+λ(1∣∣x22)目标函数 L L L关于 x x x λ \lambda λ的偏导数为零 { ∂ L ∂ x = A T A x − λ x = 0 ∂ L ∂ λ = 1 − ∣ ∣ x ∣ ∣ 2 2 = 0

{Lx=ATAxλx=0Lλ=1||x||22=0
{xL=ATAxλx=0λL=1∣∣x22=0可得 A T A x = λ x A^TAx=\lambda x ATAx=λx,解是 A T A A^TA ATA的单位特征向量。当 x x x A T A A^TA ATA单位特征向量时,有 ∣ ∣ A x ∣ ∣ 2 2 = x T A T A x = x T λ x = λ ||Ax||^2_2=x^TA^TAx=x^T\lambda x=\lambda ∣∣Ax22=xTATAx=xTλx=λ。因此,要想使 ∣ ∣ A x ∣ ∣ 2 2 ||Ax||^2_2 ∣∣Ax22最小, x x x应取 A T A A^TA ATA最小特征值对应的单位特征向量,或者 A A A矩阵的SVD分解最小奇异值对应的 V V V矩阵的列向量(或者 V T V^T VT的行向量)。

在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=

[fx0cx0fycy001]
[r11r12t1r21r22t2r31r32t3]
λ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)

[X¯Y¯1]
= N_P
[XY1]
=
[1Xstd0XmeanXstd01YstdYmeanYstd001]
[XY1]
\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
[X¯Y¯1000u¯X¯u¯Y¯u¯000X¯Y¯1v¯X¯v¯Y¯v¯]
[h11h12h13h21h22h23h31h32h33]
=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

[B110B130B22B23B13B23B33]
=
[1fx20cxfx201fy2cyfy2cxfx2cyfy21+cx2fx2+cy2fy2]
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)
[h11h12h21h22h31h12+h11h32h31h22+h21h32h31h32h112h122h212h2222h11h312h12h322h21h312h22h32h312h322]
[B11B22B13B23B33]
=0\tag{4}
[h11h12h112h122h21h22h212h222h31h12+h11h322h11h312h12h32h31h22+h21h322h21h312h22h32h31h32h312h322] B11B22B13B23B33 =0(4)
同样是求解 A x = 0 Ax=0 Ax=0问题,解与内参之间存在未知尺度 η \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 ]
[B110B130B22B23B13B23B33]
=\eta
[1fx20cxfx201fy2cyfy2cxfx2cyfy21+cx2fx2+cy2fy2]
B110B130B22B23B13B23B33 =η 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)
{ηfx2=B11ηfy2=B22ηcxfx2=B13ηcyfy2=B23η(1+cx2fx2+cy2fy2)=B33
\Harr
{cx=B13B11cy=B23B22η=B33B132B11B232B22fx=ηB11fy=ηB22
\tag{5}
fx2η=B11fy2η=B22ηfx2cx=B13ηfy2cy=B23η(1+fx2cx2+fy2cy2)=B33 cx=B11B13cy=B22B23η=B33B11B132B22B232fx=B11η fy=B22η (5)
OpenCV相机标定程序使用了另一种内参估计方法,在函数cvInitIntrinsicParams2D()中,假定主点位于图像中间,即 c x , c y c_x,c_y cx,cy已知,仅求解 f x , f y f_x,f_y fx,fy。详细可参考博客:https://blog.csdn.net/weixin_43956164/article/details/127408933

外参估计

得到内参之后,因 λ [ h 1 h 2 h 3 ] = K [ r 1 r 2 t ] \lambda

[h1h2h3]
=K
[r1r2t]
λ[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=

[r1r2r3]
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

程序实现

代码比较简单,为了方便阅读,没有用类而是用几个函数实现了张正友单相机标定。调用OpenCV实现图片读取与特征点提取,手写函数实现单应、内参、外参初值估计,最后调用Ceres创建目标函数并优化求解,和OpenCV calibrateCamera()对比了结果和重投影误差。
程序依赖OpenCV和Ceres,Windows下可使用微软的包管理软件VCPKG安装。Ceres的安装可以参考【Windows通过VCPKG配置Ceres环境】
代码地址:https://github.com/zxcn/zhangzy_single_camera_calibration.git
程序流程:读取图片–>提取角点–>计算单应–>估计内参–>估计外参–>非线性优化–>计算重投影误差程序框图
结果对比:
Ceres优化和OpenCV标定结果对比

参考文献

【1】Chapter 2 CAMERA CALIBRATION Zhengyou Zhang
【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.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/520970
推荐阅读
相关标签
  

闽ICP备14008679号