No se puede entender cómo obtener (x ', y') del original (x, y) en la imagen, para la distorsión de barril/acerico.Fórmulas para la distorsión de barril/acerico
Respuesta
La sección 2 de this paper explica la transformación. Básicamente:
Aquí hice un ejemplo en Mathematica:
sencilla distorsión en acerico barril \ en OpenCV C++
IplImage* barrel_pincusion_dist(IplImage* img, double Cx,double Cy,double kx,double ky)
{
IplImage* mapx = cvCreateImage(cvGetSize(img), IPL_DEPTH_32F, 1);
IplImage* mapy = cvCreateImage(cvGetSize(img), IPL_DEPTH_32F, 1);
int w= img->width;
int h= img->height;
float* pbuf = (float*)mapx->imageData;
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
float u= Cx+(x-Cx)*(1+kx*((x-Cx)*(x-Cx)+(y-Cy)*(y-Cy)));
*pbuf = u;
++pbuf;
}
}
pbuf = (float*)mapy->imageData;
for (int y = 0;y < h; y++)
{
for (int x = 0; x < w; x++)
{
*pbuf = Cy+(y-Cy)*(1+ky*((x-Cx)*(x-Cx)+(y-Cy)*(y-Cy)));
++pbuf;
}
}
/*float* pbuf = (float*)mapx->imageData;
for (int y = 0; y < h; y++)
{
int ty= y-Cy;
for (int x = 0; x < w; x++)
{
int tx= x-Cx;
int rt= tx*tx+ty*ty;
*pbuf = (float)(tx*(1+kx*rt)+Cx);
++pbuf;
}
}
pbuf = (float*)mapy->imageData;
for (int y = 0;y < h; y++)
{
int ty= y-Cy;
for (int x = 0; x < w; x++)
{
int tx= x-Cx;
int rt= tx*tx+ty*ty;
*pbuf = (float)(ty*(1+ky*rt)+Cy);
++pbuf;
}
}*/
IplImage* temp = cvCloneImage(img);
cvRemap(temp, img, mapx, mapy);
cvReleaseImage(&temp);
cvReleaseImage(&mapx);
cvReleaseImage(&mapy);
return img;
}
forma más complicada http://opencv.willowgarage.com/documentation/camera_calibration_and_3d_reconstruction.html
una aproximación del modelo de distorsión radial polinomio se puede encontrar en Fitzgibbon, 2001
es
donde Rd y Ru son las distancias desde el centro de la distorsión. Esto también se usa para filtrar la distorsión de una imagen de cámara gran angular para la visión por computadora y el procesamiento de imágenes.
puede encontrar una explicación más detallada del principio y el código de sombreado para implementar el filtrado undistortion (y también la transformación directa) aquí: http://marcodiiga.github.io/radial-lens-undistortion-filtering
También estoy publicar los papeles que debe echar un vistazo a las si desea conocer los detalles matemáticos para el método que publicó
- Zhang Z. (1999). Calibración flexible de la cámara al ver un plano de orientación desconocida
- Andrew W. Fitzgibbon (2001). Estimación lineal simultánea de geometría de vista múltiple y distorsión de lente
- 1. Recursos para algoritmos de distorsión de imagen
- 2. Distorsión de perspectiva OpenGL
- 3. Fórmulas para calcular la proximidad geográfica
- 4. OCR lib para fórmulas matemáticas
- 5. Buscando algoritmos rápidos de distorsión de imagen
- 6. Excel: ClearContent preservar fórmulas
- 7. Puntuación en fórmulas LaTeX
- 8. barrilete-únicas fórmulas homebrew
- 9. Fórmulas de posicionamiento en látex
- 10. Excel: ¿cambiar varias fórmulas a la vez?
- 11. fullScreen Previsualización de la cámara sin distorsión/estiramiento
- 12. Esferas texturizadas sin una gran distorsión
- 13. Creación automática de fórmulas para todos los posibles modelos lineales
- 14. Fórmulas R y nombres de coeficientes resultantes
- 15. C# - Evaluar fórmulas lógicas de Excel
- 16. Cómo publicar (sudar) fórmulas de regresión?
- 17. Analizar y ejecutar fórmulas con C#
- 18. ¿Incluye fórmulas LaTeX en archivos HTML?
- 19. Renderizar fórmulas matemáticas en un iDevice
- 20. Ocultar la barra de fórmulas en Excel para un archivo específico
- 21. OpenGL ES 2.0 textura distorsión en gran GL_REPEAT geometría
- 22. ¿Por qué hay 3 fórmulas de calibración de cámara OpenCV en conflicto?
- 23. Algoritmo de corrección de distorsión de barril para corregir la lente de ojo de pez: no se ha implementado con Java
- 24. Calibración de la cámara (OpenCV 2.3): cómo utilizar los parámetros de distorsión?
- 25. NSArray de UIImages a un error de vídeo tiene distorsión en la salida
- 26. Uso de posiciones relativas en las fórmulas de Excel
- 27. ¿Cómo codificaría un analizador de fórmulas complejas manualmente?
- 28. POI/Excel: aplicando fórmulas de una manera "relativa"
- 29. cálculo de fórmulas definidas por el usuario (con C++)
- 30. Escribir hojas de fórmulas (Cheat Sheet) en LyX/LaTeX
Al volver a crear este código en OpenGL sin recortar (como lo hizo en las 1ras 2 imágenes), la imagen parecía desarticulada. Tuve más éxito usando este algoritmo http://www.geeks3d.com/20140213/glsl-shader-library-fish-eye-and-dome-and-barrel-distortion-post-processing-filters/2/ – user819640
Su transformación solo es válido para convertir una imagen rectilínea en una imagen distorsionada, para invertir esa distorsión necesita la función inversa que es 'p1 = cbrt (2/(3 * a)); \t p2 = crtrt (sqrt (3 * a) * sqrt (27 * a * x * x + 4) - 9 * a * x); \t p3 = cbrt (2) * pow (3 * a, 2/3); \t return p1/p2 - p2/p3; ' –