[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