28 if (tracks->at(view1_tid).features.size()
29 < tracks->at(view2_tid).features.size())
32 Track& track1 = tracks->at(view1_tid);
33 Track& track2 = tracks->at(view2_tid);
35 for (std::size_t k = 0; k < track2.
features.size(); ++k)
37 int const view_id = track2.
features[k].view_id;
38 int const feat_id = track2.
features[k].feature_id;
39 viewports->at(view_id).track_ids[feat_id] = view1_tid;
54 for (std::size_t i = 0; i < viewports->size(); ++i)
56 Viewport& viewport = viewports->at(i);
61 if (this->opts.verbose_output)
62 std::cout <<
"Propagating track IDs..." << std::endl;
66 for (std::size_t i = 0; i < matching.size(); ++i)
73 for (std::size_t j = 0; j < tvm.
matches.size(); ++j)
76 int const view1_tid = viewport1.
track_ids[idx.first];
77 int const view2_tid = viewport2.
track_ids[idx.second];
78 if (view1_tid == -1 && view2_tid == -1)
81 viewport1.
track_ids[idx.first] = tracks->size();
82 viewport2.
track_ids[idx.second] = tracks->size();
83 tracks->push_back(
Track());
84 tracks->back().features.push_back(
86 tracks->back().features.push_back(
89 else if (view1_tid == -1 && view2_tid != -1)
92 viewport1.
track_ids[idx.first] = view2_tid;
93 tracks->at(view2_tid).features.push_back(
96 else if (view1_tid != -1 && view2_tid == -1)
99 viewport2.
track_ids[idx.second] = view1_tid;
100 tracks->at(view1_tid).features.push_back(
103 else if (view1_tid == view2_tid)
119 if (this->opts.verbose_output)
120 std::cout <<
"Removing tracks with conflicts..." << std::flush;
121 std::size_t
const num_invalid_tracks
122 = this->remove_invalid_tracks(viewports, tracks);
123 if (this->opts.verbose_output)
124 std::cout <<
" deleted " << num_invalid_tracks
125 <<
" tracks." << std::endl;
128 if (this->opts.verbose_output)
129 std::cout <<
"Colorizing tracks..." << std::endl;
130 for (std::size_t i = 0; i < tracks->size(); ++i)
132 Track& track = tracks->at(i);
134 for (std::size_t j = 0; j < track.
features.size(); ++j)
141 track.
color[0] =
static_cast<uint8_t
>(color[0] / color[3] + 0.5f);
142 track.
color[1] =
static_cast<uint8_t
>(color[1] / color[3] + 0.5f);
143 track.
color[2] =
static_cast<uint8_t
>(color[2] / color[3] + 0.5f);
156 std::vector<bool> delete_tracks(tracks->size());
157 int num_invalid_tracks = 0;
158 for (std::size_t i = 0; i < tracks->size(); ++i)
160 if (tracks->at(i).features.empty())
162 num_invalid_tracks += 1;
163 delete_tracks[i] =
true;
167 std::set<int> view_ids;
168 for (std::size_t j = 0; j < tracks->at(i).features.size(); ++j)
170 FeatureReference
const& ref = tracks->at(i).features[j];
171 if (view_ids.insert(ref.view_id).second ==
false)
173 num_invalid_tracks += 1;
174 delete_tracks[i] =
true;
181 std::vector<int> id_mapping(delete_tracks.size(), -1);
182 int valid_track_counter = 0;
183 for (std::size_t i = 0; i < delete_tracks.size(); ++i)
185 if (delete_tracks[i])
187 id_mapping[i] = valid_track_counter;
188 valid_track_counter += 1;
192 for (std::size_t i = 0; i < viewports->size(); ++i)
194 std::vector<int>& track_ids = viewports->at(i).track_ids;
195 for (std::size_t j = 0; j < track_ids.size(); ++j)
196 if (track_ids[j] >= 0)
197 track_ids[j] = id_mapping[track_ids[j]];
203 return num_invalid_tracks;
Vector class for arbitrary dimensions and types.
The FeatureSet holds per-feature information for a single view, and allows to transparently compute a...
std::vector< math::Vec3uc > colors
Per-feature image color.
std::vector< math::Vec2f > positions
Per-feature image position.
void vector_clean(std::vector< bool > const &delete_list, std::vector< T > *vector)
Erases all elements from 'vector' that are marked with 'true' in 'delete_list'.
std::vector< Viewport > ViewportList
The list of all viewports considered for bundling.
std::vector< Track > TrackList
The list of all tracks.
std::vector< FeatureReference > FeatureReferenceList
The list of all feature references inside a track.
std::vector< TwoViewMatching > PairwiseMatching
The matching result between several pairs of views.
void unify_tracks(int view1_tid, int view2_tid, TrackList *tracks, ViewportList *viewports)
std::pair< int, int > CorrespondenceIndex
The IDs of a matching feature pair in two images.
void swap(mve::Image< T > &a, mve::Image< T > &b)
Specialization of std::swap for efficient image swapping.
#define SFM_BUNDLER_NAMESPACE_END
#define SFM_BUNDLER_NAMESPACE_BEGIN
#define SFM_NAMESPACE_END
#define SFM_NAMESPACE_BEGIN
References a 2D feature in a specific view.
Representation of a feature track.
FeatureReferenceList features
The matching result between two views.
CorrespondenceIndices matches
Per-viewport information.
std::vector< int > track_ids
Per-feature track ID, -1 if not part of a track.
FeatureSet features
Per-feature information.