Converting Hugin pto lens parameters to OpenCV compatible ones

asked 2017-10-16 07:50:03 -0500

6 photos are stitched into a panorama. For this I have a working Hugin .pto template file. It stitches well with the Hugin workflow.

The pto template needs to be converted to rig_spec.xml for the new NVIDIA VRWorks 360 workflow which expects parameters from a successful OpenCV calibration while I need to use the values from the pto template.

Example for just a single source image from the pto file:

# image lines
#-hugin  cropFactor=6.4
i w2560 h1920 f3 v118.537956650131 Ra0 Rb0 Rc0 Rd0 Re0 Eev14 Er1 Eb1 r94.606329053126 p-12.649859004975 y-70.9201302573682 TrX0 TrY0 TrZ0 Tpy0 Tpp0 j0 a-0.0128476647589936 b0 c-0.0263288686271355 d24.148292065888 e-42.619120967644 g0 t0 Va1 Vb0 Vc0 Vd0 Vx0 Vy0  Vm5 n"2.jpg"

The same data entered into the NVIDIA VRWorks rig_spec.xml equivalent.

My challenges are marked bold:

<camera width="2560" height="1920" layout="equatorial">
    <input_calib_file name="2.png"/>
    <pose>
        <rotation roll_deg="94.606329053126" pitch_deg="-12.649859004975" yaw_deg="-70.9201302573682"/>
        <translation x_cm="0.0" y_cm="0.0" z_cm="0.0"/>
    </pose>        
    <optics>
        <focal_length focal_pixels="1257"/>
        <principal_point center_offset_x="0.0" center_offset_y="0.0"/>
        <lens type="fisheye" k1="0.0" k2="0.0" k3="0.0" k4="0.0"/>
        <fisheye_radius radius_pixels="1400"/>
    </optics>       
</camera>

Solved: rig_spec.xml - .pto roll_deg - same as r pto value pitch_deg - same as p pto value yaw_deg - same as y pto value center_offset_x - same as d pto value center_offset_y - same as e pto value radius_pixels - 1400 pixels is a decent approximation

My challenge: Can someone point me into the right direction to figure out how to properly calculate/convert focal_pixels and the k1, k2, k3, k4 parameters ?

focal_pixels k1 - Most likely corresponds to c pto value. In Hugin this parameter is called: Radial distortion (c). k2 - Most likely corresponds to a pto value. In Hugin this parameter is called: Radial distortion (a). k3 - k4 -

Here is how the k parameters are described in the VRWorks documentation: “Radial distortion coefficients for fisheye”.

For focal_pixels I have tried the following:

Sensor size in mm:
Horizontal (hfov): 5.7 mm
Vertical (vfov): 4.28 mm

Sensor size in pixel:
Horizontal (w): 2592 pixel
Vertical (h): 1944 pixel

cropFactor: 6.4
hfov: corresponds to `v` PTO value.

var d = Math.sqrt(36.0 * 36.0 + 24.0 * 24.0) / cropFactor;
var r = w / h; //“r” is not a radius.
var sensorSizeX = d / Math.sqrt(1 + 1 / (r * r));
var sensorSizeY = sensorSizeX / r;

var focalLengthMm = sensorSizeX / (hfov / 180 * Math.PI);
var focalLengthPx = (focalLengthMm / 5.70) * w;

This gives a value close to correct one, but the images are still not properly aligned when stitching with the rig_spec.xml file.

I have also tried: focal_pixel = (image_width_in_pixels * 0.5) / tan(FOV * 0.5 * PI/180) But this gives an even worse result, the value is too low.

If you need the source images, the .pto file, or the lens parameters they all can be found in this archive: https://drive.google.com/open?id=1OzK...

edit retag flag offensive close merge delete

Comments

it's a bit unclear, what you're trying to do on the opencv side.

berak gravatar imageberak ( 2017-10-16 08:03:08 -0500 )edit

On the opencv side not much. In general it's more of an algorithm question. Basically I have a program which does camera calibration in one way (Hugin), and another program which does camera calibration using OpenCV.

I am trying to find out if I can convert Hugin calibration parameters to the ones created by OpenCV (without calibrating with OpenCV).

It may be a long shot to ask on the OpenCV forum, but been stuck on this problem for a while so decided to give it a go.

Pavel Iacovlev gravatar imagePavel Iacovlev ( 2017-10-16 08:40:05 -0500 )edit

I have the same question! For me, I will actually use a few more OpenCV functions (clustering, etc) after rectification, but I find that the Hugin GUI for calibration is much better than the hit-or-miss (usually "miss") Python or C++ script on top of a pile of checkerboard images. Thus, if I could find a way to put the three calibration values of Hugin into an OpenCV calibration matrix/coefficient set, that'd be great!

jwatte gravatar imagejwatte ( 2017-11-28 00:43:08 -0500 )edit