主体思路,先处理纯二维平面的畸变问题(此处略过),矫正图片后,再来求解相机内外参数。基本思路是求得每个标定板对应的单应矩阵,再联合优化所有标定板数据得到相机内参矩阵,再得到每个标定板对应的外参。
,则对于每个棋盘格,可以得到一个标定板平面到当前图像平面的单应矩阵Hi,实际上这个单应矩阵Hi汇总了标定板平面到相机成像平面的旋转平移以及相机内参信息。
现在,我们已知每幅标定板图的单应矩阵H
对一幅标定板图片上的标定板坐标上的一点 P = [ X , Y , 0 , 1 ] T P=[X,Y,0,1]^T P=[X,Y,0,1]T由于
(1)
A为相机内参
实际上,由于H是二维对应关系,而标定板平面Z轴对应为0,所以: H = [ h 1 , h 2 , h 3 ] = A [ r 1 , r 2 , t ] H=[h1,h2,h3]=A[r_1,r_2,t] H=[h1,h2,h3]=A[r1,r2,t],
由于R是正交矩阵,所以r1,r2正交,即r1和r2的模相同,而且点积为0,即:
r 1 T r 2 = 0 r_1^Tr_2=0 r1Tr2=0
∣ ∣ r 1 ∣ ∣ = ∣ ∣ r 2 ∣ ∣ ||r_1||=||r_2|| ∣∣r1∣∣=∣∣r2∣∣
用h1,h2,替换r1,r2,则有:
令 B = A A − 1 B=AA^{-1} B=AA−1,则可以将上述式子化简为:
B是对称矩阵,所以可以用6个元素表示B的有效元素,则上述式子又可以表示为:
因此之前由r1,r2正交得到的式子可以转化为:
将所有标定板图像都压栈到一起,最小二乘法可以求出b。
求得b,也就是求出B,也即得到内参矩阵A。
根据第一个式子转换得到:
其中:
λ = ∣ ∣ A − 1 h 1 ∣ ∣ = ∣ ∣ A − 1 h 2 ∣ ∣ \lambda=||A^{-1}h_1||=||A^{-1}h_2|| λ=∣∣A−1h1∣∣=∣∣A−1h2∣∣
就得到每个标定板平面坐标系对相机坐标系的旋转平移向量
通过以上方式得到最初的A和 R i , t i R_i,t_i Ri,ti后,考虑到观测时不可避免的噪声,所以用最小二乘方法,将所有N张图上每张图d个点的观测量用最小二乘方法解:
∑ i N ∑ j d = m i j − M ( A , R i , t i , D i ) \sum_i^N\sum_j^d = m_{ij} - M(A,R_i,t_i,D_i) i∑Nj∑d=mij−M(A,Ri,ti,Di)
其中 M ( A , R i , t i , D i ) M(A,R_i,t_i,D_i) M(A,Ri,ti,Di)为(1),即投影矩阵。
用高斯牛顿法对以上进行求解。
此处,之前的格点大小就派上用场了,比如OpenCV中认为左上角的格点为b标定板平面坐标系的原点,则其他格点的三维坐标依次是: ( j ∗ s i z e , k ∗ s i z e , 0 ) (j*size,k*size,0) (j∗size,k∗size,0)
一般情况下,我们先计算畸变双目标定(一)单目标定与矫正的基本介绍,然后再通过4的最小二乘估计内参矩阵。但正如张定友论文中[1]所介绍的,这种方法的收敛速度太小,所以他提出直接最小二乘求解以下包括径向畸变、内参和 R i , t i R_i,t_i Ri,ti在内的所有参数(他不考虑切向畸变)。其中内参和 R i , t i R_i,t_i Ri,ti的初始估计可用3部分的方法得到,而径向畸变可用普通径向畸变方法求解,或者直接令为0.
双目标定先得到在左侧标定板坐标系中各个格点位置,通过左侧相机的 R i , t i R_i,t_i Ri,ti转换到相机坐标系,再根据 R l r , t l r R_{lr},t_{lr} Rlr,tlr转换到右侧相机坐标系,并使得两侧的投影误差最小。在OpenCV的实现中,也是用高斯牛顿法的最小二乘方法来优化最后的结果。
for( i = 0; i < nimages; i++ )
{
for( j = 0; j < boardSize.height; j++ )
for( k = 0; k < boardSize.width; k++ )
objectPoints[i].push_back(Point3f(k*squareSize, j*squareSize, 0));
}
///...
double rms = stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1],
cameraMatrix[0], distCoeffs[0],
cameraMatrix[1], distCoeffs[1],
imageSize, R, T, E, F,
CALIB_FIX_ASPECT_RATIO +
CALIB_ZERO_TANGENT_DIST +
CALIB_USE_INTRINSIC_GUESS +
CALIB_SAME_FOCAL_LENGTH +
CALIB_RATIONAL_MODEL +
CALIB_FIX_K3 + CALIB_FIX_K4 + CALIB_FIX_K5,
TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 100, 1e-5) );
Zhang Z. A flexible new technique for camera calibration[J]. IEEE Transactions on pattern analysis and machine intelligence, 2000, 22(11): 1330-1334.