Revision: 58915
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58915
Author:   sftrabbit
Date:     2013-08-05 00:37:13 +0000 (Mon, 05 Aug 2013)
Log Message:
-----------
Add correct handling of multicamera intrinsics

One argument to libmv_solve is an array of camera intrinsics options. The code 
now converts all elements of the array to internal CameraIntrinsics, instead of 
just the first. The output struct, libmv_Reconstruction, now contains a vector 
of output camera intrinsics (each element corresponding to a different camera).

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

Modified: branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc
===================================================================
--- branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc   2013-08-04 
23:48:50 UTC (rev 58914)
+++ branches/soc-2013-motion_track/extern/libmv/libmv-capi.cc   2013-08-05 
00:37:13 UTC (rev 58915)
@@ -36,6 +36,8 @@
 
 #include "libmv-capi.h"
 
+#include <vector>
+
 #include <cstdlib>
 #include <cassert>
 
@@ -67,7 +69,7 @@
 
        /* used for per-track average error calculation after reconstruction */
        libmv::Tracks tracks;
-       libmv::CameraIntrinsics intrinsics;
+       std::vector<libmv::CameraIntrinsics> intrinsics;
 
        double error;
 };
@@ -450,6 +452,16 @@
                                        
camera_intrinsics_options->image_height);
 }
 
+static void cameraIntrinsicsFromOptions(const libmv_CameraIntrinsicsOptions 
camera_intrinsics_options[],
+                                        int num_cameras,
+                                        std::vector<libmv::CameraIntrinsics> 
&camera_intrinsics)
+{
+       for (int i = 0; i < num_cameras; ++i) {
+               camera_intrinsics.push_back(libmv::CameraIntrinsics());
+         cameraIntrinsicsFromOptions(camera_intrinsics_options, 
&camera_intrinsics[i]);
+       }
+}
+
 static libmv::Tracks getNormalizedTracks(const libmv::Tracks &tracks, const 
libmv::CameraIntrinsics &camera_intrinsics)
 {
        libmv::vector<libmv::Marker> markers = tracks.AllMarkers();
@@ -590,22 +602,23 @@
 {
        struct libmv_Reconstruction *libmv_reconstruction = new 
libmv_Reconstruction();
        libmv::EuclideanReconstruction &reconstruction = 
libmv_reconstruction->reconstruction;
-       libmv::CameraIntrinsics &camera_intrinsics = 
libmv_reconstruction->intrinsics;
+       std::vector<libmv::CameraIntrinsics> &camera_intrinsics = 
libmv_reconstruction->intrinsics;
 
        libmv::Tracks &tracks = *((libmv::Tracks *) libmv_tracks);
+       int num_cameras = tracks.MaxCamera() + 1;
 
        ReconstructUpdateCallback update_callback(progress_update_callback,
                                                  callback_customdata);
 
        /* Convert options from C-API to libmv API */
-       cameraIntrinsicsFromOptions(libmv_camera_intrinsics_options, 
&camera_intrinsics);
+       cameraIntrinsicsFromOptions(libmv_camera_intrinsics_options, 
num_cameras, camera_intrinsics);
 
        libmv::ReconstructionOptions reconstruction_options;
        reconstruction_options.success_threshold = 
libmv_reconstruction_options->success_threshold;
        reconstruction_options.use_fallback_reconstruction = 
libmv_reconstruction_options->use_fallback_reconstruction;
 
        /* Invert the camera intrinsics */
-       libmv::Tracks normalized_tracks = getNormalizedTracks(tracks, 
camera_intrinsics);
+       libmv::Tracks normalized_tracks = getNormalizedTracks(tracks, 
camera_intrinsics[0]);
 
        if (libmv_reconstruction_options->motion_flag & 
LIBMV_TRACKING_MOTION_MODAL) {
                /* Perform modal solving */
@@ -627,7 +640,7 @@
 
                        selectTwoKeyframesBasedOnGRICAndVariance(tracks,
                                                                 
normalized_tracks,
-                                                                
camera_intrinsics,
+                                                                
camera_intrinsics[0],
                                                                 
reconstruction_options,
                                                                 keyframe1,
                                                                 keyframe2);
@@ -663,14 +676,14 @@
                libmv::EuclideanBundleCommonIntrinsics(tracks,
                                                       
refinement_bundle_options,
                                                       &reconstruction,
-                                                      &camera_intrinsics);
+                                                      &camera_intrinsics[0]);
        }
 
        /* Set reconstruction scale to unity */
        libmv::EuclideanScaleToUnity(&reconstruction);
 
        /* Finish reconstruction */
-       finishReconstruction(tracks, camera_intrinsics, libmv_reconstruction,
+       finishReconstruction(tracks, camera_intrinsics[0], libmv_reconstruction,
                             progress_update_callback, callback_customdata);
 
        return (struct libmv_Reconstruction *)libmv_reconstruction;
@@ -716,23 +729,25 @@
 double libmv_reprojectionErrorForTrack(const struct libmv_Reconstruction 
*libmv_reconstruction, int track)
 {
        const libmv::EuclideanReconstruction *reconstruction = 
&libmv_reconstruction->reconstruction;
-       const libmv::CameraIntrinsics *intrinsics = 
&libmv_reconstruction->intrinsics;
+       const std::vector<libmv::CameraIntrinsics> *intrinsics = 
&libmv_reconstruction->intrinsics;
        libmv::vector<libmv::Marker> markers = 
libmv_reconstruction->tracks.MarkersForTrack(track);
 
        int num_reprojected = 0;
        double total_error = 0.0;
 
        for (int i = 0; i < markers.size(); ++i) {
-               const libmv::EuclideanCamera *camera = 
reconstruction->CameraForImage(markers[i].camera, markers[i].image);
+               int camera = markers[i].camera;
+               const libmv::EuclideanCamera *camera_pose = 
reconstruction->CameraForImage(camera, markers[i].image);
                const libmv::EuclideanPoint *point = 
reconstruction->PointForTrack(markers[i].track);
+               const libmv::CameraIntrinsics camera_intrinsics = 
(*intrinsics)[camera];
 
-               if (!camera || !point) {
+               if (!camera_pose || !point) {
                        continue;
                }
 
                num_reprojected++;
 
-               libmv::Marker reprojected_marker = ProjectMarker(*point, 
*camera, *intrinsics);
+               libmv::Marker reprojected_marker = ProjectMarker(*point, 
*camera_pose, camera_intrinsics);
                double ex = reprojected_marker.x - markers[i].x;
                double ey = reprojected_marker.y - markers[i].y;
 
@@ -746,7 +761,7 @@
                                        int camera, int image)
 {
        const libmv::EuclideanReconstruction *reconstruction = 
&libmv_reconstruction->reconstruction;
-       const libmv::CameraIntrinsics *intrinsics = 
&libmv_reconstruction->intrinsics;
+       const libmv::CameraIntrinsics *intrinsics = 
&libmv_reconstruction->intrinsics[camera];
        libmv::vector<libmv::Marker> markers = 
libmv_reconstruction->tracks.MarkersInImage(camera, image);
        const libmv::EuclideanCamera *camera_pose = 
reconstruction->CameraForImage(camera, image);
        int num_reprojected = 0;

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

Reply via email to