摄像机内外参计算过程
罗海风2011-2-28
1.对内参的初始化:
涉及函数:init_intrinsic_param_fisheye.m
输入:x_1,x_2,x_3,…--角点的图像坐标,X_1,X_2,X_3,…--角点的世界坐标;
输出:所有内参,包括摄像机焦距fc,摄像机坐标系原点在图像上的坐标cc,几何畸变系数kc,斜交系数alpha_c,摄像机矩阵KK(包含以上系数)。
焦距的初始值:fc=
max(,)
_
max(,)
nx ny
f init
nx ny
π
π
⎡⎤
⎢⎥
=⎢⎥
⎢⎥
⎢⎥
⎣⎦
原点坐标的初始值设为图像中心处,即cc=
0.50.5 _
0.50.5
nx
c init
ny
-
⎡⎤
=⎢⎥
-
⎣⎦
计算内参时不考虑畸变,畸变系数初始值为零,即kc=
0 _
0 k init
⎡⎤
⎢⎥
⎢⎥
=
⎢⎥
⎢⎥
⎣⎦
不考虑摄像机坐标轴夹角非正交情况,即alpha_c=_0
alpha init=
内参数矩阵初始值
max(,)
00.50.5
max(,)
00.50.5
001
nx ny
nx
nx ny
KK ny
π
π
⎡⎤
-
⎢⎥
⎢⎥
⎢⎥
=-
⎢⎥
⎢⎥
⎢⎥
⎢⎥
⎣⎦
-------------------(1)
2.对外参的初始化:
涉及函数:comp_ext_calib_fisheye.m
功能:主要是调用compute_extrinsic_init_fisheye.m 和compute_extrinsic_refine_fisheye.m
compute_extrinsic_init_fisheye.m
输入:像点的世界坐标和图像坐标x_kk 和X_kk,以及所有内参fc,cc,kc,alpha_c; 输出:所有外参初始值,包括平移矩阵Tckk ,旋转矩阵Rckk 和旋转向量omckk
compute_extrinsic_refine_fisheye.m
输入:像点的世界坐标和图像坐标x_kk 和X_kk,最大迭代次数MaxIter 以及所有内参fc,cc,kc,alpha_c; 输出:所有外参初始值,包括平移矩阵Tckk ,旋转矩阵Rckk 和旋转向量omckk
对像点世界坐标和图像坐标进行整理(整理过程考虑到坐标变换和畸变模型,涉及normalize_pixel_fisheye .m 输入:像点图像坐标x_kk,所有内参fc,cc,kc,alpha_c;输出:标准化无畸变图像坐标xn )。
坐标变换首先按照原点坐标进行线性映射,转换成以焦距为单位:
111
222___x kk cc fc x distort x kk cc fc -⎡⎤⎢⎥⎢
⎥=-⎢⎥⎢⎥⎣⎦
然后校正相机平面和图像平面不平行带来的误差:
122_____x distrot alpha c x distrot x distort x distrot -⨯⎡⎤
=⎢⎥⎣⎦
最后进行畸变补偿:(调用函数comp_fisheye_distortion.m 输入:畸变的像点图像坐标xd ,畸变系数k ;
输出:
无畸变的像点图像坐标x )
xd 是畸变后的像素坐标,令__theta d theta theta d ==
进入循环20次的补偿迭代,每次循环中有
12
24682468
1121314112223242__11theta d theta d theta k theta k theta k theta k theta k theta k theta k theta k theta ⎡⎤=⎢⎥++++++++⎣⎦
,其中k 为畸变系数。
本程序中,只考虑径向畸变不考虑切向畸变,k 虽然是5x1矢量,但是
最后一位即切向畸变系数没有使用。
然后有1212tan()tan()__theta theta scaling theta d theta d ⎡⎤
=⎢
⎥⎣⎦
111
1221211
2222Np Np Np Np xd scaling xd scaling xd scaling xn xd scaling xd scaling xd scaling ⎡⎤
=⎢
⎥⎣⎦
畸变补偿结束。
得到标准化无畸变的世界坐标X_new 和图像坐标xn 。
由这两组坐标计算得到透视投影矩阵H(计算过程见摄像机定标程序中透视投影矩阵H 的计算过程.doc ),并对H 进行整理得到
((:,1))()((:,2))H H
H norm H sc
mean norm H =
=⎡⎤⎢⎥
⎣⎦
由H 计算中间变量,有
[](:,1)1((:,1))
(:,2)(1,(:,2))1
2((:,2)(1,(:,2))1)3(1,2)123()
H u norm H H dot u H u u norm H dot u H u u cross u u RRR u u u omckk rodrigues RRR =
-=
-=== 然后得到外参矩阵中旋转矩阵()Rckk rodrigues omckk =和平移矩阵(:,3)Tckk H =。
其中函数rodrigues 作用是旋转矩阵和旋转向量的相互转换。
由于计算中所用的坐标是进行过映射调整的,所以最终得到的外参矩阵也需要调整,得: 平移矩阵_Tckk Tckk Rckk T transform =+⨯ --------------------------------(2)
_Rckk Rckk R transform =⨯
旋转向量()omckk rodrigues Rckk =
旋转矩阵()Rckk rodrigues omckk = --------------------------------(3)
其中,_(_)[,,]()
__(_)_T T
T
T
Y X kk mean X kk YY Y Y U S V svd YY R transform V T transform R transform X mean
=-=⨯===-⨯
以上得到了内参和外参的初始值。
接下来由这些参数用牛顿法进行迭代计算得到更佳的外参。
令omckk param Tckk ⎡⎤
=⎢
⎥⎣⎦
由像点世界坐标、内外参初值和投影模型计算得到:投影坐标x ,投影坐标对旋转向量的导
数dxdom ,投影坐标对平移矩阵的导数dxdT (计算过程详见project_points_fisheye.m 输入:多个点的世界坐标X,内外参数om,T,f,c,k,alpha;输出:像点图像坐标计算值xp,对各参数的导数dxpdom,dxpdT,dxpdf,dxpdc,dxpdk ) 像点坐标和计算坐标差值ex=x_kk-x
[]JJ dxdom dxdT =
2T JJ JJ JJ =
参数变动1
_2T
param innov JJ JJ ex -=
参数变更为_param param param innov =+ 则
(1:3)
(4:6)
omckk param Tckk param ==
当达到循环设定次数或者参数变更过小时终止循环,得到更精确的外参。
其中omckk 是旋转矢量,Tckk 是平移矩阵。
旋转矩阵()Rckk rodrigues omckk =
3. 全局参数优化过程 涉及函数:go_calib_optiom_iter_fisheye.m 功能:主要调用init_intrinsic_param_fisheye ,comp_ext_calib_fisheye ,extract_parameters_fishey
3.1 步骤一:通过一步梯度下降法更新所有内外参数
通过像点世界坐标X_kk ,内参omckk, Tckk ,外参f, c, k, alpha 和投影模型,计算出投影像点的图像坐标及其对各参数的导数x, dxdom, dxdT, dxdf, dxdc, dxdk, dxdalpha (具体计算见project_points_fisheye.m 见前),写入中间变量矩阵,得:
dxdf dxdc A dxdalpha dxdk ⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎣⎦
,dxdom B dxdT ⎡⎤
=⎢⎥⎣⎦。
同时,实际图像坐标和计算坐标差值为_exkk x kk x =- 对于每张图,由以上三矩阵计算得到雅克比矩阵JJ3和误差矩阵ex3,继而更新所有参数。
由于没有循环,每张图所用参数仅沿梯度方向调整一次,故称一步梯度下降法。
3.2 步骤二(可选):重新计算并更新外参
对于每一张图,重新利用外参设定函数(compute_extrinsic_init_fisheye.m, compute_extrinsic_refine_fisheye.m 见前)来更新外参。