[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38950] branches/soc-2011-tomato: Camera tracking integration

Sergey Sharybin g.ulairi at gmail.com
Tue Aug 2 20:25:19 CEST 2011


Revision: 38950
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38950
Author:   nazgul
Date:     2011-08-02 18:25:18 +0000 (Tue, 02 Aug 2011)
Log Message:
-----------
Camera tracking integration
===========================

- Fixed some silly things ni DNA design. Now all
  reconstruction data is stored in Tracking->Reconstruction.
  Please, re-solve your cameras -- reconstruction data
  wouldn't be read from files saved in blender below this
  commit.
- RNA accessors for reconstruction data.
- Store average reconstruction error in new reconstruction
  structure and show it in clip editor header after
  reconstruction.
- Highlight failed to reconstruct frames with red in cache line.
- Added "group" "Failed Tracks" in Select Grouped operator,
  Meant to be used for selecting tracks bundles from which
  failed to to be solved.
- Hotkey to delete marker: Shift-X.
- Jump to next/prev failed frame operator. Hotkeys are
  Ctrl-Shift-Left/Right Arrow.

Modified Paths:
--------------
    branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py
    branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
    branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
    branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c
    branches/soc-2011-tomato/source/blender/blenloader/intern/writefile.c
    branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c
    branches/soc-2011-tomato/source/blender/editors/space_clip/space_clip.c
    branches/soc-2011-tomato/source/blender/editors/space_clip/tracking_ops.c
    branches/soc-2011-tomato/source/blender/editors/space_view3d/drawobject.c
    branches/soc-2011-tomato/source/blender/makesdna/DNA_tracking_types.h
    branches/soc-2011-tomato/source/blender/makesrna/intern/rna_tracking.c

Modified: branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py
===================================================================
--- branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py	2011-08-02 18:16:48 UTC (rev 38949)
+++ branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py	2011-08-02 18:25:18 UTC (rev 38950)
@@ -113,7 +113,13 @@
         layout.template_ID(sc, "clip")
         layout.template_running_jobs()
 
+        if clip:
+            r = clip.tracking.reconstruction
 
+            if r.is_reconstructed:
+                layout.label(text="Average solve error: %.4f"  % (r.average_error))
+
+
 class CLIP_PT_tools(bpy.types.Panel):
     bl_space_type = 'CLIP_EDITOR'
     bl_region_type = 'TOOLS'
@@ -577,6 +583,9 @@
         op = layout.operator("clip.select_grouped", text="Select Disabled")
         op.group = 'DISABLED'
 
+        op = layout.operator("clip.select_grouped", text="Select Failed")
+        op.group = 'FAILED'
+
         op = layout.operator("clip.select_grouped", text="Select by Color")
         op.group = 'COLOR'
 

Modified: branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h	2011-08-02 18:16:48 UTC (rev 38949)
+++ branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h	2011-08-02 18:25:18 UTC (rev 38950)
@@ -71,7 +71,7 @@
 void BKE_tracking_sync_user(struct MovieClipUser *user, struct MovieTrackingContext *context);
 int BKE_tracking_next(struct MovieTrackingContext *context);
 
-float BKE_tracking_solve_reconstruction(struct MovieClip *clip);
+float BKE_tracking_solve_reconstruction(struct MovieTracking *tracking, int width, int height);
 
 void BKE_track_unique_name(struct MovieTracking *tracking, struct MovieTrackingTrack *track);
 struct MovieTrackingTrack *BKE_find_track_by_name(struct MovieTracking *tracking, const char *name);

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2011-08-02 18:16:48 UTC (rev 38949)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2011-08-02 18:25:18 UTC (rev 38950)
@@ -448,8 +448,8 @@
 
 	BLI_freelistN(&tracking->tracks);
 
-	if(tracking->camera.reconstructed)
-		MEM_freeN(tracking->camera.reconstructed);
+	if(tracking->reconstruction.cameras)
+		MEM_freeN(tracking->reconstruction.cameras);
 
 	if(tracking->stabilization.scaleibuf)
 		IMB_freeImBuf(tracking->stabilization.scaleibuf);
@@ -871,17 +871,13 @@
 }
 
 #if WITH_LIBMV
-static struct libmv_Tracks *create_libmv_tracks(MovieClip *clip)
+static struct libmv_Tracks *create_libmv_tracks(MovieTracking *tracking, int width, int height)
 {
-	int width, height;
 	int tracknr= 0;
 	MovieTrackingTrack *track;
 	struct libmv_Tracks *tracks= libmv_tracksNew();;
 
-	/* XXX: could fail if footage uses images with different sizes */
-	BKE_movieclip_acquire_size(clip, NULL, &width, &height);
-
-	track= clip->tracking.tracks.first;
+	track= tracking->tracks.first;
 	while(track) {
 		int a= 0;
 
@@ -899,13 +895,12 @@
 	return tracks;
 }
 
-static int retrive_libmv_reconstruct(MovieClip *clip, struct libmv_Reconstruction *reconstruction)
+static int retrive_libmv_reconstruct(MovieTracking *tracking, struct libmv_Reconstruction *libmv_reconstruction)
 {
 	int tracknr= 0;
 	int sfra= INT_MAX, efra= INT_MIN, a, origin_set= 0;
-	MovieTracking *tracking= &clip->tracking;
 	MovieTrackingTrack *track;
-	MovieTrackingCamera *camera;
+	MovieTrackingReconstruction *reconstruction= &tracking->reconstruction;
 	MovieReconstructedCamera *reconstructed;
 	float origin[3]= {0.0f, 0.f, 0.0f};
 	int ok= 1;
@@ -914,7 +909,7 @@
 	while(track) {
 		double pos[3];
 
-		if(libmv_reporojectionPointForTrack(reconstruction, tracknr, pos)) {
+		if(libmv_reporojectionPointForTrack(libmv_reconstruction, tracknr, pos)) {
 			track->bundle_pos[0]= pos[0];
 			track->bundle_pos[1]= pos[1];
 			track->bundle_pos[2]= pos[2];
@@ -936,19 +931,17 @@
 		tracknr++;
 	}
 
-	camera= &tracking->camera;
+	if(reconstruction->cameras)
+		MEM_freeN(reconstruction->cameras);
 
-	if(camera->reconstructed)
-		MEM_freeN(camera->reconstructed);
-
-	camera->reconnr= 0;
-	camera->reconstructed= NULL;
+	reconstruction->camnr= 0;
+	reconstruction->cameras= NULL;
 	reconstructed= MEM_callocN((efra-sfra+1)*sizeof(MovieReconstructedCamera), "temp reconstructed camera");
 
 	for(a= sfra; a<=efra; a++) {
 		double matd[4][4];
 
-		if(libmv_reporojectionCameraForImage(reconstruction, a, matd)) {
+		if(libmv_reporojectionCameraForImage(libmv_reconstruction, a, matd)) {
 			int i, j;
 			float mat[4][4];
 
@@ -964,18 +957,18 @@
 			if(origin_set)
 				sub_v3_v3(mat[3], origin);
 
-			copy_m4_m4(reconstructed[camera->reconnr].mat, mat);
-			reconstructed[camera->reconnr].framenr= a;
-			camera->reconnr++;
+			copy_m4_m4(reconstructed[reconstruction->camnr].mat, mat);
+			reconstructed[reconstruction->camnr].framenr= a;
+			reconstruction->camnr++;
 		} else {
 			ok= 0;
 			printf("No camera for frame %d\n", a);
 		}
 	}
 
-	if(camera->reconnr) {
-		camera->reconstructed= MEM_callocN(camera->reconnr*sizeof(MovieReconstructedCamera), "reconstructed camera");
-		memcpy(camera->reconstructed, reconstructed, camera->reconnr*sizeof(MovieReconstructedCamera));
+	if(reconstruction->camnr) {
+		reconstruction->cameras= MEM_callocN(reconstruction->camnr*sizeof(MovieReconstructedCamera), "reconstructed camera");
+		memcpy(reconstruction->cameras, reconstructed, reconstruction->camnr*sizeof(MovieReconstructedCamera));
 	}
 
 	if(origin_set) {
@@ -995,25 +988,28 @@
 
 #endif
 
-float BKE_tracking_solve_reconstruction(MovieClip *clip)
+float BKE_tracking_solve_reconstruction(MovieTracking *tracking, int width, int height)
 {
 #if WITH_LIBMV
 	{
-		MovieTrackingCamera *camera= &clip->tracking.camera;
-		MovieTracking *tracking= &clip->tracking;
-		struct libmv_Tracks *tracks= create_libmv_tracks(clip);
+		MovieTrackingCamera *camera= &tracking->camera;
+		struct libmv_Tracks *tracks= create_libmv_tracks(tracking, width, height);
 		struct libmv_Reconstruction *reconstruction = libmv_solveReconstruction(tracks,
 		        tracking->settings.keyframe1, tracking->settings.keyframe2,
 		        camera->focal, camera->principal[0], camera->principal[1],
 		        camera->k1, camera->k2, camera->k3);
 		float error= libmv_reprojectionError(reconstruction);
 
-		if(!retrive_libmv_reconstruct(clip, reconstruction))
+		tracking->reconstruction.error= error;
+
+		if(!retrive_libmv_reconstruct(tracking, reconstruction))
 			error= -1.f;
 
 		libmv_destroyReconstruction(reconstruction);
 		libmv_tracksDestroy(tracks);
 
+		tracking->reconstruction.flag|= TRACKING_RECONSTRUCTED;
+
 		return error;
 	}
 #endif
@@ -1040,22 +1036,22 @@
 
 MovieReconstructedCamera *BKE_tracking_get_reconstructed_camera(MovieTracking *tracking, int framenr)
 {
-	MovieTrackingCamera *camera= &tracking->camera;
+	MovieTrackingReconstruction *reconstruction= &tracking->reconstruction;
 	int a= 0, d= 1;
 
-	if(!camera->reconnr)
+	if(!reconstruction->camnr)
 		return NULL;
 
-	if(camera->last_camera<camera->reconnr)
-		a= camera->last_camera;
+	if(reconstruction->last_camera<reconstruction->camnr)
+		a= reconstruction->last_camera;
 
-	if(camera->reconstructed[a].framenr>=framenr)
+	if(reconstruction->cameras[a].framenr>=framenr)
 		d= -1;
 
-	while(a>=0 && a<camera->reconnr) {
-		if(camera->reconstructed[a].framenr==framenr) {
-			camera->last_camera= a;
-			return &camera->reconstructed[a];
+	while(a>=0 && a<reconstruction->camnr) {
+		if(reconstruction->cameras[a].framenr==framenr) {
+			reconstruction->last_camera= a;
+			return &reconstruction->cameras[a];
 
 			break;
 		}

Modified: branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c	2011-08-02 18:16:48 UTC (rev 38949)
+++ branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c	2011-08-02 18:25:18 UTC (rev 38950)
@@ -5706,7 +5706,7 @@
 	if(fd->movieclipmap) clip->cache= newmclipadr(fd, clip->cache);
 	else clip->cache= NULL;
 
-	tracking->camera.reconstructed= newdataadr(fd, tracking->camera.reconstructed);
+	tracking->reconstruction.cameras= newdataadr(fd, tracking->reconstruction.cameras);
 
 	link_list(fd, &tracking->tracks);
 

Modified: branches/soc-2011-tomato/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenloader/intern/writefile.c	2011-08-02 18:16:48 UTC (rev 38949)
+++ branches/soc-2011-tomato/source/blender/blenloader/intern/writefile.c	2011-08-02 18:25:18 UTC (rev 38950)
@@ -2434,8 +2434,8 @@
 			MovieTrackingTrack *track;
 			writestruct(wd, ID_MC, "MovieClip", 1, clip);
 
-			if(tracking->camera.reconnr)
-				writestruct(wd, DATA, "MovieReconstructedCamera", tracking->camera.reconnr, tracking->camera.reconstructed);
+			if(tracking->reconstruction.camnr)
+				writestruct(wd, DATA, "MovieReconstructedCamera", tracking->reconstruction.camnr, tracking->reconstruction.cameras);
 
 			track= tracking->tracks.first;
 			while(track) {

Modified: branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c	2011-08-02 18:16:48 UTC (rev 38949)
+++ branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c	2011-08-02 18:25:18 UTC (rev 38950)
@@ -71,7 +71,7 @@
 static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Scene *scene)
 {
 	float x;
-	int *points, totseg, sel_type;
+	int *points, totseg, sel_type, i, a;
 	float sfra= SFRA, efra= EFRA;
 	void *sel;
 	float framelen= ar->winx/(efra-sfra+1);
@@ -87,8 +87,6 @@
 	/* cached segments -- could be usefu lto debug caching strategies */
 	BKE_movieclip_get_cache_segments(clip, &totseg, &points);
 	if(totseg) {
-		int a;
-
 		glColor4ub(128, 128, 255, 128);
 
 		for(a= 0; a<totseg; a++) {
@@ -103,10 +101,9 @@
 
 	/* track */
 	if(sel_type==MCLIP_SEL_TRACK) {
-		int i, a= 0;
 		MovieTrackingTrack *track= (MovieTrackingTrack *)sel;
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list