[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