[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52860] branches/soc-2011-tomato/extern/ libmv/libmv-capi.cpp: Camera tracking: fix for incorrect two ketframe selection criteria

Sergey Sharybin sergey.vfx at gmail.com
Mon Dec 10 19:04:37 CET 2012


Revision: 52860
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52860
Author:   nazgul
Date:     2012-12-10 18:04:29 +0000 (Mon, 10 Dec 2012)
Log Message:
-----------
Camera tracking: fix for incorrect two ketframe selection criteria

Reprojection error of a solution should be calculated for tracks in
image space, not in normalized space.

Modified Paths:
--------------
    branches/soc-2011-tomato/extern/libmv/libmv-capi.cpp

Modified: branches/soc-2011-tomato/extern/libmv/libmv-capi.cpp
===================================================================
--- branches/soc-2011-tomato/extern/libmv/libmv-capi.cpp	2012-12-10 17:05:33 UTC (rev 52859)
+++ branches/soc-2011-tomato/extern/libmv/libmv-capi.cpp	2012-12-10 18:04:29 UTC (rev 52860)
@@ -514,14 +514,15 @@
 	libmv_reconstruction->error = libmv::EuclideanReprojectionError(*tracks, *reconstruction, *camera_intrinsics);
 }
 
-static bool selectTwoKeyframesBasedOnGRIC(libmv::Tracks &tracks, libmv::CameraIntrinsics &camera_intrinsics,
+static bool selectTwoKeyframesBasedOnGRIC(libmv::Tracks &tracks, libmv::Tracks &normalized_tracks,
+                                          libmv::CameraIntrinsics &camera_intrinsics,
                                           libmv::ReconstructionOptions &reconstruction_options,
                                           int &keyframe1, int &keyframe2)
 {
 	libmv::vector<int> keyframes;
 
 	/* Get list of all keyframe candidates first */
-	SelectkeyframesBasedOnGRIC(tracks, keyframes);
+	SelectkeyframesBasedOnGRIC(normalized_tracks, keyframes);
 
 	if (keyframes.size() < 2) {
 		LG << "Not enough keyframes detected by GRIC";
@@ -544,19 +545,21 @@
 		int current_keyframe = keyframes[i];
 
 		libmv::vector<libmv::Marker> keyframe_markers =
-			tracks.MarkersForTracksInBothImages(previous_keyframe, current_keyframe);
+			normalized_tracks.MarkersForTracksInBothImages(previous_keyframe, current_keyframe);
 
 		libmv::Tracks keyframe_tracks(keyframe_markers);
 
 		/* get a solution from two keyframes only */
 		libmv::EuclideanReconstructTwoFrames(keyframe_markers, &reconstruction);
-		libmv::EuclideanBundle(tracks, &reconstruction);
+		libmv::EuclideanBundle(keyframe_tracks, &reconstruction);
 		libmv::EuclideanCompleteReconstruction(reconstruction_options, keyframe_tracks,
 		                                       &reconstruction, NULL);
 
 		double current_error =
 			libmv::EuclideanReprojectionError(tracks, reconstruction, camera_intrinsics);
 
+		LG << "Error between " << previous_keyframe << " and " << current_keyframe << ": " << current_error;
+
 		if (current_error < best_error) {
 			best_error = current_error;
 			keyframe1 = previous_keyframe;
@@ -603,9 +606,8 @@
 
 		update_callback.invoke(0, "Selecting keyframes");
 
-		selectTwoKeyframesBasedOnGRIC(normalized_tracks, *camera_intrinsics,
-		                              reconstruction_options,
-		                              keyframe1, keyframe2);
+		selectTwoKeyframesBasedOnGRIC(*tracks, normalized_tracks, *camera_intrinsics,
+		                              reconstruction_options, keyframe1, keyframe2);
 
 		/* so keyframes in the interface would be updated */
 		libmv_reconstruction_options->keyframe1 = keyframe1;




More information about the Bf-blender-cvs mailing list