相机去畸变,以及双目平行校正----极线校正(二)————之双目平行校正详细过程

       通过相机标定的程序获取了两个相机各自的内参矩阵和畸变系数,以及两个相机达到平行时各自的旋转矩阵。 Opencv Matlab 都给了我们现成的函数,可以利用这些数据进行去畸变或者双目平行校正,因为有需求要将去畸变和平行校正移植到硬件上,那么自己如何利用这些参数和矩阵写去畸变的程序和双目平行校正的程序呢?我本人发现的网上这方面资料较少。在此总结一下。

去畸变的过程就是针对单目相机进行的变换,平行校正就是针对双目相机的操作。


本文针对双目平行校正的方法展开叙述:


做双目平行校正时,是已经通过相机标定获取了左、右相机的内参矩阵和畸变系数,以及左、右相机达到平行时各需要的旋转矩阵,另外,已知左右两个相机拍摄出来的两幅图片。

注:这里双目相机各参数标定是通过左右相机拍摄的15对棋盘格图像,通过opencv双目标定程序获取的。

内参矩阵:

相机去畸变,以及双目平行校正----极线校正(二)————之双目平行校正详细过程_第1张图片


畸变系数:

相机去畸变,以及双目平行校正----极线校正(二)————之双目平行校正详细过程_第2张图片

旋转矩阵:

相机去畸变,以及双目平行校正----极线校正(二)————之双目平行校正详细过程_第3张图片


构建一个两个相机共同的理想内参矩阵:

相机去畸变,以及双目平行校正----极线校正(二)————之双目平行校正详细过程_第4张图片

即:

相机去畸变,以及双目平行校正----极线校正(二)————之双目平行校正详细过程_第5张图片


双目平行校正,它是在左、右相机去畸变的过程中对左、右相机坐标系分别多进行了一步旋转操作。它的操作步骤如下:


1),分别将两个图像的像素坐标系通过共同的内参矩阵转换到相机坐标系:


2),分别对两个相机坐标系进行旋转得到新的相机坐标系。通过左乘旋转矩阵R1R2


3),针对新的相机坐标分别进行左、右相机的去畸变操作。


4),去畸变操作结束后,分别用左、右相机的内参矩阵将左、右两个相机坐标系重新转换到左、右图像像素坐标系。


5),并分别用左、右源图像的像素值对新左、右图像的像素点进行插值。


编程实例:


左右相机拍摄的图像:


左:


              相机去畸变,以及双目平行校正----极线校正(二)————之双目平行校正详细过程_第6张图片



右:


                              相机去畸变,以及双目平行校正----极线校正(二)————之双目平行校正详细过程_第7张图片


共同显示:


             相机去畸变,以及双目平行校正----极线校正(二)————之双目平行校正详细过程_第8张图片


左摄像头处理程序:

f1=1;%焦距倍数
gama=0;
for x=1:W1 %640
    for y=1:H1  %480
        yy=(y-cy)/fy;%转换到相机坐标系
        xx=(x-cx-gama*yy)/fx;
        pos=[xx;yy;f1]; %3x1
        pos=inv(R1)*pos; %旋转相机坐标系,3x1
        xx=pos(1,:)/pos(3,:);%归一化
        yy=pos(2,:)/pos(3,:);
        r=xx^2+yy^2;
        xxx=xx*(1+k11*r+k12*r^2+k13*r^3)+2*p11*xx*yy+p12*(r+2*xx^2);
        yyy=yy*(1+k11*r+k12*r^2+k13*r^3)+2*p12*xx*yy+p11*(r+2*yy^2);
        xxxx=xxx*fx1+cx1;
        yyyy=yyy*fy1+cy1;
        if (xxxx>1 && xxxx<=W1 && yyyy>1 && yyyy<=H1)
            h=yyyy;
            w=xxxx;
            I11(y,x)=(floor(w+1)-w)*(floor(h+1)-h)*I1(floor(h),floor(w))+(floor(w+1)-w)*(h-floor(h))*I1(floor(h+1),floor(w))+(w-floor(w))*(floor(h+1)-h)*I1(floor(h),floor(w+1))+(w-floor(w))*(h-floor(h))*I1(floor(h+1),floor(w+1));
        end
    end
end


右摄像头处理程序:

f2=1;%焦距
gama=0;
for x=1:W1 %640
    for y=1:H1  %480
        yy=(y-cy)/fy;%转换到相机坐标系
        xx=(x-cx-gama*yy)/fx;
        pos=[xx;yy;f2]; %3x1
        pos=inv(R2)*pos; %旋转相机坐标系,3x1
        xx=pos(1,:)/pos(3,:);%归一化
        yy=pos(2,:)/pos(3,:);
        r=xx^2+yy^2;
        xxx=xx*(1+k21*r+k22*r^2+k23*r^3)+2*p21*xx*yy+p22*(r+2*xx^2);
        yyy=yy*(1+k21*r+k22*r^2+k23*r^3)+2*p22*xx*yy+p21*(r+2*yy^2);
        xxxx=xxx*fx2+cx2;
        yyyy=yyy*fy2+cy2;
        if (xxxx>1 && xxxx<=W2 && yyyy>1 && yyyy<=H2)
            h=yyyy;
            w=xxxx;     I22(y,x)=(floor(w+1)-w)*(floor(h+1)-h)*I2(floor(h),floor(w))+(floor(w+1)-w)*(h-floor(h))*I2(floor(h+1),floor(w))+(w-floor(w))*(floor(h+1)-h)*I2(floor(h),floor(w+1))+(w-floor(w))*(h-floor(h))*I2(floor(h+1),floor(w+1));
        end
    end
end

经过去畸变和平行校正处理后的图像:

相机去畸变,以及双目平行校正----极线校正(二)————之双目平行校正详细过程_第9张图片

平行放置并划线对比显示可见,两幅图像已经达到极线平行:

相机去畸变,以及双目平行校正----极线校正(二)————之双目平行校正详细过程_第10张图片












你可能感兴趣的:(相机标定)