I performed camera calibration using aruco markers. Since the intrinsic matrix is K = [fx 0 cx; 0 fy cy; 0 0 1]
and where fx = image_width/2 and fy = image_height/2
. I performed the calibration twice and the results are:
CASE 1
camera_matrix: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [ 1.7837087835808685e+004, 0., 9.4648597205501767e+002, 0.,
1.7846680517567835e+004, 6.2655678552312384e+002, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
rows: 1
cols: 5
dt: d
data: [ 1.3214125616841757e-001, 1.3720591379476604e+001,
4.1379706976846960e-003, 3.2630160993931338e-002,
7.2446581087476508e-002 ]
CASE 2
camera_matrix: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [ 3.9925887362481939e+004, 0., 9.6015637557091463e+002, 0.,
3.5268399261164773e+003, 5.9886507612381956e+002, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
rows: 1
cols: 5
dt: d
data: [ 4.4338539084399781e-001, 4.9217843346948866e+000,
5.8004377137432547e-002, 1.1762688789809046e-004,
-5.4097967557812456e+002 ]
The resolution of the image is 1920*1200, so cx
and cy
should be 960 and 600.
In the 2nd case, cx
and cy
are as expected; the re-projection error is large. In other case cx
and cy
are not matching but the re-projection error is quite low (less than 1).
So now which results can be considered and best and how can fx
and fy
be defined in general?
You are correct that cx and cy should be close to 960 and 600. From this standpoint, case 2 seems somewhat more likely, but case 1 is certainly plausible with a center point of (946,626).
What is more eyebrow-raising is the focal length parameters obtained. Neither (17837,17846) nor (39925,3526) seem plausible for the focal length pair. As a rule of thumb, the fx parameter should match the pixel width (in this case 1920) to within a factor of 2x (e.g. the iPhone 5S has fx ~= 0.8*pixelWidth). And fy should match fx to within a factor of 1.2x or so. For case 1, fx is off of the width by a factor of 10x, and for case 2 fx and fy mismatch by 10x.
I recommend trying several calibration toolboxes and look for consensus between any two of them (like asking multiple mechanics to look at your car). I recommend Jean-Yves Bouguet's calibration toolbox, which was a precursor to OpenCV's approach.