http://www.360doc.com/content/16/1123/14/10408243_608796180.shtml
去畸变的过程就是针对单目相机进行的变换,平行校正就是针对双目相机的操作。
本文针对双目平行校正的方法展开叙述:
做双目平行校正时,是已经通过相机标定获取了左、右相机的内参矩阵和畸变系数,以及左、右相机达到平行时各需要的旋转矩阵,另外,已知左右两个相机拍摄出来的两幅图片。
注:这里双目相机各参数标定是通过左右相机拍摄的15对棋盘格图像,通过opencv双目标定程序获取的。
内参矩阵:
畸变系数:
旋转矩阵:
构建一个两个相机共同的理想内参矩阵:
即:
双目平行校正,它是在左、右相机去畸变的过程中对左、右相机坐标系分别多进行了一步旋转操作。它的操作步骤如下:
(1),分别将两个图像的像素坐标系通过共同的内参矩阵转换到相机坐标系:
(2),分别对两个相机坐标系进行旋转得到新的相机坐标系。通过左乘旋转矩阵R1和R2。
(3),针对新的相机坐标分别进行左、右相机的去畸变操作。
(4),去畸变操作结束后,分别用左、右相机的内参矩阵将左、右两个相机坐标系重新转换到左、右图像像素坐标系。
(5),并分别用左、右源图像的像素值对新左、右图像的像素点进行插值。
编程实例:
左右相机拍摄的图像:
左:
右:
共同显示:
左摄像头处理程序:
- 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
经过去畸变和平行校正处理后的图像:
平行放置并划线对比显示可见,两幅图像已经达到极线平行: