[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47739] trunk/blender: Scale search area when doing planar tracking

Sergey Sharybin sergey.vfx at gmail.com
Mon Jun 11 13:40:55 CEST 2012


Revision: 47739
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47739
Author:   nazgul
Date:     2012-06-11 11:40:54 +0000 (Mon, 11 Jun 2012)
Log Message:
-----------
Scale search area when doing planar tracking

Helps keeping features tracked when there's large scale happens
without need to manually re-adjust search area.

Currently using factor of pattern's boundbox scale, but probably
could be done in more accurate way?

Modified Paths:
--------------
    trunk/blender/extern/libmv/libmv-capi.cpp
    trunk/blender/extern/libmv/libmv-capi.h
    trunk/blender/source/blender/blenkernel/BKE_tracking.h
    trunk/blender/source/blender/blenkernel/intern/tracking.c

Modified: trunk/blender/extern/libmv/libmv-capi.cpp
===================================================================
--- trunk/blender/extern/libmv/libmv-capi.cpp	2012-06-11 11:40:36 UTC (rev 47738)
+++ trunk/blender/extern/libmv/libmv-capi.cpp	2012-06-11 11:40:54 UTC (rev 47739)
@@ -357,8 +357,8 @@
 
 /* TrackRegion (new planar tracker) */
 int libmv_trackRegion(const struct libmv_trackRegionOptions *options,
-                      const float *image1, const float *image2,
-                      int width, int height, 
+                      const float *image1, int image1_width, int image1_height,
+                      const float *image2, int image2_width, int image2_height,
                       const double *x1, const double *y1,
                       struct libmv_trackRegionResult *result,
                       double *x2, double *y2)
@@ -400,8 +400,8 @@
 
 	/* Convert from raw float buffers to libmv's FloatImage. */
 	libmv::FloatImage old_patch, new_patch;
-	floatBufToImage(image1, width, height, 1, &old_patch);
-	floatBufToImage(image2, width, height, 1, &new_patch);
+	floatBufToImage(image1, image1_width, image1_height, 1, &old_patch);
+	floatBufToImage(image2, image2_width, image2_height, 1, &new_patch);
 
 	libmv::TrackRegionResult track_region_result;
 	libmv::TrackRegion(old_patch, new_patch, xx1, yy1, track_region_options, xx2, yy2, &track_region_result);

Modified: trunk/blender/extern/libmv/libmv-capi.h
===================================================================
--- trunk/blender/extern/libmv/libmv-capi.h	2012-06-11 11:40:36 UTC (rev 47738)
+++ trunk/blender/extern/libmv/libmv-capi.h	2012-06-11 11:40:54 UTC (rev 47739)
@@ -65,8 +65,8 @@
   double correlation;
 };
 int libmv_trackRegion(const struct libmv_trackRegionOptions *options,
-                      const float *image1, const float *image2,
-                      int width, int height, 
+                      const float *image1, int image1_width, int image1_height,
+                      const float *image2, int image2_width, int image2_height,
                       const double *x1, const double *y1,
                       struct libmv_trackRegionResult *result,
                       double *x2, double *y2);

Modified: trunk/blender/source/blender/blenkernel/BKE_tracking.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_tracking.h	2012-06-11 11:40:36 UTC (rev 47738)
+++ trunk/blender/source/blender/blenkernel/BKE_tracking.h	2012-06-11 11:40:54 UTC (rev 47739)
@@ -57,7 +57,7 @@
                                                        struct MovieTrackingMarker *marker);
 void BKE_tracking_delete_marker(struct MovieTrackingTrack *track, int framenr);
 
-void BKE_tracking_marker_pattern_minmax(struct MovieTrackingMarker *marker, float min[2], float max[2]);
+void BKE_tracking_marker_pattern_minmax(const struct MovieTrackingMarker *marker, float min[2], float max[2]);
 struct MovieTrackingMarker *BKE_tracking_get_marker(struct MovieTrackingTrack *track, int framenr);
 struct MovieTrackingMarker *BKE_tracking_ensure_marker(struct MovieTrackingTrack *track, int framenr);
 struct MovieTrackingMarker *BKE_tracking_exact_marker(struct MovieTrackingTrack *track, int framenr);

Modified: trunk/blender/source/blender/blenkernel/intern/tracking.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/tracking.c	2012-06-11 11:40:36 UTC (rev 47738)
+++ trunk/blender/source/blender/blenkernel/intern/tracking.c	2012-06-11 11:40:54 UTC (rev 47739)
@@ -440,7 +440,7 @@
 	}
 }
 
-void BKE_tracking_marker_pattern_minmax(MovieTrackingMarker *marker, float min[2], float max[2])
+void BKE_tracking_marker_pattern_minmax(const MovieTrackingMarker *marker, float min[2], float max[2])
 {
 	INIT_MINMAX2(min, max);
 
@@ -1606,6 +1606,25 @@
 	return ibuf;
 }
 
+static void marker_search_scale_after_tracking(const MovieTrackingMarker *old_marker, MovieTrackingMarker *new_marker)
+{
+	float old_pat_min[2], old_pat_max[2];
+	float new_pat_min[2], new_pat_max[2];
+	float scale_x, scale_y;
+
+	BKE_tracking_marker_pattern_minmax(old_marker, old_pat_min, old_pat_max);
+	BKE_tracking_marker_pattern_minmax(new_marker, new_pat_min, new_pat_max);
+
+	scale_x = (new_pat_max[0] - new_pat_min[0]) / (old_pat_max[0] - old_pat_min[0]);
+	scale_y = (new_pat_max[1] - new_pat_min[1]) / (old_pat_max[1] - old_pat_min[1]);
+
+	new_marker->search_min[0] *= scale_x;
+	new_marker->search_min[1] *= scale_y;
+
+	new_marker->search_max[0] *= scale_x;
+	new_marker->search_max[1] *= scale_y;
+}
+
 #endif
 
 void BKE_tracking_sync(MovieTrackingContext *context)
@@ -1752,8 +1771,10 @@
 
 				/* Run the tracker! */
 				tracked = libmv_trackRegion(&options,
-				                            track_context->search_area, patch_new,
-				                            width, height,
+				                            track_context->search_area,
+											track_context->search_area_width,
+											track_context->search_area_height,
+											patch_new, width, height,
 				                            src_pixel_x, src_pixel_y,
 				                            &result,
 				                            dst_pixel_x, dst_pixel_y);
@@ -1767,6 +1788,8 @@
 				marker_new.flag |= MARKER_TRACKED;
 				marker_new.framenr = nextfra;
 
+				marker_search_scale_after_tracking(marker, &marker_new);
+
 				#pragma omp critical
 				{
 					if (context->first_time) {




More information about the Bf-blender-cvs mailing list