通过相机标定的程序获取了两个相机各自的内参矩阵和畸变系数,以及两个相机达到平行时各自的旋转矩阵。Opencv和Matlab都给了我们现成的函数,可以利用这些数据进行去畸变或者双目平行校正,因为有需求要将去畸变和平行校正移植到硬件上,那么自己如何利用这些参数和矩阵写去畸变的程序和双目平行校正的程序呢?我本人发现的网上这方面资料较少。在此总结一下。
去畸变的过程就是针对单目相机进行的变换,平行校正就是针对双目相机的操作。
本文针对单目去畸变的方法展开叙述:
和“从世界坐标系到相机坐标系再到图像物理坐标系最后到图像像素坐标系”过程相逆,我们做去畸变时,是已经通过相机标定获取了相机的内参矩阵和畸变系数的,另外,我们已知的就是相机拍摄出来一副图像。
内参矩阵:
畸变系数:
则各参数如下:
去畸变的操作步骤如下:
(1),将图像的像素坐标系通过内参矩阵转换到相机坐标系:
(2),在相机坐标系下进行去畸变操作。
(3),去畸变操作结束后,将相机坐标系重新转换到图像像素坐标系。
(4),并用源图像的像素值对新图像的像素点进行插值。
插值算法如下:
1、[x+1]-x;2、[y+1]-y;3、I1([x],[y]);4、y-[y];5、I1([x],[y+1]);6、x-[x];7、I1([x+1],[y]);8、I1([x+1],[y+1]);
I2(u,v)=1*2*3+1*4*5+6*2*7+6*4*8
编程实例:
去畸变之前的图像:
- for x=1:W1
- for y=1:H1
- %图像像素坐标系转换到相机坐标系
- yy=(y-cy)/fy;
- xx=(x-cx)/fx;
- %在相机坐标系中做去畸变
- 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<&#61;W2 && yyyy>1 && yyyy<&#61;H2)
- h&#61;yyyy;
- w&#61;xxxx; I22(y,x)&#61;(floor(w&#43;1)-w)*(floor(h&#43;1)-h)*I2(floor(h),floor(w))&#43;(floor(w&#43;1)-w)*(h-floor(h))*I2(floor(h&#43;1),floor(w))&#43;(w-floor(w))*(floor(h&#43;1)-h)*I2(floor(h),floor(w&#43;1))&#43;(w-floor(w))*(h-floor(h))*I2(floor(h&#43;1),floor(w&#43;1));
- end
去畸变之后的图片&#xff1a;