Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--intern/libmv/intern/track_region.cc14
-rw-r--r--intern/libmv/intern/track_region.h6
-rw-r--r--intern/libmv/libmv/autotrack/autotrack.cc15
-rw-r--r--intern/libmv/libmv/autotrack/predict_tracks.cc18
-rw-r--r--intern/libmv/libmv/autotrack/predict_tracks.h20
-rw-r--r--intern/libmv/libmv/tracking/track_region.cc3
-rw-r--r--intern/libmv/libmv/tracking/track_region.h6
-rw-r--r--source/blender/blenkernel/intern/tracking_auto.c3
-rw-r--r--source/blender/blenkernel/intern/tracking_region_tracker.c7
-rw-r--r--source/blender/blenkernel/tracking_private.h1
10 files changed, 84 insertions, 9 deletions
diff --git a/intern/libmv/intern/track_region.cc b/intern/libmv/intern/track_region.cc
index 334e331c7a8..f434906407b 100644
--- a/intern/libmv/intern/track_region.cc
+++ b/intern/libmv/intern/track_region.cc
@@ -39,6 +39,19 @@ using libmv::TrackRegionResult;
namespace {
+TrackRegionOptions::Direction convertDirection(
+ libmv_TrackRegionDirection direction) {
+ switch (direction) {
+ case LIBMV_TRACK_REGION_FORWARD: return TrackRegionOptions::FORWARD;
+ case LIBMV_TRACK_REGION_BACKWARD: return TrackRegionOptions::BACKWARD;
+ }
+
+ LOG(FATAL) << "Unhandled tracking direction " << direction
+ << ", should never happen.";
+
+ return TrackRegionOptions::FORWARD;
+}
+
TrackRegionOptions::Mode convertMotionModelToMode(int motion_model) {
switch (motion_model) {
#define LIBMV_CONVERT(the_model) \
@@ -65,6 +78,7 @@ TrackRegionOptions::Mode convertMotionModelToMode(int motion_model) {
void libmv_configureTrackRegionOptions(
const libmv_TrackRegionOptions& options,
TrackRegionOptions* track_region_options) {
+ track_region_options->direction = convertDirection(options.direction);
track_region_options->mode = convertMotionModelToMode(options.motion_model);
track_region_options->minimum_correlation = options.minimum_correlation;
track_region_options->max_iterations = options.num_iterations;
diff --git a/intern/libmv/intern/track_region.h b/intern/libmv/intern/track_region.h
index 4566fe9bf0f..2f10105ccd5 100644
--- a/intern/libmv/intern/track_region.h
+++ b/intern/libmv/intern/track_region.h
@@ -24,7 +24,13 @@
extern "C" {
#endif
+typedef enum libmv_TrackRegionDirection {
+ LIBMV_TRACK_REGION_FORWARD,
+ LIBMV_TRACK_REGION_BACKWARD,
+} libmv_TrackRegionDirection;
+
typedef struct libmv_TrackRegionOptions {
+ libmv_TrackRegionDirection direction;
int motion_model;
int num_iterations;
int use_brute;
diff --git a/intern/libmv/libmv/autotrack/autotrack.cc b/intern/libmv/libmv/autotrack/autotrack.cc
index c18567a5f28..afdf48912e5 100644
--- a/intern/libmv/libmv/autotrack/autotrack.cc
+++ b/intern/libmv/libmv/autotrack/autotrack.cc
@@ -115,14 +115,27 @@ FrameAccessor::Key GetMaskForMarker(const Marker& marker,
marker.clip, marker.frame, marker.track, &region, mask);
}
+PredictDirection getPredictDirection(const TrackRegionOptions* track_options) {
+ switch (track_options->direction) {
+ case TrackRegionOptions::FORWARD: return PredictDirection::FORWARD;
+ case TrackRegionOptions::BACKWARD: return PredictDirection::BACKWARD;
+ }
+
+ LOG(FATAL) << "Unhandled tracking direction " << track_options->direction
+ << ", should never happen.";
+
+ return PredictDirection::AUTO;
+}
+
} // namespace
bool AutoTrack::TrackMarker(Marker* tracked_marker,
TrackRegionResult* result,
const TrackRegionOptions* track_options) {
// Try to predict the location of the second marker.
+ const PredictDirection predict_direction = getPredictDirection(track_options);
bool predicted_position = false;
- if (PredictMarkerPosition(tracks_, tracked_marker)) {
+ if (PredictMarkerPosition(tracks_, predict_direction, tracked_marker)) {
LG << "Successfully predicted!";
predicted_position = true;
} else {
diff --git a/intern/libmv/libmv/autotrack/predict_tracks.cc b/intern/libmv/libmv/autotrack/predict_tracks.cc
index d78b5b340f9..f3411066a07 100644
--- a/intern/libmv/libmv/autotrack/predict_tracks.cc
+++ b/intern/libmv/libmv/autotrack/predict_tracks.cc
@@ -225,7 +225,9 @@ void RunPrediction(const vector<Marker*> previous_markers,
} // namespace
-bool PredictMarkerPosition(const Tracks& tracks, Marker* marker) {
+bool PredictMarkerPosition(const Tracks& tracks,
+ const PredictDirection direction,
+ Marker* marker) {
// Get all markers for this clip and track.
vector<Marker> markers;
tracks.GetMarkersForTrackInClip(marker->clip, marker->track, &markers);
@@ -290,9 +292,17 @@ bool PredictMarkerPosition(const Tracks& tracks, Marker* marker) {
}
bool predict_forward = false;
- if (backward_scan_end <= backward_scan_begin) {
- // TODO(keir): Add smarter handling and detecting of consecutive frames!
- predict_forward = true;
+ switch (direction) {
+ case PredictDirection::AUTO:
+ if (backward_scan_end <= backward_scan_begin) {
+ // TODO(keir): Add smarter handling and detecting of consecutive frames!
+ predict_forward = true;
+ }
+ break;
+
+ case PredictDirection::FORWARD: predict_forward = true; break;
+
+ case PredictDirection::BACKWARD: predict_forward = false; break;
}
const int max_frames_to_predict_from = 20;
diff --git a/intern/libmv/libmv/autotrack/predict_tracks.h b/intern/libmv/libmv/autotrack/predict_tracks.h
index 0a176d08378..108846ebc96 100644
--- a/intern/libmv/libmv/autotrack/predict_tracks.h
+++ b/intern/libmv/libmv/autotrack/predict_tracks.h
@@ -28,9 +28,27 @@ namespace mv {
class Tracks;
struct Marker;
+enum class PredictDirection {
+ // Detect direction in which to predict marker position based on an existing
+ // Tracks context. Prediction will happen in the preferred direction of a
+ // missing information.
+ // If markers exists to the both sides of the given one the prediction
+ // direction is preferred to be forward.
+ AUTO,
+
+ // Predict position of the marker from the past to the future (used for
+ // forward tracking).
+ FORWARD,
+
+ // Predict position from the future to the past (used for backward tracking).
+ BACKWARD,
+};
+
// Predict the position of the given marker, and update it accordingly. The
// existing position will be overwritten.
-bool PredictMarkerPosition(const Tracks& tracks, Marker* marker);
+bool PredictMarkerPosition(const Tracks& tracks,
+ const PredictDirection direction,
+ Marker* marker);
} // namespace mv
diff --git a/intern/libmv/libmv/tracking/track_region.cc b/intern/libmv/libmv/tracking/track_region.cc
index 403b4088174..b9bd70e1405 100644
--- a/intern/libmv/libmv/tracking/track_region.cc
+++ b/intern/libmv/libmv/tracking/track_region.cc
@@ -116,7 +116,8 @@ using ceres::Jet;
using ceres::JetOps;
TrackRegionOptions::TrackRegionOptions()
- : mode(TRANSLATION),
+ : direction(FORWARD),
+ mode(TRANSLATION),
minimum_correlation(0),
max_iterations(20),
use_esm(true),
diff --git a/intern/libmv/libmv/tracking/track_region.h b/intern/libmv/libmv/tracking/track_region.h
index c4469f67b81..61d81413a29 100644
--- a/intern/libmv/libmv/tracking/track_region.h
+++ b/intern/libmv/libmv/tracking/track_region.h
@@ -30,6 +30,12 @@ namespace libmv {
struct TrackRegionOptions {
TrackRegionOptions();
+ enum Direction {
+ FORWARD,
+ BACKWARD,
+ };
+ Direction direction;
+
enum Mode {
TRANSLATION,
TRANSLATION_ROTATION,
diff --git a/source/blender/blenkernel/intern/tracking_auto.c b/source/blender/blenkernel/intern/tracking_auto.c
index d5e878a9a75..f107fc4d6bc 100644
--- a/source/blender/blenkernel/intern/tracking_auto.c
+++ b/source/blender/blenkernel/intern/tracking_auto.c
@@ -386,7 +386,8 @@ static void autotrack_context_init_tracks_for_clip(AutoTrackContext *context, in
autotrack_track->track = track;
autotrack_track->is_trackable = autotrack_is_track_trackable(context, autotrack_track);
- tracking_configure_tracker(track, NULL, &autotrack_track->track_region_options);
+ tracking_configure_tracker(
+ track, NULL, context->is_backwards, &autotrack_track->track_region_options);
}
}
diff --git a/source/blender/blenkernel/intern/tracking_region_tracker.c b/source/blender/blenkernel/intern/tracking_region_tracker.c
index 68e866b355d..ef36acdc3d5 100644
--- a/source/blender/blenkernel/intern/tracking_region_tracker.c
+++ b/source/blender/blenkernel/intern/tracking_region_tracker.c
@@ -183,8 +183,11 @@ static ImBuf *tracking_context_get_reference_ibuf(MovieClip *clip,
/* Fill in libmv tracker options structure with settings need to be used to perform track. */
void tracking_configure_tracker(const MovieTrackingTrack *track,
float *mask,
+ const bool is_backwards,
libmv_TrackRegionOptions *options)
{
+ options->direction = is_backwards ? LIBMV_TRACK_REGION_BACKWARD : LIBMV_TRACK_REGION_FORWARD;
+
/* TODO(sergey): Use explicit conversion, so that options are decoupled between the Libmv library
* and enumerator values in DNA. */
options->motion_model = track->motion_model;
@@ -220,6 +223,7 @@ static bool configure_and_run_tracker(ImBuf *destination_ibuf,
int reference_search_area_width,
int reference_search_area_height,
float *mask,
+ const bool is_backward,
double dst_pixel_x[5],
double dst_pixel_y[5])
{
@@ -248,7 +252,7 @@ static bool configure_and_run_tracker(ImBuf *destination_ibuf,
destination_ibuf, track, marker, &new_search_area_width, &new_search_area_height);
/* configure the tracker */
- tracking_configure_tracker(track, mask, &options);
+ tracking_configure_tracker(track, mask, is_backward, &options);
/* Convert the marker corners and center into pixel coordinates in the
* search/destination images. */
@@ -374,6 +378,7 @@ void BKE_tracking_refine_marker(MovieClip *clip,
search_area_width,
search_area_height,
mask,
+ backwards,
dst_pixel_x,
dst_pixel_y);
diff --git a/source/blender/blenkernel/tracking_private.h b/source/blender/blenkernel/tracking_private.h
index 35c5221efa3..8de6ec93a7c 100644
--- a/source/blender/blenkernel/tracking_private.h
+++ b/source/blender/blenkernel/tracking_private.h
@@ -111,6 +111,7 @@ struct libmv_TrackRegionOptions;
void tracking_configure_tracker(const MovieTrackingTrack *track,
float *mask,
+ bool is_backwards,
struct libmv_TrackRegionOptions *options);
struct MovieTrackingMarker *tracking_get_keyframed_marker(struct MovieTrackingTrack *track,