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.
This commit is contained in:
Keir Mierle 2013-10-28 18:34:19 +00:00
parent 869031f6be
commit d10abe6d4d

@ -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);