cameracamera-calibrationfisheye

Projection of fisheye camera model by Scaramuzza


I am trying to understand the fisheye model by Scaramuzza, which is implemented in Matlab, see https://de.mathworks.com/help/vision/ug/fisheye-calibration-basics.html#mw_8aca38cc-44de-4a26-a5bc-10fb312ae3c5

The backprojection (uv to xyz) seems fairly straightforward according to the following equation: enter image description here , where rho=sqrt(u^2 +v^2)

However, how does the projection (from xyz to uv) work?! In my understanding we get a rather complex set of equations. Unfortunately, I don't find any details on that....


Solution

  • Okay, I believe I understand it now fully after analyzing the functions of the (windows) calibration toolbox by Scaramuzza, see https://sites.google.com/site/scarabotix/ocamcalib-toolbox/ocamcalib-toolbox-download-page

    Method 1 found in file "world2cam.m"

    For the projection, use the same equation above. In the projection case, the equation has three known (x,y,z) and three unknown variables (u,v and lambda). We first substitute lambda with rho by realizing that

    u = x/lambda
    v = y/lambda
    rho=sqrt(u^2+v^2) = 1/lambda * sqrt(x^2+y^2)  --> lambda = sqrt(x^2+y^2) / rho
    

    After that, we have the unknown variables (u,v and rho)

    u = x/lambda = x / sqrt(x^2+y^2) * rho
    v = y/lambda = y / sqrt(x^2+y^2) * rho
    z / lambda = z /sqrt(x^2+y^2) * rho = a0 + a2*rho^2 + a3*rho^3 + a4*rho^4
    

    As you can see, the last equation now has only one unknown, namely rho. Thus, we can solve it easily using e.g. the roots function in matlab. However, the result does not always exist nor is it necessarily unique. After solving the unknown variable rho, calculating uv is very simple using the equation above.

    This procedure needs to be performed for each point (x,y,z) separately and is thus rather computationally expensive for an image.

    Method 2 found in file "world2cam_fast.m"

    The last equation has the form rho(x,y,z). However, if we define m = z / sqrt(x^2+y^2) = tan(90°-theta), it only depends on one variable, namely rho(m).

    Instead of solving this equation rho(m) for every new m, the authors "plot" the function for several values of m and fit an 8th order polynomial to these points. Using this polynomial they can calculate an approximate value for rho(m) much quicker in the following.

    This becomes clear, because "world2cam_fast.m" makes use of ocam_model.pol, which is calculated in "undistort.m". "undistort.m" in turn makes use of "findinvpoly.m".