[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58945] branches/soc-2013-motion_track/ extern/libmv: More framework for multicamera reconstruction

Joseph Mansfield sftrabbit at gmail.com
Tue Aug 6 01:22:56 CEST 2013


Revision: 58945
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58945
Author:   sftrabbit
Date:     2013-08-05 23:22:56 +0000 (Mon, 05 Aug 2013)
Log Message:
-----------
More framework for multicamera reconstruction

All algorithms have been adjusted to take into account multiple cameras and their intrinsics except for the bundle adjustment. This means it will give an incorrect result for multicamera reconstruction at the moment, but single camera reconstruction still functions normally.

Modified Paths:
--------------
    branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.cc
    branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/initialize_reconstruction.cc
    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-08-05 20:57:13 UTC (rev 58944)
+++ branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/bundle.cc	2013-08-05 23:22:56 UTC (rev 58945)
@@ -455,15 +455,16 @@
   bool have_locked_camera = false;
   for (int i = 0; i < markers.size(); ++i) {
     const Marker &marker = markers[i];
-    EuclideanCamera *camera = reconstruction->CameraForImage(0, marker.image);
+    int camera = marker.camera;
+    EuclideanCamera *camera_pose = reconstruction->CameraForImage(camera, marker.image);
     EuclideanPoint *point = reconstruction->PointForTrack(marker.track);
-    if (camera == NULL || point == NULL) {
+    if (camera_pose == NULL || point == NULL) {
       continue;
     }
 
     // Rotation of camera denoted in angle axis followed with
     // camera translaiton.
-    double *current_camera_R_t = &all_cameras_R_t[camera->image](0);
+    double *current_camera_R_t = &all_cameras_R_t[camera_pose->image](0);
 
     OpenCVReprojectionError *cost_function;
     if (bundle_options.constraints & BUNDLE_CONSTRAIN_FOCAL_LENGTH) {

Modified: branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/initialize_reconstruction.cc
===================================================================
--- branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/initialize_reconstruction.cc	2013-08-05 20:57:13 UTC (rev 58944)
+++ branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/initialize_reconstruction.cc	2013-08-05 23:22:56 UTC (rev 58945)
@@ -57,12 +57,14 @@
     return false;
   }
 
+  int camera = markers[0].camera;
+
   int image1, image2;
   GetImagesInMarkers(markers, &image1, &image2);
 
   Mat x1, x2;
-  CoordinatesForMarkersInImage(markers, 0, image1, &x1);
-  CoordinatesForMarkersInImage(markers, 0, image2, &x2);
+  CoordinatesForMarkersInImage(markers, camera, image1, &x1);
+  CoordinatesForMarkersInImage(markers, camera, image2, &x2);
 
   Mat3 F;
   NormalizedEightPointSolver(x1, x2, &F);
@@ -85,8 +87,8 @@
   }
 
   // Image 1 gets the reference frame, image 2 gets the relative motion.
-  reconstruction->InsertCamera(0, image1, Mat3::Identity(), Vec3::Zero());
-  reconstruction->InsertCamera(0, image2, R, t);
+  reconstruction->InsertCamera(camera, image1, Mat3::Identity(), Vec3::Zero());
+  reconstruction->InsertCamera(camera, image2, R, t);
 
   LG << "From two frame reconstruction got:\nR:\n" << R
      << "\nt:" << t.transpose();

Modified: branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc
===================================================================
--- branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc	2013-08-05 20:57:13 UTC (rev 58944)
+++ branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc	2013-08-05 23:22:56 UTC (rev 58945)
@@ -462,12 +462,14 @@
 	}
 }
 
-static libmv::Tracks getNormalizedTracks(const libmv::Tracks &tracks, const libmv::CameraIntrinsics &camera_intrinsics)
+static libmv::Tracks getNormalizedTracks(const libmv::Tracks &tracks,
+                                         const std::vector<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,
+    int camera = markers[i].camera;
+		camera_intrinsics[camera].InvertIntrinsics(markers[i].x, markers[i].y,
 			&(markers[i].x), &(markers[i].y));
 	}
 
@@ -477,7 +479,7 @@
 static bool selectTwoKeyframesBasedOnGRICAndVariance(
                           libmv::Tracks &tracks,
                           libmv::Tracks &normalized_tracks,
-                          libmv::CameraIntrinsics &camera_intrinsics,
+                          std::vector<libmv::CameraIntrinsics> &camera_intrinsics,
                           libmv::ReconstructionOptions &reconstruction_options,
                           int &keyframe1,
                           int &keyframe2)
@@ -486,7 +488,7 @@
 
 	/* Get list of all keyframe candidates first. */
 	SelectkeyframesBasedOnGRICAndVariance(normalized_tracks,
-	                                      camera_intrinsics,
+	                                      camera_intrinsics[0],
 	                                      keyframes);
 
 	if (keyframes.size() < 2) {
@@ -499,9 +501,6 @@
 		return true;
 	}
 
-  std::vector<libmv::CameraIntrinsics> intrinsics_vector;
-  intrinsics_vector.push_back(camera_intrinsics);
-
 	/* Now choose two keyframes with minimal reprojection error after initial
 	 * reconstruction choose keyframes with the least reprojection error after
 	 * solving from two candidate keyframes.
@@ -532,7 +531,7 @@
 		double current_error =
 			libmv::EuclideanReprojectionError(tracks,
 			                                  reconstruction,
-			                                  intrinsics_vector);
+			                                  camera_intrinsics);
 
 		LG << "Error between " << previous_keyframe
 		   << " and " << current_keyframe
@@ -621,9 +620,10 @@
 	reconstruction_options.use_fallback_reconstruction = libmv_reconstruction_options->use_fallback_reconstruction;
 
 	/* Invert the camera intrinsics */
-	libmv::Tracks normalized_tracks = getNormalizedTracks(tracks, camera_intrinsics[0]);
+	libmv::Tracks normalized_tracks = getNormalizedTracks(tracks, camera_intrinsics);
 
-	if (libmv_reconstruction_options->motion_flag & LIBMV_TRACKING_MOTION_MODAL) {
+	if (libmv_reconstruction_options->motion_flag & LIBMV_TRACKING_MOTION_MODAL &&
+	    num_cameras == 1) {
 		/* Perform modal solving */
 		libmv::ModalSolver(normalized_tracks, &reconstruction, &update_callback);
 		
@@ -643,7 +643,7 @@
 
 			selectTwoKeyframesBasedOnGRICAndVariance(tracks,
 			                                         normalized_tracks,
-			                                         camera_intrinsics[0],
+			                                         camera_intrinsics,
 			                                         reconstruction_options,
 			                                         keyframe1,
 			                                         keyframe2);




More information about the Bf-blender-cvs mailing list