[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47782] trunk/blender: Masking support for motion tracks

Sergey Sharybin sergey.vfx at gmail.com
Tue Jun 12 13:13:57 CEST 2012


Revision: 47782
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47782
Author:   nazgul
Date:     2012-06-12 11:13:53 +0000 (Tue, 12 Jun 2012)
Log Message:
-----------
Masking support for motion tracks

Added option to use Grease Pencil datablock as a mask for pattern
when doing motion tracking. Option could be found in Tracking Settings
panel.

All strokes would be rasterized separately from each other and every
stroke is treating as a closed spline.

Also added option to apply a mask on track preview which is situated
just after B/B/W channel button under track preview.

Modified Paths:
--------------
    trunk/blender/extern/libmv/libmv/tracking/track_region.cc
    trunk/blender/extern/libmv/libmv/tracking/track_region.h
    trunk/blender/extern/libmv/libmv-capi.cpp
    trunk/blender/extern/libmv/libmv-capi.h
    trunk/blender/release/scripts/startup/bl_ui/space_clip.py
    trunk/blender/source/blender/blenkernel/BKE_tracking.h
    trunk/blender/source/blender/blenkernel/intern/movieclip.c
    trunk/blender/source/blender/blenkernel/intern/tracking.c
    trunk/blender/source/blender/editors/interface/interface_draw.c
    trunk/blender/source/blender/editors/interface/interface_handlers.c
    trunk/blender/source/blender/editors/space_clip/space_clip.c
    trunk/blender/source/blender/makesdna/DNA_movieclip_types.h
    trunk/blender/source/blender/makesdna/DNA_tracking_types.h
    trunk/blender/source/blender/makesrna/intern/rna_tracking.c

Modified: trunk/blender/extern/libmv/libmv/tracking/track_region.cc
===================================================================
--- trunk/blender/extern/libmv/libmv/tracking/track_region.cc	2012-06-12 10:50:23 UTC (rev 47781)
+++ trunk/blender/extern/libmv/libmv/tracking/track_region.cc	2012-06-12 11:13:53 UTC (rev 47782)
@@ -1351,7 +1351,7 @@
 bool SamplePlanarPatch(const FloatImage &image,
                        const double *xs, const double *ys,
                        int num_samples_x, int num_samples_y,
-                       FloatImage *patch,
+                       FloatImage *mask, FloatImage *patch,
                        double *warped_position_x, double *warped_position_y) {
   // Bail early if the points are outside the image.
   if (!AllInBounds(image, xs, ys)) {
@@ -1376,6 +1376,13 @@
       SampleLinear(image, image_position(1),
                    image_position(0),
                    &(*patch)(r, c, 0));
+      if (mask) {
+        float maskValue = SampleLinear(*mask, image_position(1),
+                                       image_position(0), 0);
+
+        for (int d = 0; d < image.Depth(); d++)
+          (*patch)(r, c, d) *= maskValue;
+      }
     }
   }
 

Modified: trunk/blender/extern/libmv/libmv/tracking/track_region.h
===================================================================
--- trunk/blender/extern/libmv/libmv/tracking/track_region.h	2012-06-12 10:50:23 UTC (rev 47781)
+++ trunk/blender/extern/libmv/libmv/tracking/track_region.h	2012-06-12 11:13:53 UTC (rev 47782)
@@ -135,10 +135,14 @@
 // pixels of border around them. (so e.g. a corner of the patch cannot lie
 // directly on the edge of the image). Four corners are always required. All
 // channels are interpolated.
+// When mask is not null it'll be used as a pattern mask. Ot should match
+// the size of image.
+// Warped coordinates of marker's position would be returned in
+// warped_position_x and warped_position_y
 bool SamplePlanarPatch(const FloatImage &image,
                        const double *xs, const double *ys,
                        int num_samples_x, int num_samples_y,
-                       FloatImage *patch,
+                       FloatImage *mask, FloatImage *patch,
                        double *warped_position_x, double *warped_position_y);
 
 }  // namespace libmv

Modified: trunk/blender/extern/libmv/libmv-capi.cpp
===================================================================
--- trunk/blender/extern/libmv/libmv-capi.cpp	2012-06-12 10:50:23 UTC (rev 47781)
+++ trunk/blender/extern/libmv/libmv-capi.cpp	2012-06-12 11:13:53 UTC (rev 47782)
@@ -243,7 +243,7 @@
 	fclose(fp);
 }
 
-static void saveImage(char *prefix, libmv::FloatImage image, int x0, int y0)
+static void saveImage(const char *prefix, libmv::FloatImage image, int x0, int y0)
 {
 	int x, y;
 	png_bytep *row_pointers;
@@ -283,7 +283,7 @@
 	free(row_pointers);
 }
 
-static void saveBytesImage(char *prefix, unsigned char *data, int width, int height)
+static void saveBytesImage(const char *prefix, unsigned char *data, int width, int height)
 {
 	int x, y;
 	png_bytep *row_pointers;
@@ -376,6 +376,8 @@
 	}
 
 	libmv::TrackRegionOptions track_region_options;
+	libmv::FloatImage image1_mask;
+
 	switch (options->motion_model) {
 #define LIBMV_CONVERT(the_model) \
     case libmv::TrackRegionOptions::the_model: \
@@ -398,6 +400,12 @@
 	track_region_options.use_brute_initialization = options->use_brute;
 	track_region_options.use_normalized_intensities = options->use_normalization;
 
+	if (options->image1_mask) {
+		floatBufToImage(options->image1_mask, image1_width, image1_height, 1, &image1_mask);
+
+		track_region_options.image1_mask = &image1_mask;
+	}
+
 	/* Convert from raw float buffers to libmv's FloatImage. */
 	libmv::FloatImage old_patch, new_patch;
 	floatBufToImage(image1, image1_width, image1_height, 1, &old_patch);
@@ -437,15 +445,24 @@
 
 void libmv_samplePlanarPatch(const float *image, int width, int height,
                              int channels, const double *xs, const double *ys,
-                             int num_samples_x, int num_samples_y, float *patch,
+                             int num_samples_x, int num_samples_y,
+                             const float *mask, float *patch,
                              double *warped_position_x, double *warped_position_y)
 {
-	libmv::FloatImage libmv_image, libmv_patch;
+	libmv::FloatImage libmv_image, libmv_patch, libmv_mask;
+	libmv::FloatImage *libmv_mask_for_sample = NULL;
 
 	floatBufToImage(image, width, height, channels, &libmv_image);
 
+	if (mask) {
+		floatBufToImage(mask, width, height, 1, &libmv_mask);
+
+		libmv_mask_for_sample = &libmv_mask;
+	}
+
 	libmv::SamplePlanarPatch(libmv_image, xs, ys, num_samples_x, num_samples_y,
-	                         &libmv_patch, warped_position_x, warped_position_y);
+	                         libmv_mask_for_sample, &libmv_patch,
+	                         warped_position_x, warped_position_y);
 
 	imageToFloatBuf(&libmv_patch, channels, patch);
 }

Modified: trunk/blender/extern/libmv/libmv-capi.h
===================================================================
--- trunk/blender/extern/libmv/libmv-capi.h	2012-06-12 10:50:23 UTC (rev 47781)
+++ trunk/blender/extern/libmv/libmv-capi.h	2012-06-12 11:13:53 UTC (rev 47782)
@@ -52,18 +52,21 @@
 
 /* TrackRegion (new planar tracker) */
 struct libmv_trackRegionOptions {
-  int motion_model;
-  int num_iterations;
-  int use_brute;
-  int use_normalization;
-  double minimum_correlation;
-  double sigma;
+	int motion_model;
+	int num_iterations;
+	int use_brute;
+	int use_normalization;
+	double minimum_correlation;
+	double sigma;
+	float *image1_mask;
 };
+
 struct libmv_trackRegionResult {
-  int termination;
-  const char *termination_reason;
-  double correlation;
+	int termination;
+	const char *termination_reason;
+	double correlation;
 };
+
 int libmv_trackRegion(const struct libmv_trackRegionOptions *options,
                       const float *image1, int image1_width, int image1_height,
                       const float *image2, int image2_width, int image2_height,
@@ -73,7 +76,8 @@
 
 void libmv_samplePlanarPatch(const float *image, int width, int height,
                              int channels, const double *xs, const double *ys,
-                             int num_samples_x, int num_samples_y, float *patch,
+                             int num_samples_x, int num_samples_y,
+                             const float *mask, float *patch,
                              double *warped_position_x, double *warped_position_y);
 
 /* Tracks */

Modified: trunk/blender/release/scripts/startup/bl_ui/space_clip.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_clip.py	2012-06-12 10:50:23 UTC (rev 47781)
+++ trunk/blender/release/scripts/startup/bl_ui/space_clip.py	2012-06-12 11:13:53 UTC (rev 47782)
@@ -233,6 +233,7 @@
             col.prop(settings, "default_motion_model")
             col.prop(settings, "default_use_brute")
             col.prop(settings, "default_use_normalization")
+            col.prop(settings, "default_use_mask")
             col.prop(settings, "default_correlation_min")
 
             col.separator()
@@ -541,6 +542,10 @@
         sub = row.row()
         sub.prop(act_track, "use_grayscale_preview", text="B/W", toggle=True)
 
+        row.separator()
+        sub = row.row()
+        sub.prop(act_track, "use_alpha_preview", text="", toggle=True, icon='IMAGE_ALPHA')
+
         layout.separator()
 
         row = layout.row(align=True)
@@ -580,6 +585,7 @@
             col.prop(active, "motion_model")
             col.prop(active, "use_brute")
             col.prop(active, "use_normalization")
+            col.prop(active, "use_mask")
             col.prop(active, "correlation_min")
 
             col.separator()

Modified: trunk/blender/source/blender/blenkernel/BKE_tracking.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_tracking.h	2012-06-12 10:50:23 UTC (rev 47781)
+++ trunk/blender/source/blender/blenkernel/BKE_tracking.h	2012-06-12 11:13:53 UTC (rev 47782)
@@ -72,14 +72,15 @@
 void BKE_tracking_free(struct MovieTracking *tracking);
 
 struct ImBuf *BKE_tracking_sample_pattern_imbuf(int frame_width, int frame_height,
-                                                struct ImBuf *struct_ibuf, struct MovieTrackingMarker *marker,
+                                                struct ImBuf *struct_ibuf, struct MovieTrackingTrack *track,
+                                                struct MovieTrackingMarker *marker, int use_mask,
                                                 int num_samples_x, int num_samples_y, float pos[2]);
 struct ImBuf *BKE_tracking_get_pattern_imbuf(struct ImBuf *ibuf, struct MovieTrackingTrack *track,
                                              struct MovieTrackingMarker *marker, int anchored, int disable_channels);
 struct ImBuf *BKE_tracking_get_search_imbuf(struct ImBuf *ibuf, struct MovieTrackingTrack *track,
                                             struct MovieTrackingMarker *marker, int anchored, int disable_channels);
-struct ImBuf *BKE_tracking_track_mask_get(struct MovieTracking *tracking, struct MovieTrackingTrack *track,
-                                          struct MovieTrackingMarker *marker, int width, int height);
+float *BKE_tracking_track_mask_get(int frame_width, int frame_height, struct MovieTrackingTrack *track,
+                                   struct MovieTrackingMarker *marker);
 
 void BKE_track_unique_name(struct ListBase *tracksbase, struct MovieTrackingTrack *track);
 

Modified: trunk/blender/source/blender/blenkernel/intern/movieclip.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/movieclip.c	2012-06-12 10:50:23 UTC (rev 47781)
+++ trunk/blender/source/blender/blenkernel/intern/movieclip.c	2012-06-12 11:13:53 UTC (rev 47782)
@@ -1039,6 +1039,7 @@
 
 	scopes->marker = NULL;
 	scopes->track = NULL;
+	scopes->track_locked = TRUE;
 
 	if (clip) {
 		MovieTrackingTrack *act_track = BKE_tracking_active_track(&clip->tracking);
@@ -1055,6 +1056,8 @@
 				ImBuf *ibuf = BKE_movieclip_get_ibuf(clip, user);
 
 				scopes->track_disabled = FALSE;
+				scopes->marker = marker;
+				scopes->track = track;
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list