用查找表进行鱼眼畸变校正

时间:2016-04-05 22:31:07

标签: opencv camera-calibration distortion perspectivecamera fisheye

我有一个鱼眼镜头:

curved chess

我想不反对它。我应用FOV模型:

rd = 1 / ω * arctan (2 * ru * tan(ω / 2))   //Equation 13
ru = tan(rd * ω) / 2 / tan(ω / 2)           //Equation 14

见于INRIA论文的方程(13)和(14)中“直线必须是直的”https://hal.inria.fr/inria-00267247/document

代码实现如下:

Point2f distortPoint(float w, float h, float cx, float cy, float omega, Point2f input) {
    //w = width of the image
    //h = height of the image
    //cx = center of the lens in the image, aka w/2
    //cy = center of the lens in the image, aka h/2

    Point2f tmp = new Point2f();

    //We normalize the coordinates of the point
    tmp.x = input.x / w - cx / w;
    tmp.y = input.y / h - cy / h;

    //We apply the INRIA key formula (FOV model)
    double ru = sqrt(tmp.x * tmp.x + tmp.y * tmp.y);
    double rd = 1.0f / omega * atan(2.0f * ru * tan(omega / 2.0f));

    tmp.x *= rd / ru;
    tmp.y *= rd / ru;

    //We "un-normalize" the point
    Point2f ret = new Point2f();
    ret.x = (tmp.x + cx / w) * w;
    ret.y = (tmp.y + cy / h) * h;

    return ret;
}

然后我使用了OpenCV重映射功能:

//map_x and map_y are computed with distortPoint
remap(img, imgUndistorted, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));

我设法从镜头制造商处获得了失真模型。它是image_height的表格,作为视场角度的函数:

Field angle(deg)    Image Height (mm)
0                   0
1                   height1
2                   height2
3                   height3
...
89                  height89
90                  height90

为了给出一个想法,每个高度都很小,并且低于2mm。

我在这里发现了一篇有趣的论文:https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/wp/wp-01073-flexible-architecture-fisheye-correction-automotive-rear-view-cameras.pdf

如何修改像素单位失真函数以考虑制造商提供的mm-unit表格,以获得最准确的无失真图像?

0 个答案:

没有答案