对于桶形/枕形失真,无法理解如何得到图像中原始(x,y)的(x',y')。
答案 0 :(得分:22)
答案 1 :(得分:2)
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;
}
更复杂的形式 http://opencv.willowgarage.com/documentation/camera_calibration_and_3d_reconstruction.html
答案 2 :(得分:2)
Fitzgibbon, 2001
中可以找到的多项式径向畸变模型的近似值是
其中rd和ru是距失真中心的距离。这也用于过滤广角相机图像中的失真,以用于计算机视觉和图像处理。
您可以在此处找到有关原理和着色器代码的更详细说明,以实现非失真过滤(以及正向转换):http://marcodiiga.github.io/radial-lens-undistortion-filtering
如果您想了解我发布的方法的数学详细信息,我也会发布您应该查看的论文
答案 3 :(得分:0)
根据维基百科的说法,也可能存在权力4项。两个常数的符号(对于r到2和r到4个术语)可以相反,给出车把失真,其中图像的中心具有桶形失真,并且边缘具有枕形失真,使直线呈现出车把胡须的外观