[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58611] branches/soc-2013-motion_track/ extern/libmv: Unify libmv C API for solving

Joseph Mansfield sftrabbit at gmail.com
Fri Jul 26 02:37:26 CEST 2013


Revision: 58611
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58611
Author:   sftrabbit
Date:     2013-07-26 00:37:26 +0000 (Fri, 26 Jul 2013)
Log Message:
-----------
Unify libmv C API for solving

The current libmv C API exposes the libmv_solve function which forwards to either libmv_solveReconstruction or libmv_solveModal, depending on whether the user selected Tripod Motion in the UI. These functions contain a fair bit of common code. Unify them into the single libmv_solve function, leading the way to a clean multiview reconstruction solution.

Modified Paths:
--------------
    branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.cc
    branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.h
    branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc

Modified: branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.cc
===================================================================
--- branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.cc	2013-07-25 23:42:20 UTC (rev 58610)
+++ branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.cc	2013-07-26 00:37:26 UTC (rev 58611)
@@ -385,13 +385,25 @@
 
 void EuclideanBundle(const Tracks &tracks,
                      EuclideanReconstruction *reconstruction) {
-  CameraIntrinsics intrinsics;
+  BundleOptions bundle_options;
 
+  CameraIntrinsics empty_intrinsics;
+  EuclideanBundleCommonIntrinsics(tracks,
+                                  bundle_options,
+                                  reconstruction,
+                                  &empty_intrinsics);
+}
+
+void EuclideanBundleModal(const Tracks &tracks,
+                          EuclideanReconstruction *reconstruction) {
   BundleOptions bundle_options;
+  bundle_options.constraints = libmv::BUNDLE_NO_TRANSLATION;
+
+  CameraIntrinsics empty_intrinsics;
   EuclideanBundleCommonIntrinsics(tracks,
                                   bundle_options,
                                   reconstruction,
-                                  &intrinsics);
+                                  &empty_intrinsics);
 }
  
 void EuclideanBundleCommonIntrinsics(const Tracks &tracks,

Modified: branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.h
===================================================================
--- branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.h	2013-07-25 23:42:20 UTC (rev 58610)
+++ branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.h	2013-07-26 00:37:26 UTC (rev 58611)
@@ -82,6 +82,27 @@
 /*!
     Refine camera poses and 3D coordinates using bundle adjustment.
 
+    This routine adjusts all cameras and points in \a *reconstruction. This
+    assumes a full observation for reconstructed tracks; this implies that if
+    there is a reconstructed 3D point (a bundle) for a track, then all markers
+    for that track will be included in the minimization. \a tracks should
+    contain markers used in the initial reconstruction.
+
+    The cameras and bundles (3D points), except the camera positions, are
+    refined in-place.
+
+    \note This assumes an outlier-free set of markers.
+    \note This assumes a calibrated reconstruction, e.g. the markers are
+          already corrected for camera intrinsics and radial distortion.
+
+    \sa EuclideanResect, EuclideanIntersect, EuclideanReconstructTwoFrames
+*/
+void EuclideanBundleModal(const Tracks &tracks,
+                          EuclideanReconstruction *reconstruction);
+
+/*!
+    Refine camera poses and 3D coordinates using bundle adjustment.
+
     This routine adjusts all cameras positions, points, and the camera
     intrinsics (assumed common across all images) in \a *reconstruction. This
     assumes a full observation for reconstructed tracks; this implies that if

Modified: branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc
===================================================================
--- branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc	2013-07-25 23:42:20 UTC (rev 58610)
+++ branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc	2013-07-26 00:37:26 UTC (rev 58611)
@@ -600,22 +600,22 @@
 	return true;
 }
 
-static libmv_Reconstruction *libmv_solveReconstruction(const libmv_Tracks *libmv_tracks,
-			const libmv_cameraIntrinsicsOptions *libmv_camera_intrinsics_options,
+libmv_Reconstruction *libmv_solve(const libmv_Tracks *libmv_tracks,
+			const 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 &camera_intrinsics = libmv_reconstruction->intrinsics;
 
-	ReconstructUpdateCallback update_callback =
-		ReconstructUpdateCallback(progress_update_callback, callback_customdata);
+	libmv::Tracks &tracks = *((libmv::Tracks *) libmv_tracks);
 
-	/* Retrieve reconstruction options from C-API to libmv API */
+	ReconstructUpdateCallback update_callback(progress_update_callback,
+	                                          callback_customdata);
+
+	/* Convert options from C-API to libmv API */
 	cameraIntrinsicsFromOptions(libmv_camera_intrinsics_options, &camera_intrinsics);
 
 	libmv::ReconstructionOptions reconstruction_options;
@@ -625,43 +625,53 @@
 	/* Invert the camera intrinsics */
 	libmv::Tracks normalized_tracks = getNormalizedTracks(tracks, camera_intrinsics);
 
-	/* keyframe selection */
-	int keyframe1 = libmv_reconstruction_options->keyframe1,
-	    keyframe2 = libmv_reconstruction_options->keyframe2;
+	if (libmv_reconstruction_options->motion_flag & LIBMV_TRACKING_MOTION_MODAL) {
+		/* Perform modal solving */
+		libmv::ModalSolver(normalized_tracks, &reconstruction, &update_callback);
+		
+		/* Perform bundle adjustment */
+		libmv::EuclideanBundleModal(tracks,
+		                            &reconstruction);
+	}
+	else {
+		/* Keyframe selection */
+		int &keyframe1 = libmv_reconstruction_options->keyframe1,
+				&keyframe2 = libmv_reconstruction_options->keyframe2;
 
-	if (libmv_reconstruction_options->select_keyframes) {
-		LG << "Using automatic keyframe selection";
+		if (libmv_reconstruction_options->select_keyframes) {
+			LG << "Using automatic keyframe selection";
 
-		update_callback.invoke(0, "Selecting keyframes");
+			update_callback.invoke(0, "Selecting keyframes");
 
-		selectTwoKeyframesBasedOnGRICAndVariance(tracks,
-		                                         normalized_tracks,
-		                                         camera_intrinsics,
-		                                         reconstruction_options,
-		                                         keyframe1,
-		                                         keyframe2);
+			selectTwoKeyframesBasedOnGRICAndVariance(tracks,
+																							 normalized_tracks,
+																							 camera_intrinsics,
+																							 reconstruction_options,
+																							 keyframe1,
+																							 keyframe2);
+		}
 
-		/* so keyframes in the interface would be updated */
-		libmv_reconstruction_options->keyframe1 = keyframe1;
-		libmv_reconstruction_options->keyframe2 = keyframe2;
-	}
+		LG << "frames to init from: " << keyframe1 << " " << keyframe2;
 
-	/* actual reconstruction */
-	LG << "frames to init from: " << keyframe1 << " " << keyframe2;
+		/* Reconstruct for two frames */
+		libmv::vector<libmv::Marker> keyframe_markers =
+			normalized_tracks.MarkersForTracksInBothImages(keyframe1, keyframe2);
 
-	libmv::vector<libmv::Marker> keyframe_markers =
-		normalized_tracks.MarkersForTracksInBothImages(keyframe1, keyframe2);
+		LG << "number of markers for init: " << keyframe_markers.size();
 
-	LG << "number of markers for init: " << keyframe_markers.size();
+		update_callback.invoke(0, "Initial reconstruction");
 
-	update_callback.invoke(0, "Initial reconstruction");
+		libmv::EuclideanReconstructTwoFrames(keyframe_markers, &reconstruction);
 
-	libmv::EuclideanReconstructTwoFrames(keyframe_markers, &reconstruction);
-	libmv::EuclideanBundle(normalized_tracks, &reconstruction);
-	libmv::EuclideanCompleteReconstruction(reconstruction_options, normalized_tracks,
-	                                       &reconstruction, &update_callback);
+		/* Perform bundle adjustment */
+		libmv::EuclideanBundle(normalized_tracks, &reconstruction);
 
-	/* refinement */
+		/* Reconstruct for all frames */
+		libmv::EuclideanCompleteReconstruction(reconstruction_options, normalized_tracks,
+																					 &reconstruction, &update_callback);
+	}
+
+	/* Refine bundle parameters */
 	if (libmv_reconstruction_options->refine_intrinsics) {
 		libmv_solveRefineIntrinsics(tracks,
 		                            *libmv_reconstruction_options,
@@ -671,94 +681,16 @@
 		                            &camera_intrinsics);
 	}
 
-	/* set reconstruction scale to unity */
+	/* Set reconstruction scale to unity */
 	libmv::EuclideanScaleToUnity(&reconstruction);
 
-	/* finish reconstruction */
+	/* Finish reconstruction */
 	finishReconstruction(tracks, camera_intrinsics, libmv_reconstruction,
 	                     progress_update_callback, callback_customdata);
 
 	return (libmv_Reconstruction *)libmv_reconstruction;
 }
 
-static struct libmv_Reconstruction *libmv_solveModal(const libmv_Tracks *libmv_tracks,
-			const libmv_cameraIntrinsicsOptions *libmv_camera_intrinsics_options,
-			const 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 &camera_intrinsics = libmv_reconstruction->intrinsics;
-
-	ReconstructUpdateCallback update_callback =
-		ReconstructUpdateCallback(progress_update_callback, callback_customdata);
-
-	cameraIntrinsicsFromOptions(libmv_camera_intrinsics_options, &camera_intrinsics);
-
-	/* Invert the camera intrinsics. */
-	libmv::Tracks normalized_tracks = getNormalizedTracks(tracks, camera_intrinsics);
-
-	/* Actual reconstruction. */
-	libmv::ModalSolver(normalized_tracks, &reconstruction, &update_callback);
-
-	libmv::BundleOptions bundle_options;
-	bundle_options.bundle_intrinsics = libmv::BUNDLE_NO_INTRINSICS;
-	bundle_options.constraints = libmv::BUNDLE_NO_TRANSLATION;
-
-	libmv::CameraIntrinsics empty_intrinsics;
-	libmv::EuclideanBundleCommonIntrinsics(tracks,
-	                                       bundle_options,
-	                                       &reconstruction,
-	                                       &empty_intrinsics);
-
-	/* Refinement. */
-	if (libmv_reconstruction_options->refine_intrinsics) {
-		libmv_solveRefineIntrinsics(tracks,
-		                            *libmv_reconstruction_options,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list