Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/extern
diff options
context:
space:
mode:
authorKeir Mierle <mierle@gmail.com>2011-10-30 16:42:56 +0400
committerKeir Mierle <mierle@gmail.com>2011-10-30 16:42:56 +0400
commitdb86c6bcf810fc7cd2e311634c3caf42bd8ade1e (patch)
tree2a01197754932a5057fd5e1350d4ac67e7e8c17e /extern
parente4cbb8dd94e59d305ec97c0e5512ea87f2c65def (diff)
Improve the KLT tracking behaviour and UI
- Remove the overly-conservative use of libmv's re-track tracker. The re-track tracker would take a normal tracker such as TRKLT or KLT or pyramid KLT, and track from frame 1 to 2, then back from the position found in 2 back to 1. Then, when the reverse-track doesn't match the original track with high precision, the track is considered "failed". This is a good approach for fully automatic reconstruction, but is too conservative for supervised tracking. The retrack-tracker will return when fully automatic tracking is added. - Always solve for (dx, dy) in the TRKLT loop even if the linear system is ill-conditioned. The client (Blender in this case) can still use the solved position, even though it is less reliable. - Expose the pyramid level setting to the tracking UI when in KLT tracking mode. While it was tempting to hide this detail from the user, in reality it does more harm than good, since the way tracking fails depends on the pyramid level. For now, exposing the pyramid details is a good compromise. - Move the settings for the tracking algorithm, including search window, tracking algorithm, pyramid levels, etc, into the track object instead of a global movie clip object.
Diffstat (limited to 'extern')
-rw-r--r--extern/libmv/libmv-capi.cpp11
-rw-r--r--extern/libmv/libmv-capi.h2
-rw-r--r--extern/libmv/libmv/tracking/pyramid_region_tracker.cc2
-rw-r--r--extern/libmv/libmv/tracking/trklt_region_tracker.cc34
-rw-r--r--extern/libmv/libmv/tracking/trklt_region_tracker.h2
5 files changed, 21 insertions, 30 deletions
diff --git a/extern/libmv/libmv-capi.cpp b/extern/libmv/libmv-capi.cpp
index f1672581819..2e007bb47b2 100644
--- a/extern/libmv/libmv-capi.cpp
+++ b/extern/libmv/libmv-capi.cpp
@@ -36,7 +36,6 @@
#include "libmv/tracking/klt_region_tracker.h"
#include "libmv/tracking/trklt_region_tracker.h"
#include "libmv/tracking/pyramid_region_tracker.h"
-#include "libmv/tracking/retrack_region_tracker.h"
#include "libmv/tracking/sad.h"
@@ -61,7 +60,6 @@
typedef struct libmv_RegionTracker {
libmv::TrkltRegionTracker *trklt_region_tracker;
- libmv::PyramidRegionTracker *pyramid_region_tracker;
libmv::RegionTracker *region_tracker;
} libmv_RegionTracker;
@@ -112,22 +110,19 @@ void libmv_setLoggingVerbosity(int verbosity)
/* ************ RegionTracker ************ */
-libmv_RegionTracker *libmv_regionTrackerNew(int max_iterations, int pyramid_level, double tolerance)
+libmv_RegionTracker *libmv_regionTrackerNew(int max_iterations, int pyramid_level)
{
- libmv::RegionTracker *region_tracker;
libmv::TrkltRegionTracker *trklt_region_tracker = new libmv::TrkltRegionTracker;
trklt_region_tracker->half_window_size = DEFAULT_WINDOW_HALFSIZE;
trklt_region_tracker->max_iterations = max_iterations;
+ trklt_region_tracker->min_determinant = 1e-4;
- libmv::PyramidRegionTracker *pyramid_region_tracker =
+ libmv::PyramidRegionTracker *region_tracker =
new libmv::PyramidRegionTracker(trklt_region_tracker, pyramid_level);
- region_tracker = new libmv::RetrackRegionTracker(pyramid_region_tracker, tolerance);
-
libmv_RegionTracker *configured_region_tracker = new libmv_RegionTracker;
configured_region_tracker->trklt_region_tracker = trklt_region_tracker;
- configured_region_tracker->pyramid_region_tracker = pyramid_region_tracker;
configured_region_tracker->region_tracker = region_tracker;
return configured_region_tracker;
diff --git a/extern/libmv/libmv-capi.h b/extern/libmv/libmv-capi.h
index 7d7d2fbeed8..b71a66b73a6 100644
--- a/extern/libmv/libmv-capi.h
+++ b/extern/libmv/libmv-capi.h
@@ -43,7 +43,7 @@ void libmv_startDebugLogging(void);
void libmv_setLoggingVerbosity(int verbosity);
/* RegionTracker */
-struct libmv_RegionTracker *libmv_regionTrackerNew(int max_iterations, int pyramid_level, double tolerance);
+struct libmv_RegionTracker *libmv_regionTrackerNew(int max_iterations, int pyramid_level);
int libmv_regionTrackerTrack(struct libmv_RegionTracker *libmv_tracker, const float *ima1, const float *ima2,
int width, int height, int half_window_size,
double x1, double y1, double *x2, double *y2);
diff --git a/extern/libmv/libmv/tracking/pyramid_region_tracker.cc b/extern/libmv/libmv/tracking/pyramid_region_tracker.cc
index 30e2839c5b1..58f42b26d7c 100644
--- a/extern/libmv/libmv/tracking/pyramid_region_tracker.cc
+++ b/extern/libmv/libmv/tracking/pyramid_region_tracker.cc
@@ -23,6 +23,7 @@
#include "libmv/image/convolve.h"
#include "libmv/image/image.h"
#include "libmv/image/sample.h"
+#include "libmv/logging/logging.h"
#include "libmv/tracking/pyramid_region_tracker.h"
namespace libmv {
@@ -69,6 +70,7 @@ bool PyramidRegionTracker::Track(const FloatImage &image1,
// Only fail on the highest-resolution level, because a failure on a
// coarse level does not mean failure at a lower level (consider
// out-of-bounds conditions).
+ LG << "Finest level of pyramid tracking failed; failing.";
return false;
}
}
diff --git a/extern/libmv/libmv/tracking/trklt_region_tracker.cc b/extern/libmv/libmv/tracking/trklt_region_tracker.cc
index 65aab37bc85..94319fcb7d3 100644
--- a/extern/libmv/libmv/tracking/trklt_region_tracker.cc
+++ b/extern/libmv/libmv/tracking/trklt_region_tracker.cc
@@ -79,19 +79,6 @@ static void ComputeTrackingEquation(const Array3Df &image_and_gradient1,
*e = (A + lambda*Mat2f::Identity())*Di*(V - W) + 0.5*(S - R);
}
-static bool SolveTrackingEquation(const Mat2f &U,
- const Vec2f &e,
- float min_determinant,
- Vec2f *d) {
- float det = U.determinant();
- if (det < min_determinant) {
- d->setZero();
- return false;
- }
- *d = U.lu().solve(e);
- return true;
-}
-
bool TrkltRegionTracker::Track(const FloatImage &image1,
const FloatImage &image2,
double x1, double y1,
@@ -116,17 +103,24 @@ bool TrkltRegionTracker::Track(const FloatImage &image1,
&U, &e);
// Solve the linear system for the best update to x2 and y2.
- if (!SolveTrackingEquation(U, e, min_determinant, &d)) {
- // The determinant, which indicates the trackiness of the point, is too
- // small, so fail out.
- LG << "Determinant too small; failing tracking.";
- return false;
- }
+ d = U.lu().solve(e);
// Update the position with the solved displacement.
*x2 += d[0];
*y2 += d[1];
+ // Check for the quality of the solution, but not until having already
+ // updated the position with our best estimate. The reason to do the update
+ // anyway is that the user already knows the position is bad, so we may as
+ // well try our best.
+ float determinant = U.determinant();
+ if (fabs(determinant) < min_determinant) {
+ // The determinant, which indicates the trackiness of the point, is too
+ // small, so fail out.
+ LG << "Determinant " << determinant << " is too small; failing tracking.";
+ return false;
+ }
+
// If the update is small, then we probably found the target.
if (d.squaredNorm() < min_update_squared_distance) {
LG << "Successful track in " << i << " iterations.";
@@ -134,7 +128,7 @@ bool TrkltRegionTracker::Track(const FloatImage &image1,
}
}
// Getting here means we hit max iterations, so tracking failed.
- LG << "Too many iterations.";
+ LG << "Too many iterations; max is set to " << max_iterations << ".";
return false;
}
diff --git a/extern/libmv/libmv/tracking/trklt_region_tracker.h b/extern/libmv/libmv/tracking/trklt_region_tracker.h
index d5052395c55..5046e0f069d 100644
--- a/extern/libmv/libmv/tracking/trklt_region_tracker.h
+++ b/extern/libmv/libmv/tracking/trklt_region_tracker.h
@@ -37,7 +37,7 @@ namespace libmv {
struct TrkltRegionTracker : public RegionTracker {
TrkltRegionTracker()
: half_window_size(4),
- max_iterations(16),
+ max_iterations(100),
min_determinant(1e-6),
min_update_squared_distance(1e-6),
sigma(0.9),