[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42397] branches/soc-2011-tomato: Add support for detecting tracking failure in the ESM tracker component of

Keir Mierle mierle at gmail.com
Sun Dec 4 14:46:27 CET 2011


Revision: 42397
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42397
Author:   keir
Date:     2011-12-04 13:46:25 +0000 (Sun, 04 Dec 2011)
Log Message:
-----------
Add support for detecting tracking failure in the ESM tracker component of
libmv. Since both KLT and Hybrid rely on ESM underneath, KLT and Hybrid now
have a minimum correlation setting to match. With this fix, track failures
should get detected quicker, with the issue that sometimes the tracker will
give up too easily. That is fixable by reducing the required correlation (in
the track properties).

Modified Paths:
--------------
    branches/soc-2011-tomato/extern/libmv/libmv/tracking/esm_region_tracker.cc
    branches/soc-2011-tomato/extern/libmv/libmv/tracking/esm_region_tracker.h
    branches/soc-2011-tomato/extern/libmv/libmv-capi.cpp
    branches/soc-2011-tomato/extern/libmv/libmv-capi.h
    branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py
    branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c

Modified: branches/soc-2011-tomato/extern/libmv/libmv/tracking/esm_region_tracker.cc
===================================================================
--- branches/soc-2011-tomato/extern/libmv/libmv/tracking/esm_region_tracker.cc	2011-12-04 13:26:11 UTC (rev 42396)
+++ branches/soc-2011-tomato/extern/libmv/libmv/tracking/esm_region_tracker.cc	2011-12-04 13:46:25 UTC (rev 42397)
@@ -273,11 +273,31 @@
 
     // If the step was accepted, then check for termination.
     if (d.squaredNorm() < min_update_squared_distance) {
-      if (new_error > reasonable_error) {
-        LG << "Update size shrank but reasonable error ("
-           << reasonable_error << ") not achieved; failing.";
-        return true; // XXX
+      // Compute the Pearson product-moment correlation coefficient to check
+      // for sanity.
+      // TODO(keir): Put this somewhere smarter.
+      double sX=0,sY=0,sXX=0,sYY=0,sXY=0;
+      for (int r = 0; r < width; ++r) {
+        for (int c = 0; c < width; ++c) {
+          double x = image_and_gradient1_sampled(r, c, 0);
+          double y = image_and_gradient2_sampled[new_image](r, c, 0);
+          sX += x;
+          sY += y;
+          sXX += x*x;
+          sYY += y*y;
+          sXY += x*y;
+        }
       }
+      double N = width*width;
+      sX /= N, sY /= N, sXX /= N, sYY /= N, sXY /= N;
+      double correlation = (sXY-sX*sY)/sqrt(double((sXX-sX*sX)*(sYY-sY*sY)));
+      LG << "Final correlation: " << correlation;
+
+      if (correlation < minimum_correlation) {
+        LG << "Correlation " << correlation << " greater than "
+           << minimum_correlation << "; bailing.";
+        return false;
+      }
       LG << "Successful track in " << (i + 1) << " iterations.";
       return true;
     }

Modified: branches/soc-2011-tomato/extern/libmv/libmv/tracking/esm_region_tracker.h
===================================================================
--- branches/soc-2011-tomato/extern/libmv/libmv/tracking/esm_region_tracker.h	2011-12-04 13:26:11 UTC (rev 42396)
+++ branches/soc-2011-tomato/extern/libmv/libmv/tracking/esm_region_tracker.h	2011-12-04 13:46:25 UTC (rev 42397)
@@ -38,7 +38,8 @@
         max_iterations(16),
         min_determinant(1e-6),
         min_update_squared_distance(1e-4),
-        sigma(0.9) {}
+        sigma(0.9),
+        minimum_correlation(0.78) {}
   
   virtual ~EsmRegionTracker() {}
 
@@ -54,6 +55,7 @@
   double min_determinant;
   double min_update_squared_distance;
   double sigma;
+  double minimum_correlation;
 };
 
 }  // namespace libmv

Modified: branches/soc-2011-tomato/extern/libmv/libmv-capi.cpp
===================================================================
--- branches/soc-2011-tomato/extern/libmv/libmv-capi.cpp	2011-12-04 13:26:11 UTC (rev 42396)
+++ branches/soc-2011-tomato/extern/libmv/libmv-capi.cpp	2011-12-04 13:46:25 UTC (rev 42397)
@@ -111,12 +111,13 @@
 
 /* ************ RegionTracker ************ */
 
-libmv_RegionTracker *libmv_pyramidRegionTrackerNew(int max_iterations, int pyramid_level, int half_window_size)
+libmv_RegionTracker *libmv_pyramidRegionTrackerNew(int max_iterations, int pyramid_level, int half_window_size, double minimum_correlation)
 {
 	libmv::EsmRegionTracker *esm_region_tracker = new libmv::EsmRegionTracker;
 	esm_region_tracker->half_window_size = half_window_size;
 	esm_region_tracker->max_iterations = max_iterations;
 	esm_region_tracker->min_determinant = 1e-4;
+	esm_region_tracker->minimum_correlation = minimum_correlation;
 
 	libmv::PyramidRegionTracker *pyramid_region_tracker =
 		new libmv::PyramidRegionTracker(esm_region_tracker, pyramid_level);
@@ -124,12 +125,13 @@
 	return (libmv_RegionTracker *)pyramid_region_tracker;
 }
 
-libmv_RegionTracker *libmv_hybridRegionTrackerNew(int max_iterations, int half_window_size)
+libmv_RegionTracker *libmv_hybridRegionTrackerNew(int max_iterations, int half_window_size, double minimum_correlation)
 {
 	libmv::EsmRegionTracker *esm_region_tracker = new libmv::EsmRegionTracker;
 	esm_region_tracker->half_window_size = half_window_size;
 	esm_region_tracker->max_iterations = max_iterations;
 	esm_region_tracker->min_determinant = 1e-4;
+	esm_region_tracker->minimum_correlation = minimum_correlation;
 
 	libmv::BruteRegionTracker *brute_region_tracker = new libmv::BruteRegionTracker;
   brute_region_tracker->half_window_size = half_window_size;

Modified: branches/soc-2011-tomato/extern/libmv/libmv-capi.h
===================================================================
--- branches/soc-2011-tomato/extern/libmv/libmv-capi.h	2011-12-04 13:26:11 UTC (rev 42396)
+++ branches/soc-2011-tomato/extern/libmv/libmv-capi.h	2011-12-04 13:46:25 UTC (rev 42397)
@@ -43,8 +43,8 @@
 void libmv_setLoggingVerbosity(int verbosity);
 
 /* RegionTracker */
-struct libmv_RegionTracker *libmv_pyramidRegionTrackerNew(int max_iterations, int pyramid_level, int half_window_size);
-struct libmv_RegionTracker *libmv_hybridRegionTrackerNew(int max_iterations, int half_window_size);
+struct libmv_RegionTracker *libmv_pyramidRegionTrackerNew(int max_iterations, int pyramid_level, int half_window_size, double minimum_correlation);
+struct libmv_RegionTracker *libmv_hybridRegionTrackerNew(int max_iterations, int half_window_size, double minimum_correlation);
 int libmv_regionTrackerTrack(struct libmv_RegionTracker *libmv_tracker, const float *ima1, const float *ima2,
 			int width, int height, double  x1, double  y1, double *x2, double *y2);
 void libmv_regionTrackerDestroy(struct libmv_RegionTracker *libmv_tracker);

Modified: branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py
===================================================================
--- branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py	2011-12-04 13:26:11 UTC (rev 42396)
+++ branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py	2011-12-04 13:46:25 UTC (rev 42397)
@@ -503,8 +503,7 @@
 
             if active.tracker == 'KLT':
                 col.prop(active, "pyramid_levels")
-            elif active.tracker == 'SAD':
-                col.prop(active, "correlation_min")
+            col.prop(active, "correlation_min")
 
             col.separator()
             col.prop(active, "frames_limit")

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2011-12-04 13:26:11 UTC (rev 42396)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2011-12-04 13:46:25 UTC (rev 42397)
@@ -77,7 +77,6 @@
 	tracking->camera.units= CAMERA_UNITS_MM;
 
 	tracking->settings.default_tracker= TRACKER_KLT;
-	tracking->settings.default_pyramid_levels= 2;
 	tracking->settings.default_minimum_correlation= 0.75;
 	tracking->settings.default_pattern_size= 11;
 	tracking->settings.default_search_size= 51;
@@ -810,9 +809,9 @@
 							int level= MIN2(track->pyramid_levels, max_pyramid_levels);
 
 							if(track->tracker==TRACKER_KLT)
-								track_context.region_tracker= libmv_pyramidRegionTrackerNew(100, level, MAX2(wndx, wndy));
+								track_context.region_tracker= libmv_pyramidRegionTrackerNew(100, level, MAX2(wndx, wndy), track->minimum_correlation);
 							else
-								track_context.region_tracker= libmv_hybridRegionTrackerNew(100, MAX2(wndx, wndy));
+								track_context.region_tracker= libmv_hybridRegionTrackerNew(100, MAX2(wndx, wndy), track->minimum_correlation);
 						}
 						else if(track->tracker==TRACKER_SAD) {
 							track_context.pattern_size= MAX2(patx, paty);




More information about the Bf-blender-cvs mailing list