2012-08-24 17 views

risposta

2

Ora è possibile farlo dalla versione R2013B, utilizzando la Computer Vision System Toolbox. C'è un'applicazione GUI chiamata Camera Calibrator e una funzione undistortImage.

+1

Finalmente! Grazie per la segnalazione – twerdster

13

Il modo più semplice e più comune per eseguire una distorsione (detta anche non curvata o compensante per la distorsione della lente) consiste nel fare una distorsione in avanti su una determinata dimensione della foto in uscita e quindi una mappatura inversa usando l'interpolazione bilineare.

Qui è il codice che ho scritto per l'esecuzione di questo:

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); 

Per utilizzarlo è necessario conoscere i parametri della telecamera della telecamera in uso. Attualmente sto usando il PMD CamboardNano che secondo i forum Cayim.com ha i parametri utilizzati qui:

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); 

Ecco un esempio di output del Camboard Nano. Nota: ho artificialmente aggiunto linee di confine per vedere che cosa l'effetto è stato della distorsione in prossimità dei bordi (la sua molto più pronunciati): enter image description here

+0

Che tipo di tipi di dati supporta la funzione? Non riesco a farlo funzionare con nessuno dei miei tentativi ... BTW: grazie per la funzione, è strano come Matlab non abbia implementato questo –

+0

@AnderBiguri dovrebbe funzionare almeno con un singolo canale di tipo "doppio". La prima cosa da fare è convertire qualsiasi immagine in doppio. Inoltre, se hai un'immagine che è in scala di grigi o è un'immagine di profondità, allora dovrebbe funzionare bene solo chiamando non distorto con i parametri corretti. Se si dispone di un'immagine a colori a 3 canali, è necessario eseguire la distinzione separatamente su ciascun canale. – twerdster

+0

Non funziona con i bitmap in scala di grigi, ma li convertirò in double e proveremo! –