相机畸变矫正
在双目立体视觉中,常常会使用张正友的相机标定方法,得到相机的参数(相机内参和畸变),进而矫正由于相机透镜制造工艺等因素造成的图像畸变。在Opencv 和 Matlab 中都有封装好的函数或者标定工具箱供我们使用,可以利用这些标定得到的数据进行畸变矫正。
重点来了!!!怎么自己编写呢?且看下方讲解。。
- 内参矩阵
A = [fx, 0, cx; 0, fy, cy; 0, 0, 1]
- 畸变系数
D = [k1, k2, p1, p2, k3](通常没有k3)
- 参数说明
fx = f/dx;
fy = f/dy;
1、dx和dy是相机单个感光单元芯片的长度和宽度,是一个物理尺寸,有时候会有dx=dy,这时候感光单元是一个正方形;
2、cx和cy分别代表相机感光芯片的中心点在x和y方向上可能存在的偏移;
3、f代表相机的焦距;
4、k1, k2, k3为径向畸变系数;
5、p1, p2为切向畸变系数。
- 去畸变步骤
1、先将图像像素坐标系转换到相机坐标系
x_w = (x-cx)/fx;
y_w = (y-cy)/fy;
2、在相机坐标系中做去畸变
r = x_w^2 + y_w^2;
x_w1 = x_w*(1 + k1*r + k2*r^2 + k3*r^3) + 2*p1*x_w*y_w + p2*(r + 2*x_w^2);
y_w1 = y_w*(1 + k1*r + k2*r^2 + k3*r^3) + 2*p2*x_w*y_w + p1*(r + 2*y_w^2);
3、去畸变后重新将相机坐标系转换到图像像素坐标系
x_p = x_w1*fx + cx;
y_p = y_w1*fy + cy;
4、使用源图像对新图像插值
w = x_p;
h = y_p;
I1(y, x) = ([w+1]-w)*([h+1]-h)*I([h],[w])+
([w+1]-w)*(h-[h])*I([h+1],[w])+
(w-[w])*([h+1]-h)*I([h],[w+1])+
(w-[w])*(h-[h])*I([h+1],[w+1])+
注:[]表示取整,I1为矫正后图像,I为源图像。
- 矫正结果
矫正前后图像(左:源图像;右:校正后图像)