in source/calibration/GeometricCalibration.cpp [529:567]
std::vector<Trace> assembleTraces(FeatureMap& featureMap, const std::vector<Overlap>& overlaps) {
// mark all features as unreferenced
for (auto& features : featureMap) {
for (Feature& feature : features.second) {
feature.trace = -1;
}
}
std::vector<Trace> traces;
int nonemptyTraceCount = 0;
for (const Overlap& overlap : overlaps) {
const std::reference_wrapper<std::vector<Feature>> features[2] = {
featureMap[overlap.images[0]], featureMap[overlap.images[1]]};
for (const auto& match : overlap.matches) {
const std::reference_wrapper<int> indexes[2] = {
features[0].get()[match[0]].trace, features[1].get()[match[1]].trace};
if (indexes[0] < 0 && indexes[1] < 0) { // neither belongs to a trace, start new trace
traces.emplace_back();
nonemptyTraceCount++;
for (ssize_t i = 0; i < ssize(indexes); ++i) {
indexes[i].get() = traces.size() - 1;
traces[indexes[i]].add(overlap.images[i], match[i]);
}
} else if (indexes[0] < 0) { // 0 does not belong to a trace, add to 1's trace
indexes[0].get() = indexes[1];
traces[indexes[0]].add(overlap.images[0], match[0]);
} else if (indexes[1] < 0) { // 1 does not belong to a trace, add to 0's trace
indexes[1].get() = indexes[0];
traces[indexes[1]].add(overlap.images[1], match[1]);
} else if (indexes[0] != indexes[1]) { // merge two traces, 0 inherits 1's references
traces[indexes[0]].inherit(traces[indexes[1]], featureMap, indexes[0]);
--nonemptyTraceCount;
}
}
}
LOG(INFO) << folly::sformat("found {} nonempty traces", nonemptyTraceCount);
return traces;
}