Невозможно понять, как получить (x ', y') оригинала (x, y) в изображении, для искажения Barrel/Pincushion.
Формулы для искажения ствола/подушки
Ответ 1
Раздел 2 этот документ объясняет преобразование. В принципе:
Здесь я привел пример в Mathematica:
Ответ 2
Аппроксимация модели полиномиального радиального искажения, которую вы можете найти в Fitzgibbon, 2001
,
где rd и ru - расстояния от центра искажения. Это также используется для фильтрации искажений широкоугольного изображения камеры для компьютерного зрения и обработки изображений.
Вы можете найти более подробное объяснение принципа и шейдерного кода для реализации фильтрации неисторжения (а также прямого преобразования) здесь: http://marcodiiga.github.io/radial-lens-undistortion-filtering
Я также размещаю документы, которые вы должны посмотреть, если хотите узнать математические данные для метода, который я опубликовал
- Чжан З. (1999). Гибкая калибровка камеры путем просмотра плоскости с неизвестной ориентации.
- Andrew W. Fitzgibbon (2001). Одновременная линейная оценка геометрии множественного изображения и искажения объектива.
Ответ 3
простое искажение ствола \pincushion в opencv С++
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;
}
более сложная форма http://opencv.willowgarage.com/documentation/camera_calibration_and_3d_reconstruction.html