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.
This commit is contained in:
Sergey Sharybin 2011-11-28 13:08:12 +00:00
parent d0023ed4ba
commit 48c5820049
9 changed files with 134 additions and 73 deletions

@ -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

@ -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

@ -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

@ -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"

@ -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

@ -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] ||

@ -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);

@ -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 */
short tracker; /* tracking algorithm used for this track */
/* ** KLT tracker settings ** */
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 */
/* ** KLT tracker settings ** */
short pyramid_levels; /* number of pyramid levels to use for KLT tracking */
char pad5[6];
} 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

@ -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);