std::vector assembleTraces()

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;
}