双目相机的畸变矫正及平行矫正

时间:2024-04-06 11:16:42

http://www.360doc.com/content/16/1123/14/10408243_608796180.shtml

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

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


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


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

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

内参矩阵:

双目相机的畸变矫正及平行矫正


畸变系数:

双目相机的畸变矫正及平行矫正

旋转矩阵:

双目相机的畸变矫正及平行矫正


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

双目相机的畸变矫正及平行矫正

即:

双目相机的畸变矫正及平行矫正


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


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


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


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


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


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


编程实例:


左右相机拍摄的图像:


左:


              双目相机的畸变矫正及平行矫正



右:


                              双目相机的畸变矫正及平行矫正


共同显示:


             双目相机的畸变矫正及平行矫正


左摄像头处理程序:

[plain] view plain copy
  1. f1=1;%焦距倍数  
  2. gama=0;  
  3. for x=1:W1 %640  
  4.     for y=1:H1  %480  
  5.         yy=(y-cy)/fy;%转换到相机坐标系  
  6.         xx=(x-cx-gama*yy)/fx;  
  7.         pos=[xx;yy;f1]; %3x1  
  8.         pos=inv(R1)*pos; %旋转相机坐标系,3x1  
  9.         xx=pos(1,:)/pos(3,:);%归一化  
  10.         yy=pos(2,:)/pos(3,:);  
  11.         r=xx^2+yy^2;  
  12.         xxx=xx*(1+k11*r+k12*r^2+k13*r^3)+2*p11*xx*yy+p12*(r+2*xx^2);  
  13.         yyy=yy*(1+k11*r+k12*r^2+k13*r^3)+2*p12*xx*yy+p11*(r+2*yy^2);  
  14.         xxxx=xxx*fx1+cx1;  
  15.         yyyy=yyy*fy1+cy1;  
  16.         if (xxxx>1 && xxxx<=W1 && yyyy>1 && yyyy<=H1)  
  17.             h=yyyy;  
  18.             w=xxxx;  
  19.             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));  
  20.         end  
  21.     end  
  22. end  


右摄像头处理程序:

[plain] view plain copy
  1. f2=1;%焦距  
  2. gama=0;  
  3. for x=1:W1 %640  
  4.     for y=1:H1  %480  
  5.         yy=(y-cy)/fy;%转换到相机坐标系  
  6.         xx=(x-cx-gama*yy)/fx;  
  7.         pos=[xx;yy;f2]; %3x1  
  8.         pos=inv(R2)*pos; %旋转相机坐标系,3x1  
  9.         xx=pos(1,:)/pos(3,:);%归一化  
  10.         yy=pos(2,:)/pos(3,:);  
  11.         r=xx^2+yy^2;  
  12.         xxx=xx*(1+k21*r+k22*r^2+k23*r^3)+2*p21*xx*yy+p22*(r+2*xx^2);  
  13.         yyy=yy*(1+k21*r+k22*r^2+k23*r^3)+2*p22*xx*yy+p21*(r+2*yy^2);  
  14.         xxxx=xxx*fx2+cx2;  
  15.         yyyy=yyy*fy2+cy2;  
  16.         if (xxxx>1 && xxxx<=W2 && yyyy>1 && yyyy<=H2)  
  17.             h=yyyy;  
  18.             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));  
  19.         end  
  20.     end  
  21. end  

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

双目相机的畸变矫正及平行矫正

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

双目相机的畸变矫正及平行矫正