Esto es fácil de hacer en OpenCV; sin embargo, me gustaría una implementación nativa de Matlab que sea bastante eficiente y se pueda cambiar fácilmente. El método debe poder tomar los parámetros de la cámara como se especifica en el enlace de arriba.¿Cómo puedo distorsionar una imagen en Matlab usando los parámetros de cámara conocidos?
Respuesta
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.
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):
¿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 –
@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
¡No funciona con mapas de bits en escala de grises, pero los convertiré en dobles e intentaré! –
- 1. ¿Cómo hacer la corrección de perspectiva en Matlab a partir de parámetros intrínsecos y extrínsecos conocidos?
- 2. ¿Cómo puedo encontrar máximos locales en una imagen en MATLAB?
- 3. Cómo calcular los parámetros extrínsecos de una cámara en relación con la segunda cámara?
- 4. ¿Cómo puedo guardar una imagen alterada en MATLAB?
- 5. ¿Cómo grabo video desde una cámara web en MATLAB?
- 6. Cómo distorsionar una imagen para crear una bandera ondeando en el efecto de viento usando el lienzo html5
- 7. ¿Cómo puedo adjuntar una imagen usando Phpmailer?
- 8. (cómo) puedo descargar una imagen usando JSoup?
- 9. ¿Cómo visualizo el canal rojo de una imagen en Matlab?
- 10. ¿Cómo eliminar el ruido gaussiano de una imagen en MATLAB?
- 11. ¿Cómo puedo guardar una imagen en el carrete de la cámara?
- 12. En matlab, cómo dibujar una grilla sobre una imagen
- 13. Cómo capturar y guardar una imagen usando una cámara personalizada en Android?
- 14. En Java, ¿cómo puedo extraer la información relacionada con la cámara de una imagen?
- 15. ¿Cómo puedo vincular los parámetros querystring usando Knockout.js?
- 16. Cómo dibujar una línea en una imagen en matlab?
- 17. Detectar un objeto en una imagen de cámara en C#
- 18. Superpone dos flujos de cámara web: Matlab
- 19. dígitos del segmento en una imagen - Matlab
- 20. cómo detectar objetos conocidos en OpenCV?
- 21. Cálculo de distancia usando una sola cámara
- 22. ¿Cómo añado metadatos a una imagen en Matlab?
- 23. Cómo alinear la imagen - Matlab
- 24. ¿Cómo cargo y muestro una imagen PNG en MATLAB?
- 25. ¿Cómo puedo programar una GUI en MATLAB?
- 26. ¿Cómo puedo cambiar el tamaño de una imagen usando Java?
- 27. Representar una imagen como matriz matlab
- 28. ¿Cómo puedo convertir una imagen en color a escala de grises en MATLAB?
- 29. ¿Cómo veo los parámetros en una consulta?
- 30. Configuración del tamaño de imagen de la cámara en Android
¡Finalmente! Gracias por señalar eso – twerdster