From d10abe6d4d6792bf0f9d6dbeed75acb9e46f210f Mon Sep 17 00:00:00 2001 From: Keir Mierle Date: Mon, 28 Oct 2013 18:34:19 +0000 Subject: Fix bug where libmv tracking incorrectly succeeds on failure Before this patch, if Ceres returned USER_SUCCESS indicating that Ceres was only changing the tracked quad slightly between iterations (indicating convergence), no final correlation check was done. This leads to incorrectly returning that the tracking was successful, when it actually failed. --- extern/libmv/libmv/tracking/track_region.cc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'extern') diff --git a/extern/libmv/libmv/tracking/track_region.cc b/extern/libmv/libmv/tracking/track_region.cc index 349d84b3817..786f16bf219 100644 --- a/extern/libmv/libmv/tracking/track_region.cc +++ b/extern/libmv/libmv/tracking/track_region.cc @@ -1450,16 +1450,6 @@ void TemplatedTrackRegion(const FloatImage &image1, return; } - // This happens when the minimum corner shift tolerance is reached. Due to - // how the tolerance is computed this can't be done by Ceres. So return the - // same termination enum as Ceres, even though this is slightly different - // than Ceres's parameter tolerance, which operates on the raw parameter - // values rather than the pixel shifts of the patch corners. - if (summary.termination_type == ceres::USER_SUCCESS) { - result->termination = TrackRegionResult::PARAMETER_TOLERANCE; - return; - } - #define HANDLE_TERMINATION(termination_enum) \ if (summary.termination_type == ceres::termination_enum) { \ result->termination = TrackRegionResult::termination_enum; \ @@ -1481,6 +1471,16 @@ void TemplatedTrackRegion(const FloatImage &image1, } } + // This happens when the minimum corner shift tolerance is reached. Due to + // how the tolerance is computed this can't be done by Ceres. So return the + // same termination enum as Ceres, even though this is slightly different + // than Ceres's parameter tolerance, which operates on the raw parameter + // values rather than the pixel shifts of the patch corners. + if (summary.termination_type == ceres::USER_SUCCESS) { + result->termination = TrackRegionResult::PARAMETER_TOLERANCE; + return; + } + HANDLE_TERMINATION(PARAMETER_TOLERANCE); HANDLE_TERMINATION(FUNCTION_TOLERANCE); HANDLE_TERMINATION(GRADIENT_TOLERANCE); -- cgit v1.2.3