[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54840] trunk/blender: code cleanup: camera tracking

Sergey Sharybin sergey.vfx at gmail.com
Mon Feb 25 10:24:32 CET 2013


Revision: 54840
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54840
Author:   nazgul
Date:     2013-02-25 09:24:31 +0000 (Mon, 25 Feb 2013)
Log Message:
-----------
code cleanup: camera tracking

- Moved keyframes and refirement flags into reconstruction options structure
- Moved distortion coefficients and other camera intrinsics into own structure
- Cleaned up reconstruction functions in libmv c-api

---
svn merge -r52853:52854 ^/branches/soc-2011-tomato

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52853

Modified Paths:
--------------
    trunk/blender/extern/libmv/libmv-capi.cpp
    trunk/blender/extern/libmv/libmv-capi.h
    trunk/blender/source/blender/blenkernel/intern/tracking.c

Property Changed:
----------------
    trunk/blender/
    trunk/blender/source/blender/editors/interface/interface.c
    trunk/blender/source/blender/editors/space_outliner/


Property changes on: trunk/blender
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/ge_harmony:42255,42279-42282,42286,42302,42338,42349,42616,42620,42698-42699,42739,42753,42773-42774,42832,44568,44597-44598,44793-44794
/branches/soc-2011-cucumber:37517,38166-38167,38177,38179-38180,38187,38242,38384,38387,38403-38404,38407,38968,38970,38973,39045,40845,42997-42998,43439
/branches/soc-2011-tomato:42376,42378-42379,42383,42385,42395,42397-42400,42407,42411,42418,42443-42444,42446,42467,42472,42486,42650-42652,42654-42655,42709-42710,42733-42734,42801,43872,44130,44141,44147-44149,44151-44152,44229-44230,45623-45625,46037,48089,48092,48551-48552,48679,48790,48792-48793,49076,49087,49292,49294,49466,49894,50052,50126,54573
   + /branches/ge_harmony:42255,42279-42282,42286,42302,42338,42349,42616,42620,42698-42699,42739,42753,42773-42774,42832,44568,44597-44598,44793-44794
/branches/soc-2011-cucumber:37517,38166-38167,38177,38179-38180,38187,38242,38384,38387,38403-38404,38407,38968,38970,38973,39045,40845,42997-42998,43439
/branches/soc-2011-tomato:42376,42378-42379,42383,42385,42395,42397-42400,42407,42411,42418,42443-42444,42446,42467,42472,42486,42650-42652,42654-42655,42709-42710,42733-42734,42801,43872,44130,44141,44147-44149,44151-44152,44229-44230,45623-45625,46037,48089,48092,48551-48552,48679,48790,48792-48793,49076,49087,49292,49294,49466,49894,50052,50126,52854,54573

Modified: trunk/blender/extern/libmv/libmv-capi.cpp
===================================================================
--- trunk/blender/extern/libmv/libmv-capi.cpp	2013-02-25 08:59:26 UTC (rev 54839)
+++ trunk/blender/extern/libmv/libmv-capi.cpp	2013-02-25 09:24:31 UTC (rev 54840)
@@ -552,40 +552,78 @@
 		reconstruction, intrinsics);
 }
 
-libmv_Reconstruction *libmv_solveReconstruction(libmv_Tracks *tracks, int keyframe1, int keyframe2,
-			int refine_intrinsics, double focal_length, double principal_x, double principal_y,
-			double k1, double k2, double k3, struct libmv_reconstructionOptions *options,
-			reconstruct_progress_update_cb progress_update_callback, void *callback_customdata)
+static void cameraIntrinsicsFromOptions(libmv::CameraIntrinsics *camera_intrinsics,
+                                        libmv_cameraIntrinsicsOptions *camera_intrinsics_options)
 {
-	/* Invert the camera intrinsics. */
-	libmv::vector<libmv::Marker> markers = ((libmv::Tracks*)tracks)->AllMarkers();
+	camera_intrinsics->SetFocalLength(camera_intrinsics_options->focal_length,
+	                                  camera_intrinsics_options->focal_length);
+
+	camera_intrinsics->SetPrincipalPoint(camera_intrinsics_options->principal_point_x,
+	                                     camera_intrinsics_options->principal_point_y);
+
+	camera_intrinsics->SetRadialDistortion(camera_intrinsics_options->k1,
+	                                       camera_intrinsics_options->k2,
+	                                       camera_intrinsics_options->k3);
+}
+
+static libmv::Tracks getNormalizedTracks(libmv::Tracks *tracks, libmv::CameraIntrinsics *camera_intrinsics)
+{
+	libmv::vector<libmv::Marker> markers = tracks->AllMarkers();
+
+	for (int i = 0; i < markers.size(); ++i) {
+		camera_intrinsics->InvertIntrinsics(markers[i].x, markers[i].y,
+			&(markers[i].x), &(markers[i].y));
+	}
+
+	return libmv::Tracks(markers);
+}
+
+static void finishReconstruction(libmv::Tracks *tracks, libmv::CameraIntrinsics *camera_intrinsics,
+                                 libmv_Reconstruction *libmv_reconstruction,
+                                 reconstruct_progress_update_cb progress_update_callback,
+                                 void *callback_customdata)
+{
+	libmv::EuclideanReconstruction *reconstruction = &libmv_reconstruction->reconstruction;
+
+	/* reprojection error calculation */
+	progress_update_callback(callback_customdata, 1.0, "Finishing solution");
+	libmv_reconstruction->tracks = *tracks;
+	libmv_reconstruction->error = libmv::EuclideanReprojectionError(*tracks, *reconstruction, *camera_intrinsics);
+}
+
+libmv_Reconstruction *libmv_solveReconstruction(libmv_Tracks *libmv_tracks,
+			libmv_cameraIntrinsicsOptions *libmv_camera_intrinsics_options,
+			libmv_reconstructionOptions *libmv_reconstruction_options,
+			reconstruct_progress_update_cb progress_update_callback,
+			void *callback_customdata)
+{
 	libmv_Reconstruction *libmv_reconstruction = new libmv_Reconstruction();
+
+	libmv::Tracks *tracks = ((libmv::Tracks *) libmv_tracks);
 	libmv::EuclideanReconstruction *reconstruction = &libmv_reconstruction->reconstruction;
-	libmv::CameraIntrinsics *intrinsics = &libmv_reconstruction->intrinsics;
-	libmv::ReconstructionOptions reconstruction_options;
+	libmv::CameraIntrinsics *camera_intrinsics = &libmv_reconstruction->intrinsics;
 
 	ReconstructUpdateCallback update_callback =
 		ReconstructUpdateCallback(progress_update_callback, callback_customdata);
 
-	intrinsics->SetFocalLength(focal_length, focal_length);
-	intrinsics->SetPrincipalPoint(principal_x, principal_y);
-	intrinsics->SetRadialDistortion(k1, k2, k3);
+	cameraIntrinsicsFromOptions(camera_intrinsics, libmv_camera_intrinsics_options);
 
-	reconstruction_options.success_threshold = options->success_threshold;
-	reconstruction_options.use_fallback_reconstruction = options->use_fallback_reconstruction;
+	/* Invert the camera intrinsics */
+	libmv::Tracks normalized_tracks = getNormalizedTracks(tracks, camera_intrinsics);
 
-	for (int i = 0; i < markers.size(); ++i) {
-		intrinsics->InvertIntrinsics(markers[i].x,
-			markers[i].y,
-			&(markers[i].x),
-			&(markers[i].y));
-	}
+	/* actual reconstruction */
+	libmv::ReconstructionOptions reconstruction_options;
+	reconstruction_options.success_threshold = libmv_reconstruction_options->success_threshold;
+	reconstruction_options.use_fallback_reconstruction = libmv_reconstruction_options->use_fallback_reconstruction;
 
-	libmv::Tracks normalized_tracks(markers);
+	int keyframe1 = libmv_reconstruction_options->keyframe1,
+	    keyframe2 = libmv_reconstruction_options->keyframe2;
 
 	LG << "frames to init from: " << keyframe1 << " " << keyframe2;
+
 	libmv::vector<libmv::Marker> keyframe_markers =
 		normalized_tracks.MarkersForTracksInBothImages(keyframe1, keyframe2);
+
 	LG << "number of markers for init: " << keyframe_markers.size();
 
 	update_callback.invoke(0, "Initial reconstruction");
@@ -595,49 +633,45 @@
 	libmv::EuclideanCompleteReconstruction(reconstruction_options, normalized_tracks,
 	                                       reconstruction, &update_callback);
 
-	if (refine_intrinsics) {
-		libmv_solveRefineIntrinsics((libmv::Tracks *)tracks, intrinsics, reconstruction,
-			refine_intrinsics, progress_update_callback, callback_customdata);
+	/* refinement */
+	if (libmv_reconstruction_options->refine_intrinsics) {
+		libmv_solveRefineIntrinsics((libmv::Tracks *)tracks, camera_intrinsics, reconstruction,
+			libmv_reconstruction_options->refine_intrinsics,
+			progress_update_callback, callback_customdata);
 	}
 
-	progress_update_callback(callback_customdata, 1.0, "Finishing solution");
-	libmv_reconstruction->tracks = *(libmv::Tracks *)tracks;
-	libmv_reconstruction->error = libmv::EuclideanReprojectionError(*(libmv::Tracks *)tracks, *reconstruction, *intrinsics);
+	/* finish reconstruction */
+	finishReconstruction(tracks, camera_intrinsics, libmv_reconstruction,
+	                     progress_update_callback, callback_customdata);
 
 	return (libmv_Reconstruction *)libmv_reconstruction;
 }
 
-struct libmv_Reconstruction *libmv_solveModal(struct libmv_Tracks *tracks, double focal_length,
-			double principal_x, double principal_y, double k1, double k2, double k3,
-			reconstruct_progress_update_cb progress_update_callback, void *callback_customdata)
+struct libmv_Reconstruction *libmv_solveModal(struct libmv_Tracks *libmv_tracks,
+			libmv_cameraIntrinsicsOptions *libmv_camera_intrinsics_options,
+			reconstruct_progress_update_cb progress_update_callback,
+			void *callback_customdata)
 {
-	/* Invert the camera intrinsics. */
-	libmv::vector<libmv::Marker> markers = ((libmv::Tracks*)tracks)->AllMarkers();
 	libmv_Reconstruction *libmv_reconstruction = new libmv_Reconstruction();
+
+	libmv::Tracks *tracks = ((libmv::Tracks *) libmv_tracks);
 	libmv::EuclideanReconstruction *reconstruction = &libmv_reconstruction->reconstruction;
-	libmv::CameraIntrinsics *intrinsics = &libmv_reconstruction->intrinsics;
+	libmv::CameraIntrinsics *camera_intrinsics = &libmv_reconstruction->intrinsics;
 
 	ReconstructUpdateCallback update_callback =
 		ReconstructUpdateCallback(progress_update_callback, callback_customdata);
 
-	intrinsics->SetFocalLength(focal_length, focal_length);
-	intrinsics->SetPrincipalPoint(principal_x, principal_y);
-	intrinsics->SetRadialDistortion(k1, k2, k3);
+	cameraIntrinsicsFromOptions(camera_intrinsics, libmv_camera_intrinsics_options);
 
-	for (int i = 0; i < markers.size(); ++i) {
-		intrinsics->InvertIntrinsics(markers[i].x,
-			markers[i].y,
-			&(markers[i].x),
-			&(markers[i].y));
-	}
+	/* Invert the camera intrinsics */
+	libmv::Tracks normalized_tracks = getNormalizedTracks(tracks, camera_intrinsics);
 
-	libmv::Tracks normalized_tracks(markers);
-
+	/* actual reconstruction */
 	libmv::ModalSolver(normalized_tracks, reconstruction, &update_callback);
 
-	progress_update_callback(callback_customdata, 1.0, "Finishing solution");
-	libmv_reconstruction->tracks = *(libmv::Tracks *)tracks;
-	libmv_reconstruction->error = libmv::EuclideanReprojectionError(*(libmv::Tracks *)tracks, *reconstruction, *intrinsics);
+	/* finish reconstruction */
+	finishReconstruction(tracks, camera_intrinsics, libmv_reconstruction,
+	                     progress_update_callback, callback_customdata);
 
 	return (libmv_Reconstruction *)libmv_reconstruction;
 }

Modified: trunk/blender/extern/libmv/libmv-capi.h
===================================================================
--- trunk/blender/extern/libmv/libmv-capi.h	2013-02-25 08:59:26 UTC (rev 54839)
+++ trunk/blender/extern/libmv/libmv-capi.h	2013-02-25 09:24:31 UTC (rev 54840)
@@ -86,28 +86,40 @@
 void libmv_tracksDestroy(struct libmv_Tracks *libmv_tracks);
 
 /* Reconstruction solver */
-#define LIBMV_REFINE_FOCAL_LENGTH	(1<<0)
-#define LIBMV_REFINE_PRINCIPAL_POINT	(1<<1)
-#define LIBMV_REFINE_RADIAL_DISTORTION_K1 (1<<2)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list