在做图像测距时,由于相机获取的图像或多多少会有图像畸变,此时为了提高测量精度,需要对图像畸变进行校准,利用获取的相机内部参数,便可以对图像畸变进行校准。
我这里利用张氏标定箱获取的相机的内部参数,获得参数有相机参数(fx,fy,cx,cy)与畸变参数(k1、k2、p1、p2、k3)。
A =[1426.669 0 654.437;
0 1419.831 526.257;
0 0 1];
D = [-0.46630257 0.36091263 -0.00130967 0.00095855 -0.27829233];
fx = A(1,1);
fy = A(2,2);
cx = A(1,3);
cy = A(2,3);
k1 = D(1);
k2 = D(2);
k3 = D(5);
p1 = D(3);
p2 = D(4);
I_d = imread('图像路径');
[m,n] = size(I_d);
img = zeros(m,n);
I_d = im2double(I_d);
u_d = zeros(m,n);
v_d = zeros(m,n);
B = inv(A);
for i = 1:m
for j = 1:n
XYZ = B*[i;j;1];
x = XYZ(1);
y = XYZ(2);
r2 = XYZ(1).^2+XYZ(2)^2;
x = x.*(1+k1*r2 + k2*r2.^2 + k3*r2.^3)+ 2*p1.*x.*y + p2*(r2 + 2*x.^2);
y = y.*(1+k1*r2 + k2*r2.^2 + k3*r2.^3)+ 2*p2.*x.*y + p1*(r2 + 2*y.^2);
u_d(i,j) = uint32(fx*x + cx);
v_d(i,j) = uint32(fy*y + cy);
if (u_d(i,j)>0 && u_d(i,j)<m&& v_d(i,j)>0 && v_d(i,j)<n)
img(i,j) = I_d(u_d(i,j),v_d(i,j));
end
end
end
subplot(121);
imshow(I_d,[]);
title('畸变原图像');
subplot(122);
imshow(img,[]);
title('校准后图像');
在实际使用时,可以保存u_d,v_d数据矩阵,校准时,直接调用即可,提高处理效率。