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 /extern | |
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.
Diffstat (limited to 'extern')
-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; |