diff --git a/gtsam/geometry/Cal3Unify.cpp b/gtsam/geometry/Cal3Unify.cpp index eefd33801..e837eff5d 100644 --- a/gtsam/geometry/Cal3Unify.cpp +++ b/gtsam/geometry/Cal3Unify.cpp @@ -104,41 +104,12 @@ Point2 Cal3Unify::uncalibrate(const Point2& p, /* ************************************************************************* */ Point2 Cal3Unify::calibrate(const Point2& pi, const double tol) const { - // Use the following fixed point iteration to invert the radial distortion. - // pn_{t+1} = (inv(K)*pi - dp(pn_{t})) / g(pn_{t}) - // point on the normalized plane, input for DS2 - double px = pi.x(); - double py = pi.y(); - const Point2 invKPi ((1 / fx_) * (px - u0_ - (s_ / fy_) * (py - v0_)), - (1 / fy_) * (py - v0_)); + // calibrate point to Nplane use base class::calibrate() + Point2 pnplane = Base::calibrate(pi, tol); - // initialize by ignoring the distortion at all, might be problematic for pixels around boundary - Point2 pn = nPlaneToSpace(invKPi); - - // iterate until the uncalibrate is close to the actual pixel coordinate - const int maxIterations = 20; - int iteration; - for ( iteration = 0; iteration < maxIterations; ++iteration ) { - - if ( uncalibrate(pn).distance(pi) <= tol ) break; - - // part1: 3D space -> normalized plane - Point2 pnpl = spaceToNPlane(pn); - // part2: normalized plane -> 3D space - px = pnpl.x(), py = pnpl.y(); - const double xy = px*py, xx = px*px, yy = py*py; - const double rr = xx + yy; - const double g = (1+k1_*rr+k2_*rr*rr); - const double dx = 2*k3_*xy + k4_*(rr+2*xx); - const double dy = 2*k4_*xy + k3_*(rr+2*yy); - pn = nPlaneToSpace((invKPi - Point2(dx,dy))/g); - } - - if ( iteration >= maxIterations ) - throw std::runtime_error("Cal3Unify::calibrate fails to converge. need a better initialization"); - - return pn; + // call nplane to space + return this->nPlaneToSpace(pnplane); } /* ************************************************************************* */ Point2 Cal3Unify::nPlaneToSpace(const Point2& p) const { diff --git a/gtsam/geometry/tests/testCal3Unify.cpp b/gtsam/geometry/tests/testCal3Unify.cpp index 015cff237..c36b756e3 100644 --- a/gtsam/geometry/tests/testCal3Unify.cpp +++ b/gtsam/geometry/tests/testCal3Unify.cpp @@ -56,7 +56,7 @@ TEST( Cal3Unify, calibrate) { Point2 pi = K.uncalibrate(p); Point2 pn_hat = K.calibrate(pi); - CHECK( p.equals(pn_hat, 1e-5)); + CHECK( p.equals(pn_hat, 1e-8)); } Point2 uncalibrate_(const Cal3Unify& k, const Point2& pt) { return k.uncalibrate(pt); } @@ -82,7 +82,7 @@ TEST( Cal3Unify, Duncalibrate2) /* ************************************************************************* */ TEST( Cal3Unify, assert_equal) { - CHECK(assert_equal(K,K,1e-5)); + CHECK(assert_equal(K,K,1e-9)); } /* ************************************************************************* */ @@ -93,8 +93,8 @@ TEST( Cal3Unify, retract) Vector d(10); d << 2, 3, 4, 5, 6, 7, 8, 9, 10, 1; Cal3Unify actual = K.retract(d); - CHECK(assert_equal(expected,actual,1e-7)); - CHECK(assert_equal(d,K.localCoordinates(actual),1e-7)); + CHECK(assert_equal(expected,actual,1e-9)); + CHECK(assert_equal(d,K.localCoordinates(actual),1e-9)); } /* ************************************************************************* */