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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to