[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58915] branches/soc-2013-motion_track/ extern/libmv/libmv-capi.cc: Add correct handling of multicamera intrinsics

Joseph Mansfield sftrabbit at gmail.com
Mon Aug 5 02:37:14 CEST 2013


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;




More information about the Bf-blender-cvs mailing list