在这篇博文中,我们来了解一下立体标定的过程。双目相机各自经过相机标定后,该如何把两个相机统一起来,获得物体三维信息呢?
那么在双目立体视觉中,通过把左右相机平面旋转到一个平面内,且行对齐,旋转后的左右相机平面具有相同的焦距f,且具有相同的v0;且要最大化左右相机公共视场(向中心点移动),需要计算一下从未校正的图像中心点到校正后的位置所在;这样就把所有要求的特性全部统一在内参矩阵中了,结合基线建立起的立体三角相似关系,通过获取两者对应点的视差获得三维点云信息。
下面我们就来了解一下,立体标定具体所要做的工作。
一、左右图像共面且行对准
统一坐标系—>共面—>行对准
如下所要做的,就是要把分属左右相机坐标系中的量,经过世界坐标系中间量统一到右相机坐标系中;
R12=Rr∗RlT\ R_{12}= R_r* R_l^\mathrm{T} \,R12=Rr∗RlT
T12=Tr−R12∗Tl\ T_{12}= T_r-R_{12}* T_l \,T12=Tr−R12∗Tl
那么N个标定平面就有N个旋转平移参数,分别执行下述过程,然后取平均就能相对精准得到从左相机到右相机的旋转矩阵R12\ R_{12} \,R12,平移矩阵T12\ T_{12} \,T12。其中,Rr\ R_{r} \,Rr为右摄像头经过张氏标定得到的相对标定物的旋转矩阵,Tr\ T_{r} \,Tr为右摄像头通过张氏标定得到的相对标定物的平移向量。Rl\ R_{l} \,Rl为左摄像头经过张氏标定得到的相对相同标定物的旋转矩阵,Tl\ T_{l} \,Tl为左摄像头经过张氏标定得到的相对相同标定物的平移向量。
如下所要做的,首先把左右像素平面旋转到共面,所用的操作就是让左右像素平面各自正反向旋转R12\ R_{12}\,R12的一半;
rl=R1212\ r_l= R_{12}^\mathrm{\frac{1}{2}} \,rl=R1221
rr=R12−12\ r_r= R_{12}^\mathrm{-\frac{1}{2}}\,rr=R12−21
其中,rl\ r_l \,rl为左摄像机旋转到共面时的旋转矩阵,rr\ r_r \,rr为右摄像机旋转到共面时的旋转矩阵。
然后让左右像素平面极线旋转到行对齐,建立以垂直极线与[1;0;0]的法向量,旋转角度为极线与[1;0;0]的夹角的旋转矩阵;然后两矩阵相乘,就到了共面且行对准的目的;
t=Rr∗T12\ t = R_r*T_{12}\,t=Rr∗T12
ww=t×[1;0;0]\ ww = t \times[1; 0; 0]\,ww=t×[1;0;0]
ww=acos(∣t⋅[1;0;0]∣norm(t))∗ww\ ww = acos(\frac{| t \cdot [1;0;0]|}{norm(t)})*ww\,ww=acos(norm(t)∣t⋅[1;0;0]∣)∗ww
R2=Rod(ww)\ R_2 = Rod(ww)\,R2=Rod(ww)
rl2=R2∗Rl\ r_{l2}= R_2*R_l \,rl2=R2∗Rl
rr2=R2∗Rr\ r_{r2}= R_2*R_r\,rr2=R2∗Rr
其中,t\ t \,t为旋转到共面后O1到O2的平移矩阵,也表示着极线的方向。ww\ ww \,ww为垂直极线与[1;0;0]的法向量,长度是两者之间的角度。rl2\ r_{l2} \,rl2为左摄像机达到共面行对准时的旋转矩阵,rr2\ r_{r2} \,rr2为右摄像机达到共面行对准时的旋转矩阵。
二、使得最大成像区域
放大率一致—>图像向中心位移
上一步操作主要是在相机坐标系内,利用旋转平移矩阵达到左右相机共面且行对准;
对应视差的确定是在像素坐标系内,那么对此就涉及到了焦距,像素中心点位置等参数(如果默认倾斜系数存在,那么也是一个不同的参数量);在左右相机标定过程中,因没有绝对一致的相机镜头,那么两者镜头的参数就不会相同,那么世界坐标系中的物体映射在左右像素坐标上的大小与中心位置也不尽相同,匹配时就会产生误差,相应的重建得到的点云大小也会略有差异;那么统一内参,最大化左右相机公共视场(向中心点移动,且化解掉倾斜系数)就显得尤为重要。
统一焦距变量;
fcnew=min(fcyl,fcyr);\ fc_{new} = min(fc_{yl}, fc_{yr}); \,fcnew=min(fcyl,fcyr);opencv中是fcnew=(fcyl+fcyr)/2)\ fc_{new} = (fc_{yl}+fc_{yr})/2)\,fcnew=(fcyl+fcyr)/2)
%该值与真实相差大小,直接决定点云离真实大小。
重投影在校正后的左右像素平面上,像素坐标系原点向CCD中心移动,以使左右相机公共视场最大:
[x;y]=([u;v]−O1)/fc;\ [x;y] = ([u; v] - O1)/fc;\,[x;y]=([u;v]−O1)/fc;
x=x−γ∗y;\ x = x - \gamma * y; \,x=x−γ∗y;%若有,去掉倾斜因子的影响
[x2;y2;1]=compdistortion([x;y],kc);\ [x2; y2; 1]= comp_distortion( [x;y], kc);\,[x2;y2;1]=compdistortion([x;y],kc);%MATLAB中的迭代畸变补偿
[x3;y3;z3]=rl2∗[x2;y2;1];\ [x3; y3; z3] = r_{l2}*[x2; y2; 1];\,[x3;y3;z3]=rl2∗[x2;y2;1];
[x4;y4]=[x3;y3]z3;\ [x4; y4] = \frac{[x3; y3]}{z3};\,[x4;y4]=z3[x3;y3]; %到校正平面上的归一化坐标
[ulnew;vlnew]=−[x4;y4]∗fcnew+ImgSz2;\ [u_{lnew}; v_{lnew}] = -[x4; y4] *fc_{new} + \frac{Img_Sz}{2};\,[ulnew;vlnew]=−[x4;y4]∗fcnew+2ImgSz;
校正后左像素平面的内参为:[fcnew0ulnew0fcnewvlnew001](4)\begin{bmatrix} fc_{new} & 0 & u_{lnew} \\ 0 & fc_{new} & v_{lnew}\\ 0 & 0 & 1 \end{bmatrix} \tag{4} ⎣⎡fcnew000fcnew0ulnewvlnew1⎦⎤(4)
其中,[u;v]\ [u;v] \,[u;v]为未校正左像素平面内一点;[x;y]\ [x;y] \,[x;y]为未校正左相机归一化坐标系内一点;[x2;y2]\ [x2;y2] \,[x2;y2]为经过畸变补偿过未校正左相机归一化坐标系内一点;[x3;y3;z3]\ [x3;y3;z3] \,[x3;y3;z3]为极线校正后左相机坐标系内一点;[x4;y4]\ [x4;y4] \,[x4;y4]为极线校正后左相机归一化坐标系内一点;rl2\ r_{l2} \,rl2为左摄像机达到共面行对准时的旋转矩阵,[unew;vnew]\ [u_{new}; v_{new}] \,[unew;vnew]为校正后左像素平面的中心点。
三 实现
经过上述两步,已经得到校正像素平面上的所需参数,由此产生插值坐标,直接由未校正的像素坐标得到校正后的像素坐标;即可匹配,求得视差,得到被测物的三维信息;
ny = imageSize(1);nx = imageSize(2);[u_orignal, v_orignal] = meshgrid(1:nx, 1:ny);temp = R_L';u1 = (u_orignal - KK_left_new(1,3))/KK_left_new(1,1);v1 = (v_orignal - KK_left_new(2,3))/KK_left_new(2,2);L_x = (u1*temp(1,1) + v1*temp(1,2) + temp(1,3))./(u1*temp(3,1) + v1*temp(3,2) + temp(3,3));L_y = (u1*temp(2,1) + v1*temp(2,2) + temp(2,3))./(u1*temp(3,1) + v1*temp(3,2) + temp(3,3));[L_xc, L_yc] = distort(kc_left_new, L_x, L_y);L_u_old = L_A_old(1, 1)*L_xc + L_A_old(1, 3);L_v_old = L_A_old(2, 2)*L_yc + L_A_old(2, 3);