mirror of
https://github.com/opencv/opencv.git
synced 2025-06-07 17:44:04 +08:00
Merge pull request #23179 from savuor:port34_stddev_calib_fisheye
Backport to 3.4 of the fisheye calibration uncertainty fix * uncertainties fix * trailing whitespace * comment added
This commit is contained in:
parent
c67d4fc633
commit
deaf632881
@ -1527,13 +1527,18 @@ void cv::internal::EstimateUncertainties(InputArrayOfArrays objectPoints, InputA
|
|||||||
|
|
||||||
Vec<double, 1> sigma_x;
|
Vec<double, 1> sigma_x;
|
||||||
meanStdDev(ex.reshape(1, 1), noArray(), sigma_x);
|
meanStdDev(ex.reshape(1, 1), noArray(), sigma_x);
|
||||||
sigma_x *= sqrt(2.0 * (double)ex.total()/(2.0 * (double)ex.total() - 1.0));
|
|
||||||
|
|
||||||
Mat JJ2, ex3;
|
Mat JJ2, ex3;
|
||||||
ComputeJacobians(objectPoints, imagePoints, params, omc, Tc, check_cond, thresh_cond, JJ2, ex3);
|
ComputeJacobians(objectPoints, imagePoints, params, omc, Tc, check_cond, thresh_cond, JJ2, ex3);
|
||||||
|
|
||||||
sqrt(JJ2.inv(), JJ2);
|
sqrt(JJ2.inv(), JJ2);
|
||||||
|
|
||||||
|
int nParams = JJ2.rows;
|
||||||
|
// an explanation of that denominator correction can be found here:
|
||||||
|
// R. Hartley, A. Zisserman, Multiple View Geometry in Computer Vision, 2004, section 5.1.3, page 134
|
||||||
|
// see the discussion for more details: https://github.com/opencv/opencv/pull/22992
|
||||||
|
sigma_x *= sqrt(2.0 * (double)ex.total()/(2.0 * (double)ex.total() - nParams));
|
||||||
|
|
||||||
errors = 3 * sigma_x(0) * JJ2.diag();
|
errors = 3 * sigma_x(0) * JJ2.diag();
|
||||||
rms = sqrt(norm(ex, NORM_L2SQR)/ex.total());
|
rms = sqrt(norm(ex, NORM_L2SQR)/ex.total());
|
||||||
}
|
}
|
||||||
|
@ -398,9 +398,9 @@ TEST_F(fisheyeTest, EstimateUncertainties)
|
|||||||
cv::internal::EstimateUncertainties(objectPoints, imagePoints, param, rvec, tvec,
|
cv::internal::EstimateUncertainties(objectPoints, imagePoints, param, rvec, tvec,
|
||||||
errors, err_std, thresh_cond, check_cond, rms);
|
errors, err_std, thresh_cond, check_cond, rms);
|
||||||
|
|
||||||
EXPECT_MAT_NEAR(errors.f, cv::Vec2d(1.29837104202046, 1.31565641071524), 1e-10);
|
EXPECT_MAT_NEAR(errors.f, cv::Vec2d(1.34250246865020720, 1.36037536429654530), 1e-10);
|
||||||
EXPECT_MAT_NEAR(errors.c, cv::Vec2d(0.890439368129246, 0.816096854937896), 1e-10);
|
EXPECT_MAT_NEAR(errors.c, cv::Vec2d(0.92070526160049848, 0.84383585812851514), 1e-10);
|
||||||
EXPECT_MAT_NEAR(errors.k, cv::Vec4d(0.00516248605191506, 0.0168181467500934, 0.0213118690274604, 0.00916010877545648), 1e-10);
|
EXPECT_MAT_NEAR(errors.k, cv::Vec4d(0.0053379581373996041, 0.017389792901700545, 0.022036256089491224, 0.0094714594258908952), 1e-10);
|
||||||
EXPECT_MAT_NEAR(err_std, cv::Vec2d(0.187475975266883, 0.185678953263995), 1e-10);
|
EXPECT_MAT_NEAR(err_std, cv::Vec2d(0.187475975266883, 0.185678953263995), 1e-10);
|
||||||
CV_Assert(fabs(rms - 0.263782587133546) < 1e-10);
|
CV_Assert(fabs(rms - 0.263782587133546) < 1e-10);
|
||||||
CV_Assert(errors.alpha == 0);
|
CV_Assert(errors.alpha == 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user