[Bf-blender-cvs] [6040cf1] soc-2016-multiview: convert global track index on blender side
Tianwei Shen
noreply at git.blender.org
Mon Jun 20 16:47:43 CEST 2016
Commit: 6040cf17bb7cf065e098223ed4c4a649fd4fd525
Author: Tianwei Shen
Date: Mon Jun 20 22:47:33 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB6040cf17bb7cf065e098223ed4c4a649fd4fd525
convert global track index on blender side
===================================================================
M source/blender/blenkernel/intern/tracking_correspondence.c
===================================================================
diff --git a/source/blender/blenkernel/intern/tracking_correspondence.c b/source/blender/blenkernel/intern/tracking_correspondence.c
index 3bc7bf5..38218ea 100644
--- a/source/blender/blenkernel/intern/tracking_correspondence.c
+++ b/source/blender/blenkernel/intern/tracking_correspondence.c
@@ -64,7 +64,8 @@ typedef struct MovieMultiviewReconstructContext {
libmv_CameraIntrinsicsOptions *all_camera_intrinsics_options; /* camera intrinsic of each camera */
TracksMap **all_tracks_map; /* tracks_map of each clip */
int *all_sfra, *all_efra; /* start and end frame of each clip */
- int *all_refine_flags; /* refine flags of each clip */
+ int *all_refine_flags; /* refine flags of each clip */
+ int **track_global_index; /* track global index */
struct libmv_CorrespondencesN *correspondences; /* libmv correspondence api*/
bool select_keyframes;
@@ -110,7 +111,8 @@ static int multiview_refine_intrinsics_get_flags(MovieTracking *tracking, MovieT
}
/* Create new libmv Tracks structure from blender's tracks list. */
-static struct libmv_TracksN *libmv_multiview_tracks_new(MovieClip *clip, int clip_id, ListBase *tracksbase, int width, int height)
+static struct libmv_TracksN *libmv_multiview_tracks_new(MovieClip *clip, int clip_id, ListBase *tracksbase,
+ int *global_track_index, int width, int height)
{
int tracknr = 0;
MovieTrackingTrack *track;
@@ -139,7 +141,7 @@ static struct libmv_TracksN *libmv_multiview_tracks_new(MovieClip *clip, int cli
libmv_Marker libmv_marker;
libmv_marker.clip = clip_id;
libmv_marker.frame = marker->framenr;
- libmv_marker.track = tracknr;
+ libmv_marker.track = global_track_index[tracknr];
libmv_marker.center[0] = (marker->pos[0] + track->offset[0]) * width;
libmv_marker.center[1] = (marker->pos[1] + track->offset[1]) * height;
for(int i = 0; i < 4; i++)
@@ -190,7 +192,8 @@ static struct libmv_TracksN *libmv_multiview_tracks_new(MovieClip *clip, int cli
static int libmv_CorrespondencesFromTracking(ListBase *tracking_correspondences,
MovieClip **clips,
const int clip_num,
- struct libmv_CorrespondencesN *libmv_correspondences)
+ struct libmv_CorrespondencesN *libmv_correspondences,
+ int **global_track_index)
{
int num_valid_corrs = 0;
MovieTrackingCorrespondence *corr;
@@ -241,6 +244,8 @@ static int libmv_CorrespondencesFromTracking(ListBase *tracking_correspondences,
num_valid_corrs++;
}
printf("%s %d %d %d %d\n", corr->name, clip1, clip2, track1, track2);
+ // change the global index of clip2-track2 to clip1-track1
+ global_track_index[clip2][track2] = global_track_index[clip1][track1];
corr = corr->next;
}
return num_valid_corrs;
@@ -273,6 +278,21 @@ BKE_tracking_multiview_reconstruction_context_new(MovieClip **clips,
context->keyframe2 = keyframe2;
context->clip_num = num_clips;
+ // initial global track index to [0,..., N1 - 1], [N1,..., N1+N2-1], so on and so forth
+ context->track_global_index = MEM_callocN(num_clips * sizeof(int*), "global track index of each clip");
+ int global_index = 0;
+ for(int i = 0; i < num_clips; i++) {
+ MovieClip *clip = clips[i];
+ MovieTracking *tracking = &clip->tracking;
+ ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object);
+ int num_tracks = BLI_listbase_count(tracksbase);
+ context->track_global_index[i] = MEM_callocN(num_tracks * sizeof(int), "global track index for clip i");
+ for(int j = 0; j < num_tracks; j++) {
+ printf("%d %d %d\n", i, j, global_index);
+ context->track_global_index[i][j] = global_index++;
+ }
+ }
+
for(int i = 0; i < num_clips; i++)
{
MovieClip *clip = clips[i];
@@ -289,9 +309,10 @@ BKE_tracking_multiview_reconstruction_context_new(MovieClip **clips,
// setting context only from information in the primary clip
if(i == 0) {
- // correspondences are recorded in the primary clip
+ // correspondences are recorded in the primary clip (0), convert local track id to global track id
int num_valid_corrs = libmv_CorrespondencesFromTracking(&tracking->correspondences, clips,
- num_clips, context->correspondences);
+ num_clips, context->correspondences,
+ context->track_global_index);
BLI_assert(num_valid_corrs == BLI_listbase_count(&tracking->correspondences));
printf("number of correspondences converted: %d\n", num_valid_corrs);
@@ -339,7 +360,8 @@ BKE_tracking_multiview_reconstruction_context_new(MovieClip **clips,
}
context->all_sfra[i] = sfra;
context->all_efra[i] = efra;
- context->all_tracks[i] = libmv_multiview_tracks_new(clip, i, tracksbase, width, height * aspy);
+ context->all_tracks[i] = libmv_multiview_tracks_new(clip, i, tracksbase, context->track_global_index[i],
+ width, height * aspy);
}
return context;
@@ -351,8 +373,10 @@ void BKE_tracking_multiview_reconstruction_context_free(MovieMultiviewReconstruc
for(int i = 0; i < context->clip_num; i++)
{
libmv_tracksDestroyN(context->all_tracks[i]);
- if (context->all_reconstruction[i])
+ if(context->all_reconstruction[i])
libmv_reconstructionNDestroy(context->all_reconstruction[i]);
+ if(context->track_global_index[i])
+ MEM_freeN(context->track_global_index[i]);
tracks_map_free(context->all_tracks_map[i], NULL);
}
printf("free per clip context");
@@ -364,6 +388,7 @@ void BKE_tracking_multiview_reconstruction_context_free(MovieMultiviewReconstruc
MEM_freeN(context->all_sfra);
MEM_freeN(context->all_efra);
MEM_freeN(context->all_refine_flags);
+ MEM_freeN(context->track_global_index);
MEM_freeN(context);
}
More information about the Bf-blender-cvs
mailing list