diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-02-26 15:56:10 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-02-26 15:56:10 +0400 |
commit | 8a5221750e73b48ea204bde7a489bc11e49770a6 (patch) | |
tree | 15c2e18fdb8979853219203a2c042a3b0f81deb3 | |
parent | 4a61df9c95d48c0854d49869eac2d3dc0453b7f4 (diff) |
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.
-rw-r--r-- | extern/libmv/libmv/simple_pipeline/keyframe_selection.cc | 30 |
1 files changed, 26 insertions, 4 deletions
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<Marker> 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<int> &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<Marker> 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<Marker> tracked_markers = - tracks.MarkersForTracksInBothImages(current_keyframe, candidate_image); + filtered_tracks.MarkersForTracksInBothImages(current_keyframe, + candidate_image); // Correspondences in normalized space Mat x1, x2; |