2012-08-24 15 views

Respuesta

2

Ahora puede hacer que a partir de la liberación R2013B, utilizando el ordenador Vision System Toolbox. Hay una aplicación de GUI llamada Camera Calibrator y una función undistortImage.

+1

¡Finalmente! Gracias por señalar eso – twerdster

13

La forma más simple y común de distorsionar (dislocar o compensar la distorsión del objetivo) es hacer una distorsión hacia adelante en un tamaño de foto de salida elegido y luego un mapeo inverso usando interpolación bilineal.

Aquí es código que escribió para realizar esto:

function I = undistort(Idistorted, params) 
fx = params.fx; 
fy = params.fy; 
cx = params.cx; 
cy = params.cy; 
k1 = params.k1; 
k2 = params.k2; 
k3 = params.k3; 
p1 = params.p1; 
p2 = params.p2; 

K = [fx 0 cx; 0 fy cy; 0 0 1]; 

I = zeros(size(Idistorted)); 
[i j] = find(~isnan(I)); 

% Xp = the xyz vals of points on the z plane 
Xp = inv(K)*[j i ones(length(i),1)]'; 

% Now we calculate how those points distort i.e forward map them through the distortion 
r2 = Xp(1,:).^2+Xp(2,:).^2; 
x = Xp(1,:); 
y = Xp(2,:); 

x = x.*(1+k1*r2 + k2*r2.^2) + 2*p1.*x.*y + p2*(r2 + 2*x.^2); 
y = y.*(1+k1*r2 + k2*r2.^2) + 2*p2.*x.*y + p1*(r2 + 2*y.^2); 

% u and v are now the distorted cooridnates 
u = reshape(fx*x + cx,size(I)); 
v = reshape(fy*y + cy,size(I)); 

% Now we perform a backward mapping in order to undistort the warped image coordinates 
I = interp2(Idistorted, u, v); 

Para utilizarlo es necesario conocer los parámetros de la cámara de la cámara que se utiliza. Actualmente estoy usando el CamboardNano PMD que de acuerdo con los foros Cayim.com tiene los parámetros utilizados aquí:

params = struct('fx',104.119, 'fy', 103.588, 'cx', 81.9494, 'cy', 59.4392, 'k1', -0.222609, 'k2', 0.063022, 'k3', 0, 'p1', 0.002865, 'p2', -0.001446); 

I = undistort(Idistorted, params); 

subplot(121); imagesc(Idistorted); 
subplot(122); imagesc(I); 

Aquí es un ejemplo de la salida del Camboard Nano. Nota: He añadido artificialmente líneas fronterizas para ver cuál fue el efecto de la distorsión cerca de los bordes (su mucho más pronunciados): enter image description here

+0

¿Qué tipos de datos admite su función? No puedo hacer que funcione con ninguno lo intenté ... BTW: gracias por la función, es extraño cómo matlab no tiene implementado –

+0

@AnderBiguri al menos debería funcionar con un solo canal tipo "doble". Lo primero que debe hacer es convertir cualquier imagen a doble. Además, si tiene una imagen que es en escala de grises o es una imagen de profundidad, entonces debería funcionar bien simplemente llamando sin distorsionar con los parámetros correctos. Si tiene una imagen en color de 3 canales, deberá distorsionar por separado en cada canal. – twerdster

+0

¡No funciona con mapas de bits en escala de grises, pero los convertiré en dobles e intentaré! –

Cuestiones relacionadas