From 8a5221750e73b48ea204bde7a489bc11e49770a6 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 26 Feb 2014 17:56:10 +0600 Subject: Ignore zero weighted markers in keyframe selection It doesn't make sense to use zero-weighted tracks as a correspondences in keyframe selection. Such tracks are not guaranteed to be tracked accurately because their purpose is to add reference points in 3D space without affecting the solution. --- .../libmv/simple_pipeline/keyframe_selection.cc | 30 +++++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) (limited to 'extern') diff --git a/extern/libmv/libmv/simple_pipeline/keyframe_selection.cc b/extern/libmv/libmv/simple_pipeline/keyframe_selection.cc index 6ab9e7eefb6..64504e7af9a 100644 --- a/extern/libmv/libmv/simple_pipeline/keyframe_selection.cc +++ b/extern/libmv/libmv/simple_pipeline/keyframe_selection.cc @@ -131,9 +131,26 @@ Mat pseudoInverse(const Mat &matrix) { return V * D * V.inverse(); } + +void filterZeroWeightMarkersFromTracks(const Tracks &tracks, + Tracks *filtered_tracks) { + vector all_markers = tracks.AllMarkers(); + + for (int i = 0; i < all_markers.size(); ++i) { + Marker &marker = all_markers[i]; + if (marker.weight != 0.0) { + filtered_tracks->Insert(marker.image, + marker.track, + marker.x, + marker.y, + marker.weight); + } + } +} + } // namespace -void SelectKeyframesBasedOnGRICAndVariance(const Tracks &tracks, +void SelectKeyframesBasedOnGRICAndVariance(const Tracks &_tracks, CameraIntrinsics &intrinsics, vector &keyframes) { // Mirza Tahir Ahmed, Matthew N. Dailey @@ -141,7 +158,10 @@ void SelectKeyframesBasedOnGRICAndVariance(const Tracks &tracks, // // http://www.cs.ait.ac.th/~mdailey/papers/Tahir-KeyFrame.pdf - int max_image = tracks.MaxImage(); + Tracks filtered_tracks; + filterZeroWeightMarkersFromTracks(_tracks, &filtered_tracks); + + int max_image = filtered_tracks.MaxImage(); int next_keyframe = 1; int number_keyframes = 0; @@ -173,11 +193,13 @@ void SelectKeyframesBasedOnGRICAndVariance(const Tracks &tracks, candidate_image++) { // Conjunction of all markers from both keyframes vector all_markers = - tracks.MarkersInBothImages(current_keyframe, candidate_image); + filtered_tracks.MarkersInBothImages(current_keyframe, + candidate_image); // Match keypoints between frames current_keyframe and candidate_image vector tracked_markers = - tracks.MarkersForTracksInBothImages(current_keyframe, candidate_image); + filtered_tracks.MarkersForTracksInBothImages(current_keyframe, + candidate_image); // Correspondences in normalized space Mat x1, x2; -- cgit v1.2.3