diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-06-12 15:13:53 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-06-12 15:13:53 +0400 |
commit | 552887251fa984cc7ff8e15aed59e82227d47c22 (patch) | |
tree | d76816f93fd577580dbd423e5347637ade211d13 /extern | |
parent | bc6929fcdd87a1eaa721459cd57a25ecfa8bf0d4 (diff) |
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.
Diffstat (limited to 'extern')
-rw-r--r-- | extern/libmv/libmv-capi.cpp | 27 | ||||
-rw-r--r-- | extern/libmv/libmv-capi.h | 24 | ||||
-rw-r--r-- | extern/libmv/libmv/tracking/track_region.cc | 9 | ||||
-rw-r--r-- | extern/libmv/libmv/tracking/track_region.h | 6 |
4 files changed, 49 insertions, 17 deletions
diff --git a/extern/libmv/libmv-capi.cpp b/extern/libmv/libmv-capi.cpp index 8751e1e190b..3d3b7398c9b 100644 --- a/extern/libmv/libmv-capi.cpp +++ b/extern/libmv/libmv-capi.cpp @@ -243,7 +243,7 @@ void savePNGImage(png_bytep *row_pointers, int width, int height, int depth, int 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 @@ static void saveImage(char *prefix, libmv::FloatImage image, int x0, int y0) 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 @@ int libmv_trackRegion(const struct libmv_trackRegionOptions *options, } 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 @@ int libmv_trackRegion(const struct libmv_trackRegionOptions *options, 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 @@ int libmv_trackRegion(const struct libmv_trackRegionOptions *options, 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); } diff --git a/extern/libmv/libmv-capi.h b/extern/libmv/libmv-capi.h index fe759b06fe4..fc3b6f94f62 100644 --- a/extern/libmv/libmv-capi.h +++ b/extern/libmv/libmv-capi.h @@ -52,18 +52,21 @@ void libmv_regionTrackerDestroy(struct libmv_RegionTracker *libmv_tracker); /* 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 @@ int libmv_trackRegion(const struct libmv_trackRegionOptions *options, 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 */ diff --git a/extern/libmv/libmv/tracking/track_region.cc b/extern/libmv/libmv/tracking/track_region.cc index e65ead50c80..f52919b2a61 100644 --- a/extern/libmv/libmv/tracking/track_region.cc +++ b/extern/libmv/libmv/tracking/track_region.cc @@ -1351,7 +1351,7 @@ void TrackRegion(const FloatImage &image1, 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 @@ bool SamplePlanarPatch(const FloatImage &image, 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; + } } } diff --git a/extern/libmv/libmv/tracking/track_region.h b/extern/libmv/libmv/tracking/track_region.h index 0de11239da6..22ecfc54a15 100644 --- a/extern/libmv/libmv/tracking/track_region.h +++ b/extern/libmv/libmv/tracking/track_region.h @@ -135,10 +135,14 @@ void TrackRegion(const FloatImage &image1, // 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 |