diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2011-11-28 17:08:12 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2011-11-28 17:08:12 +0400 |
commit | 48c5820049ecd26cd315478c50cc53855c78a61f (patch) | |
tree | 3f743c38024b17f660d48cbc92b3ba4371278886 | |
parent | d0023ed4bafe68402c7d7c9edda4592bbc5a47be (diff) |
Camera tracking: move margin, frames limit and adjust frames to per-track settings
Also replace adjust frames integer slider with menu to choose between matching
pattern from keyframe position of from previous frame. think this settings
wouldn't be so confusing now.
-rw-r--r-- | release/scripts/presets/tracking_settings/blurry_movie.py | 3 | ||||
-rw-r--r-- | release/scripts/presets/tracking_settings/default.py | 3 | ||||
-rw-r--r-- | release/scripts/presets/tracking_settings/fast_motion.py | 3 | ||||
-rw-r--r-- | release/scripts/startup/bl_operators/presets.py | 3 | ||||
-rw-r--r-- | release/scripts/startup/bl_ui/space_clip.py | 20 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/tracking.c | 23 | ||||
-rw-r--r-- | source/blender/editors/space_clip/tracking_ops.c | 38 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_tracking_types.h | 43 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_tracking.c | 71 |
9 files changed, 134 insertions, 73 deletions
diff --git a/release/scripts/presets/tracking_settings/blurry_movie.py b/release/scripts/presets/tracking_settings/blurry_movie.py index ad965337937..8a503bec9bd 100644 --- a/release/scripts/presets/tracking_settings/blurry_movie.py +++ b/release/scripts/presets/tracking_settings/blurry_movie.py @@ -6,3 +6,6 @@ settings.default_pyramid_levels = 4 settings.default_correlation_min = 0.75 settings.default_pattern_size = 11 settings.default_search_size = 202 +settings.default_frames_limit = 25 +settings.default_pattern_match = 'KEYFRAME' +settings.default_margin = 0 diff --git a/release/scripts/presets/tracking_settings/default.py b/release/scripts/presets/tracking_settings/default.py index 4f1e23fb65c..4b2d41bf292 100644 --- a/release/scripts/presets/tracking_settings/default.py +++ b/release/scripts/presets/tracking_settings/default.py @@ -6,3 +6,6 @@ settings.default_pyramid_levels = 2 settings.default_correlation_min = 0.75 settings.default_pattern_size = 11 settings.default_search_size = 51 +settings.default_frames_limit = 0 +settings.default_pattern_match = 'KEYFRAME' +settings.default_margin = 0 diff --git a/release/scripts/presets/tracking_settings/fast_motion.py b/release/scripts/presets/tracking_settings/fast_motion.py index 0ca768adef2..a3d382e6700 100644 --- a/release/scripts/presets/tracking_settings/fast_motion.py +++ b/release/scripts/presets/tracking_settings/fast_motion.py @@ -6,3 +6,6 @@ settings.default_pyramid_levels = 2 settings.default_correlation_min = 0.75 settings.default_pattern_size = 11 settings.default_search_size = 121 +settings.default_frames_limit = 0 +settings.default_pattern_match = 'KEYFRAME' +settings.default_margin = 0 diff --git a/release/scripts/startup/bl_operators/presets.py b/release/scripts/startup/bl_operators/presets.py index 1eeae28783e..a5c8c280616 100644 --- a/release/scripts/startup/bl_operators/presets.py +++ b/release/scripts/startup/bl_operators/presets.py @@ -376,6 +376,9 @@ class AddPresetTrackingSettings(AddPresetBase, Operator): "settings.default_correlation_min", "settings.default_pattern_size", "settings.default_search_size", + "settings.default_frames_limit", + "settings.default_pattern_match", + "settings.default_margin" ] preset_subdir = "tracking_settings" diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py index dbfa6a24ec3..22d44ed4793 100644 --- a/release/scripts/startup/bl_ui/space_clip.py +++ b/release/scripts/startup/bl_ui/space_clip.py @@ -132,6 +132,15 @@ class CLIP_PT_tools_marker(Panel): else: col.prop(settings, "default_correlation_min") + col.separator() + + col2 = col.column(align=True) + col2.prop(settings, "default_frames_limit") + col2.prop(settings, "default_margin") + + col.label(text="Match:") + col.prop(settings, "default_pattern_match", text="") + class CLIP_PT_tools_tracking(Panel): bl_space_type = 'CLIP_EDITOR' @@ -492,12 +501,11 @@ class CLIP_PT_track_settings(Panel): col.prop(active, "correlation_min") col.separator() - col.label(text="Global Settings:") + col.prop(active, "frames_limit") + col.prop(active, "margin") + col.prop(active, "pattern_match", text="Match") col.prop(settings, "speed") - col.prop(settings, "frames_adjust") - col.prop(settings, "frames_limit") - col.prop(settings, "margin") class CLIP_PT_stabilization(Panel): @@ -906,8 +914,8 @@ class CLIP_MT_track_color_presets(Menu): class CLIP_MT_tracking_settings_presets(Menu): - """Predefined track color""" - bl_label = "Tracking Settings" + """Predefined tracking settings""" + bl_label = "Tracking Presets" preset_subdir = "tracking_settings" preset_operator = "script.execute_preset" draw = bpy.types.Menu.draw_preset diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 4c54e9f22f5..0a9412e9b36 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -82,7 +82,6 @@ void BKE_tracking_init_settings(MovieTracking *tracking) tracking->settings.default_pattern_size= 11; tracking->settings.default_search_size= 51; tracking->settings.default_pyramid_levels= 2; - tracking->settings.frames_limit= 0; tracking->settings.keyframe1= 1; tracking->settings.keyframe2= 30; tracking->settings.dist= 1; @@ -229,12 +228,12 @@ MovieTrackingTrack *BKE_tracking_add_track(MovieTracking *tracking, float x, flo track= MEM_callocN(sizeof(MovieTrackingTrack), "add_marker_exec track"); strcpy(track->name, "Track"); - /* default to KLT tracker */ - track->tracker = settings->default_tracker; - track->pyramid_levels = settings->default_pyramid_levels; - - /* set SAD defaults even though it's not selected by default */ + track->tracker= settings->default_tracker; + track->pyramid_levels= settings->default_pyramid_levels; track->minimum_correlation= settings->default_minimum_correlation; + track->margin= settings->default_margin; + track->pattern_match= settings->default_pattern_match; + track->frames_limit= settings->default_frames_limit; memset(&marker, 0, sizeof(marker)); marker.pos[0]= x; @@ -1078,7 +1077,7 @@ static ImBuf *get_adjust_ibuf(MovieTrackingContext *context, MovieTrackingTrack { ImBuf *ibuf= NULL; - if(context->settings.adjframes == 0) { + if(track->pattern_match == TRACK_MATCH_KEYFRAME) { ibuf= get_keyframed_ibuf(context, track, marker, marker_keyed); } else { ibuf= get_frame_ibuf(context, curfra); @@ -1161,8 +1160,10 @@ int BKE_tracking_next(MovieTrackingContext *context) int onbound= 0, coords_correct= 0; int nextfra; - if(!context->settings.adjframes) need_readjust= context->first_time; - else need_readjust= context->frames%context->settings.adjframes == 0; + if(track->pattern_match==TRACK_MATCH_KEYFRAME) + need_readjust= context->first_time; + else + need_readjust= 1; if(context->backwards) nextfra= curfra-1; else nextfra= curfra+1; @@ -1170,8 +1171,8 @@ int BKE_tracking_next(MovieTrackingContext *context) /* margin from frame boundaries */ sub_v2_v2v2(margin, track->pat_max, track->pat_min); - margin[0]= MAX2(margin[0], (float)context->settings.margin / ibuf_new->x); - margin[1]= MAX2(margin[1], (float)context->settings.margin / ibuf_new->y); + margin[0]= MAX2(margin[0], (float)track->margin / ibuf_new->x); + margin[1]= MAX2(margin[1], (float)track->margin / ibuf_new->y); /* do not track markers which are too close to boundary */ if(marker->pos[0]<margin[0] || marker->pos[0]>1.0f-margin[0] || diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c index e91331e5252..6f3bd6810e5 100644 --- a/source/blender/editors/space_clip/tracking_ops.c +++ b/source/blender/editors/space_clip/tracking_ops.c @@ -1221,10 +1221,11 @@ static int track_count_markers(SpaceClip *sc, MovieClip *clip) return tot; } -static void track_init_markers(SpaceClip *sc, MovieClip *clip) +static void track_init_markers(SpaceClip *sc, MovieClip *clip, int *frames_limit_r) { MovieTrackingTrack *track; int framenr= sc->user.framenr, hidden= 0; + int frames_limit= 0; if((sc->flag&SC_SHOW_MARKER_PATTERN)==0) hidden|= TRACK_AREA_PAT; if((sc->flag&SC_SHOW_MARKER_SEARCH)==0) hidden|= TRACK_AREA_SEARCH; @@ -1235,12 +1236,22 @@ static void track_init_markers(SpaceClip *sc, MovieClip *clip) BKE_tracking_track_flag(track, hidden, SELECT, 1); if(TRACK_SELECTED(track)) { - if((track->flag&TRACK_HIDDEN)==0 && (track->flag&TRACK_LOCKED)==0) + if((track->flag&TRACK_HIDDEN)==0 && (track->flag&TRACK_LOCKED)==0) { BKE_tracking_ensure_marker(track, framenr); + + if(track->frames_limit) { + if(frames_limit==0) + frames_limit= track->frames_limit; + else + frames_limit= MIN2(frames_limit, track->frames_limit); + } + } } track= track->next; } + + *frames_limit_r= frames_limit; } static int track_markers_check_direction(int backwards, int curfra, int efra) @@ -1261,6 +1272,9 @@ static int track_markers_initjob(bContext *C, TrackMarkersJob *tmj, int backward MovieClip *clip= ED_space_clip(sc); Scene *scene= CTX_data_scene(C); MovieTrackingSettings *settings= &clip->tracking.settings; + int frames_limit; + + track_init_markers(sc, clip, &frames_limit); tmj->sfra= sc->user.framenr; tmj->clip= clip; @@ -1270,9 +1284,9 @@ static int track_markers_initjob(bContext *C, TrackMarkersJob *tmj, int backward else tmj->efra= EFRA; /* limit frames to be tracked by user setting */ - if(settings->frames_limit) { - if(backwards) tmj->efra= MAX2(tmj->efra, tmj->sfra-settings->frames_limit); - else tmj->efra= MIN2(tmj->efra, tmj->sfra+settings->frames_limit); + if(frames_limit) { + if(backwards) tmj->efra= MAX2(tmj->efra, tmj->sfra-frames_limit); + else tmj->efra= MIN2(tmj->efra, tmj->sfra+frames_limit); } if(settings->speed!=TRACKING_SPEED_FASTEST) { @@ -1283,8 +1297,6 @@ static int track_markers_initjob(bContext *C, TrackMarkersJob *tmj, int backward else if(settings->speed==TRACKING_SPEED_DOUBLE) tmj->delay/= 2; } - track_init_markers(sc, clip); - tmj->context= BKE_tracking_context_new(clip, &sc->user, backwards, 1); clip->tracking_context= tmj->context; @@ -1376,25 +1388,25 @@ static int track_markers_exec(bContext *C, wmOperator *op) int sfra= framenr, efra; int backwards= RNA_boolean_get(op->ptr, "backwards"); int sequence= RNA_boolean_get(op->ptr, "sequence"); - MovieTrackingSettings *settings= &clip->tracking.settings; + int frames_limit; if(track_count_markers(sc, clip)==0) return OPERATOR_CANCELLED; + track_init_markers(sc, clip, &frames_limit); + if(backwards) efra= SFRA; else efra= EFRA; /* limit frames to be tracked by user setting */ - if(settings->frames_limit) { - if(backwards) efra= MAX2(efra, sfra-settings->frames_limit); - else efra= MIN2(efra, sfra+settings->frames_limit); + if(frames_limit) { + if(backwards) efra= MAX2(efra, sfra-frames_limit); + else efra= MIN2(efra, sfra+frames_limit); } if(!track_markers_check_direction(backwards, framenr, efra)) return OPERATOR_CANCELLED; - track_init_markers(sc, clip); - /* do not disable tracks due to threshold when tracking frame-by-frame */ context= BKE_tracking_context_new(clip, &sc->user, backwards, sequence); diff --git a/source/blender/makesdna/DNA_tracking_types.h b/source/blender/makesdna/DNA_tracking_types.h index 931ed6fb8c6..c4e6fcc4dc8 100644 --- a/source/blender/makesdna/DNA_tracking_types.h +++ b/source/blender/makesdna/DNA_tracking_types.h @@ -100,41 +100,40 @@ typedef struct MovieTrackingTrack { float color[3]; /* custom color for track */ /* tracking algorithm to use; can be KLT or SAD */ - short tracker; - char pad4[2]; + short frames_limit; /* number of frames to be tarcked during single tracking session (if TRACKING_FRAMES_LIMIT is set) */ + short margin; /* margin from frame boundaries */ + short pattern_match; /* re-adjust every N frames */ - /* ** SAD tracker settings ** */ - float minimum_correlation; /* minimal correlation which is still treated as successful tracking */ + short tracker; /* tracking algorithm used for this track */ /* ** KLT tracker settings ** */ - short pyramid_levels; /* number of pyramid levels to use for KLT tracking */ - char pad5[6]; + short pyramid_levels, pad2; /* number of pyramid levels to use for KLT tracking */ + + /* ** SAD tracker settings ** */ + float minimum_correlation; /* minimal correlation which is still treated as successful tracking */ } MovieTrackingTrack; typedef struct MovieTrackingSettings { + int flag; + /* ** default tracker settings */ short default_tracker; /* tracking algorithm used by default */ short default_pyramid_levels; /* number of pyramid levels to use for KLT tracking */ float default_minimum_correlation; /* minimal correlation which is still treated as successful tracking */ short default_pattern_size; /* size of pattern area for new tracks */ short default_search_size; /* size of search area for new tracks */ + short default_frames_limit; /* number of frames to be tarcked during single tracking session (if TRACKING_FRAMES_LIMIT is set) */ + short default_margin; /* margin from frame boundaries */ + short default_pattern_match; /* re-adjust every N frames */ /* ** common tracker settings ** */ short speed; /* speed of tracking */ - short frames_limit; /* number of frames to be tarcked during single tracking session (if TRACKING_FRAMES_LIMIT is set) */ - short margin; /* margin from frame boundaries */ - - short pad; - int flag; - - int adjframes; /* re-adjust every N frames */ /* ** reconstruction settings ** */ int keyframe1, keyframe2; /* two keyframes for reconstrution initialization */ /* ** which camera intrinsics to refine. uses on the REFINE_* flags */ - short refine_camera_intrinsics; - short pad2; + short refine_camera_intrinsics, pad2; /* ** tool settings ** */ @@ -143,7 +142,7 @@ typedef struct MovieTrackingSettings { /* cleanup */ int clean_frames, clean_action; - float clean_error; + float clean_error, pad; } MovieTrackingSettings; typedef struct MovieTrackingStabilization { @@ -209,13 +208,17 @@ enum { #define TRACK_CUSTOMCOLOR (1<<7) #define TRACK_USE_2D_STAB (1<<8) -/* MovieTrackingSettings->flag */ -#define TRACKING_SETTINGS_SHOW_DEFAULT_EXPANDED (1<<0) - -/* MovieTrackingSettings->tracker */ +/* MovieTrackingTrack->tracker */ #define TRACKER_KLT 0 #define TRACKER_SAD 1 +/* MovieTrackingTrack->adjframes */ +#define TRACK_MATCH_KEYFRAME 0 +#define TRACK_MATCH_PREVFRAME 1 + +/* MovieTrackingSettings->flag */ +#define TRACKING_SETTINGS_SHOW_DEFAULT_EXPANDED (1<<0) + /* MovieTrackingSettings->speed */ #define TRACKING_SPEED_FASTEST 0 #define TRACKING_SPEED_REALTIME 1 diff --git a/source/blender/makesrna/intern/rna_tracking.c b/source/blender/makesrna/intern/rna_tracking.c index 8d20aeafa54..a3d043ab6ec 100644 --- a/source/blender/makesrna/intern/rna_tracking.c +++ b/source/blender/makesrna/intern/rna_tracking.c @@ -271,6 +271,11 @@ static EnumPropertyItem tracker_items[] = { {TRACKER_SAD, "SAD", 0, "SAD", "Sum of Absolute Differences tracker which can be used when MLT tracker fails"}, {0, NULL, 0, NULL, NULL}}; +static EnumPropertyItem pattern_match_items[] = { + {TRACK_MATCH_KEYFRAME, "KEYFRAME", 0, "Keyframe", "Track pattern from keyframe to next frame"}, + {TRACK_MATCH_PREVFRAME, "PREV_FRAME", 0, "Previous frame", "Track pattern from current frame to next frame"}, + {0, NULL, 0, NULL, NULL}}; + static int rna_matrix_dimsize_4x4[]= {4, 4}; static void rna_def_trackingSettings(BlenderRNA *brna) @@ -319,27 +324,6 @@ static void rna_def_trackingSettings(BlenderRNA *brna) RNA_def_property_enum_items(prop, speed_items); RNA_def_property_ui_text(prop, "Speed", "Limit speed of tracking to make visual feedback easier (this does not affect the tracking quality)"); - /* limit frames */ - prop= RNA_def_property(srna, "frames_limit", PROP_INT, PROP_NONE); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_int_sdna(prop, NULL, "frames_limit"); - RNA_def_property_range(prop, 0, SHRT_MAX); - RNA_def_property_ui_text(prop, "Frames Limit", "Every tracking cycle, this amount of frames are tracked"); - - /* adjust frames */ - prop= RNA_def_property(srna, "frames_adjust", PROP_INT, PROP_NONE); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_int_sdna(prop, NULL, "adjframes"); - RNA_def_property_range(prop, 0, INT_MAX); - RNA_def_property_ui_text(prop, "Adjust Frames", "Automatically re-adjust marker position using position on each N frames. 0 means only keyframed position is used"); - - /* margin */ - prop= RNA_def_property(srna, "margin", PROP_INT, PROP_NONE); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_int_sdna(prop, NULL, "margin"); - RNA_def_property_range(prop, 0, 300); - RNA_def_property_ui_text(prop, "Margin", "Distance from image boudary at which marker stops tracking"); - /* keyframe_a */ prop= RNA_def_property(srna, "keyframe_a", PROP_INT, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); @@ -389,20 +373,40 @@ static void rna_def_trackingSettings(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Action", "Cleanup action to execute"); /* ** default tracker settings ** */ - prop= RNA_def_property(srna, "show_default_expanded", PROP_BOOLEAN, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACKING_SETTINGS_SHOW_DEFAULT_EXPANDED); RNA_def_property_ui_text(prop, "Show Expanded", "Show the expanded in the user interface"); RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1); + /* limit frames */ + prop= RNA_def_property(srna, "default_frames_limit", PROP_INT, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_int_sdna(prop, NULL, "default_frames_limit"); + RNA_def_property_range(prop, 0, SHRT_MAX); + RNA_def_property_ui_text(prop, "Frames Limit", "Every tracking cycle, this amount of frames are tracked"); + + /* pattern match */ + prop= RNA_def_property(srna, "default_pattern_match", PROP_ENUM, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_enum_sdna(prop, NULL, "default_pattern_match"); + RNA_def_property_enum_items(prop, pattern_match_items); + RNA_def_property_ui_text(prop, "Pattern Match", "Track pattern from given frame when tracking marker to next frame"); + + /* margin */ + prop= RNA_def_property(srna, "default_margin", PROP_INT, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_int_sdna(prop, NULL, "default_margin"); + RNA_def_property_range(prop, 0, 300); + RNA_def_property_ui_text(prop, "Margin", "Default distance from image boudary at which marker stops tracking"); + /* tracking algorithm */ prop= RNA_def_property(srna, "default_tracker", PROP_ENUM, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_enum_items(prop, tracker_items); RNA_def_property_update(prop, 0, "rna_tracking_defaultSettings_levelsUpdate"); - RNA_def_property_ui_text(prop, "Tracker", "Tracking algorithm to use"); + RNA_def_property_ui_text(prop, "Tracker", "Default tracking algorithm to use"); /* pyramid level for pyramid klt tracking */ prop= RNA_def_property(srna, "default_pyramid_levels", PROP_INT, PROP_NONE); @@ -598,6 +602,27 @@ static void rna_def_trackingTrack(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Search Max", "Right-bottom corner of search area in normalized coordinates relative to marker position"); RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, "rna_tracking_trackerSearch_update"); + /* limit frames */ + prop= RNA_def_property(srna, "frames_limit", PROP_INT, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_int_sdna(prop, NULL, "frames_limit"); + RNA_def_property_range(prop, 0, SHRT_MAX); + RNA_def_property_ui_text(prop, "Frames Limit", "Every tracking cycle, this amount of frames are tracked"); + + /* pattern match */ + prop= RNA_def_property(srna, "pattern_match", PROP_ENUM, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_enum_sdna(prop, NULL, "pattern_match"); + RNA_def_property_enum_items(prop, pattern_match_items); + RNA_def_property_ui_text(prop, "Pattern Match", "Track pattern from given frame when tracking marker to next frame"); + + /* margin */ + prop= RNA_def_property(srna, "margin", PROP_INT, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_int_sdna(prop, NULL, "margin"); + RNA_def_property_range(prop, 0, 300); + RNA_def_property_ui_text(prop, "Margin", "Distance from image boudary at which marker stops tracking"); + /* tracking algorithm */ prop= RNA_def_property(srna, "tracker", PROP_ENUM, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); |