diff --git a/include/core/processor/track_matrix.h b/include/core/processor/track_matrix.h index 87511440e721baf20d2b3aa05123f0499caa4c84..215f02060b94a4f3429c4f042a78a94949f2272c 100644 --- a/include/core/processor/track_matrix.h +++ b/include/core/processor/track_matrix.h @@ -45,9 +45,12 @@ using std::list; using std::pair; using std::shared_ptr; -typedef map<TimeStamp, FeatureBasePtr> Track; -typedef map<size_t, FeatureBasePtr > Snapshot; -typedef map<size_t, pair<FeatureBasePtr, FeatureBasePtr> > TrackMatches; // matched feature pairs indexed by track_id +typedef map<TimeStamp, FeatureBasePtr> Track; +typedef map<TimeStamp, FeatureBaseConstPtr> TrackConst; +typedef map<size_t, FeatureBasePtr > Snapshot; +typedef map<size_t, FeatureBaseConstPtr > SnapshotConst; +typedef map<size_t, pair<FeatureBasePtr, FeatureBasePtr> > TrackMatches; // matched feature pairs indexed by track_id +typedef map<size_t, pair<FeatureBaseConstPtr, FeatureBaseConstPtr> > TrackMatchesConst; // matched feature pairs indexed by track_id /** \brief Matrix of tracked features, by track and by snapshot (Captures or time stamps) * This class implements the following data structure: @@ -107,21 +110,29 @@ class TrackMatrix void remove (CaptureBasePtr _cap); SizeStd numTracks () const; SizeStd trackSize (const SizeStd& _track_id) const; - Track track (const SizeStd& _track_id) const; - Snapshot snapshot (CaptureBasePtr _capture) const; - vector<FeatureBasePtr> - trackAsVector(const SizeStd& _track_id) const; - list<FeatureBasePtr> - snapshotAsList(CaptureBasePtr _cap) const; - TrackMatches matches (CaptureBasePtr _cap_1, CaptureBasePtr _cap_2) const; - FeatureBasePtr firstFeature(const SizeStd& _track_id) const; - FeatureBasePtr lastFeature (const SizeStd& _track_id) const; - FeatureBasePtr feature (const SizeStd& _track_id, CaptureBasePtr _cap) const; - CaptureBasePtr firstCapture(const SizeStd& _track_id) const; + TrackConst track (const SizeStd& _track_id) const; + Track track (const SizeStd& _track_id); + SnapshotConst snapshot (CaptureBaseConstPtr _capture) const; + Snapshot snapshot (CaptureBasePtr _capture); + vector<FeatureBaseConstPtr> trackAsVector(const SizeStd& _track_id) const; + vector<FeatureBasePtr> trackAsVector(const SizeStd& _track_id); + FeatureBaseConstPtrList snapshotAsList(CaptureBaseConstPtr _cap) const; + FeatureBasePtrList snapshotAsList(CaptureBasePtr _cap); + TrackMatchesConst matches (CaptureBaseConstPtr _cap_1, CaptureBaseConstPtr _cap_2) const; + TrackMatches matches (CaptureBasePtr _cap_1, CaptureBasePtr _cap_2); + FeatureBaseConstPtr firstFeature(const SizeStd& _track_id) const; + FeatureBasePtr firstFeature(const SizeStd& _track_id); + FeatureBaseConstPtr lastFeature (const SizeStd& _track_id) const; + FeatureBasePtr lastFeature (const SizeStd& _track_id); + FeatureBaseConstPtr feature (const SizeStd& _track_id, CaptureBaseConstPtr _cap) const; + FeatureBasePtr feature (const SizeStd& _track_id, CaptureBasePtr _cap); + CaptureBaseConstPtr firstCapture(const SizeStd& _track_id) const; + CaptureBasePtr firstCapture(const SizeStd& _track_id); // tracks across captures that belong to keyframe // SizeStd numKeyframeTracks(); - Track trackAtKeyframes(size_t _track_id) const; + TrackConst trackAtKeyframes(size_t _track_id) const; + Track trackAtKeyframes(size_t _track_id); // bool markKeyframe(CaptureBasePtr _capture); // bool unmarkKeyframe(CaptureBasePtr _capture); @@ -131,11 +142,13 @@ class TrackMatrix // tracks across all Captures map<SizeStd, Track > tracks_; // map indexed by track_Id of ( maps indexed by TimeStamp of ( features ) ) + map<SizeStd, TrackConst > tracks_const_; // map indexed by track_Id of ( maps indexed by TimeStamp of ( features ) ) // // tracks across captures that belong to keyframe // map<size_t, Track > tracks_kf_; // map indexed by track_Id of ( maps indexed by TimeStamp of ( features ) ) // Across track: maps of Feature pointers indexed by track_Id. map<CaptureBasePtr, Snapshot > snapshots_; // map indexed by capture_ptr of ( maps indexed by track_Id of ( features ) ) + map<CaptureBaseConstPtr, SnapshotConst > snapshots_const_; // map indexed by capture_ptr of ( maps indexed by track_Id of ( features ) ) }; } /* namespace wolf */ diff --git a/src/processor/track_matrix.cpp b/src/processor/track_matrix.cpp index 1830270b13d7fea4d6462f2c97c7977b0879308f..6f6e02c3bc841293f264c880cd037a377efd1bfc 100644 --- a/src/processor/track_matrix.cpp +++ b/src/processor/track_matrix.cpp @@ -43,7 +43,15 @@ TrackMatrix::~TrackMatrix() // } -Track TrackMatrix::track(const SizeStd& _track_id) const +TrackConst TrackMatrix::track(const SizeStd& _track_id) const +{ + if (tracks_const_.count(_track_id) > 0) + return tracks_const_.at(_track_id); + else + return TrackConst(); +} + +Track TrackMatrix::track(const SizeStd& _track_id) { if (tracks_.count(_track_id) > 0) return tracks_.at(_track_id); @@ -51,7 +59,15 @@ Track TrackMatrix::track(const SizeStd& _track_id) const return Track(); } -Snapshot TrackMatrix::snapshot(CaptureBasePtr _capture) const +SnapshotConst TrackMatrix::snapshot(CaptureBaseConstPtr _capture) const +{ + if (_capture && snapshots_const_.count(_capture) > 0) + return snapshots_const_.at(_capture); + else + return SnapshotConst(); +} + +Snapshot TrackMatrix::snapshot(CaptureBasePtr _capture) { if (_capture && snapshots_.count(_capture) > 0) return snapshots_.at(_capture); @@ -72,7 +88,9 @@ void TrackMatrix::add(const SizeStd& _track_id, const FeatureBasePtr& _ftr) _ftr->setTrackId(_track_id); tracks_[_track_id].emplace(_ftr->getCapture()->getTimeStamp(), _ftr); + tracks_const_[_track_id].emplace(_ftr->getCapture()->getTimeStamp(), _ftr); snapshots_[_ftr->getCapture()].emplace(_track_id, _ftr); // will create new snapshot if _cap_id is not present + snapshots_const_[_ftr->getCapture()].emplace(_track_id, _ftr); // will create new snapshot if _cap_id is not present } void TrackMatrix::add(const FeatureBasePtr& _ftr_existing,const FeatureBasePtr& _ftr_new) @@ -89,13 +107,16 @@ void TrackMatrix::remove(const SizeStd& _track_id) { CaptureBasePtr cap = pair_time_ftr.second->getCapture(); snapshots_.at(cap).erase(_track_id); + snapshots_const_.at(cap).erase(_track_id); if (snapshots_.at(cap).empty()) snapshots_.erase(cap); - + if (snapshots_const_.at(cap).empty()) + snapshots_const_.erase(cap); } // Remove track tracks_.erase(_track_id); + tracks_const_.erase(_track_id); } } @@ -109,12 +130,16 @@ void TrackMatrix::remove(CaptureBasePtr _cap) { SizeStd trk_id = pair_trkid_ftr.first; tracks_.at(trk_id).erase(ts); + tracks_const_.at(trk_id).erase(ts); if (tracks_.at(trk_id).empty()) tracks_.erase(trk_id); + if (tracks_const_.at(trk_id).empty()) + tracks_const_.erase(trk_id); } // remove snapshot snapshots_.erase(_cap); + snapshots_const_.erase(_cap); } } @@ -127,15 +152,21 @@ void TrackMatrix::remove(FeatureBasePtr _ftr) { if(tracks_.count(_ftr->trackId()) && tracks_.at(_ftr->trackId()).count(cap->getTimeStamp())) { - tracks_ .at(_ftr->trackId()).erase(cap->getTimeStamp()); + tracks_ .at(_ftr->trackId()).erase(cap->getTimeStamp()); + tracks_const_.at(_ftr->trackId()).erase(cap->getTimeStamp()); if (tracks_.at(_ftr->trackId()).empty()) tracks_.erase(_ftr->trackId()); + if (tracks_const_.at(_ftr->trackId()).empty()) + tracks_const_.erase(_ftr->trackId()); } if(snapshots_.count(cap) && snapshots_.at(cap).count(_ftr->trackId())) { - snapshots_. at(cap).erase(_ftr->trackId()); + snapshots_ .at(cap).erase(_ftr->trackId()); + snapshots_const_.at(cap).erase(_ftr->trackId()); if (snapshots_.at(cap).empty()) snapshots_.erase(cap); + if (snapshots_const_.at(cap).empty()) + snapshots_const_.erase(cap); } } } @@ -151,7 +182,15 @@ size_t TrackMatrix::trackSize(const SizeStd& _track_id) const return track(_track_id).size(); } -FeatureBasePtr TrackMatrix::firstFeature(const SizeStd& _track_id) const +FeatureBaseConstPtr TrackMatrix::firstFeature(const SizeStd& _track_id) const +{ + if (tracks_const_.count(_track_id) > 0) + return tracks_const_.at(_track_id).begin()->second; + else + return nullptr; +} + +FeatureBasePtr TrackMatrix::firstFeature(const SizeStd& _track_id) { if (tracks_.count(_track_id) > 0) return tracks_.at(_track_id).begin()->second; @@ -159,7 +198,15 @@ FeatureBasePtr TrackMatrix::firstFeature(const SizeStd& _track_id) const return nullptr; } -FeatureBasePtr TrackMatrix::lastFeature(const SizeStd& _track_id) const +FeatureBaseConstPtr TrackMatrix::lastFeature(const SizeStd& _track_id) const +{ + if (tracks_const_.count(_track_id) > 0) + return tracks_const_.at(_track_id).rbegin()->second; + else + return nullptr; +} + +FeatureBasePtr TrackMatrix::lastFeature(const SizeStd& _track_id) { if (tracks_.count(_track_id) > 0) return tracks_.at(_track_id).rbegin()->second; @@ -167,7 +214,19 @@ FeatureBasePtr TrackMatrix::lastFeature(const SizeStd& _track_id) const return nullptr; } -vector<FeatureBasePtr> TrackMatrix::trackAsVector(const SizeStd& _track_id) const +vector<FeatureBaseConstPtr> TrackMatrix::trackAsVector(const SizeStd& _track_id) const +{ + vector<FeatureBaseConstPtr> vec; + if (tracks_.count(_track_id)) + { + vec.reserve(trackSize(_track_id)); + for (auto const& pair_time_ftr : tracks_const_.at(_track_id)) + vec.push_back(pair_time_ftr.second); + } + return vec; +} + +vector<FeatureBasePtr> TrackMatrix::trackAsVector(const SizeStd& _track_id) { vector<FeatureBasePtr> vec; if (tracks_.count(_track_id)) @@ -179,23 +238,56 @@ vector<FeatureBasePtr> TrackMatrix::trackAsVector(const SizeStd& _track_id) cons return vec; } -std::list<FeatureBasePtr> TrackMatrix::snapshotAsList(CaptureBasePtr _cap) const +FeatureBaseConstPtrList TrackMatrix::snapshotAsList(CaptureBaseConstPtr _cap) const { - std::list<FeatureBasePtr> lst; + FeatureBaseConstPtrList lst; + if (snapshots_const_.count(_cap)) + for (auto const& pair_trkid_ftr : snapshots_const_.at(_cap)) + lst.push_back(pair_trkid_ftr.second); + return lst; +} + +FeatureBasePtrList TrackMatrix::snapshotAsList(CaptureBasePtr _cap) +{ + FeatureBasePtrList lst; if (snapshots_.count(_cap)) for (auto const& pair_trkid_ftr : snapshots_.at(_cap)) lst.push_back(pair_trkid_ftr.second); return lst; } -TrackMatches TrackMatrix::matches(CaptureBasePtr _cap_1, CaptureBasePtr _cap_2) const +TrackMatchesConst TrackMatrix::matches(CaptureBaseConstPtr _cap_1, CaptureBaseConstPtr _cap_2) const +{ + TrackMatchesConst pairs; + + auto s_1 = snapshot(_cap_1); + auto s_2 = snapshot(_cap_2); + auto s_short = s_1; + auto s_long = s_2; + if (s_1.size() > s_2.size()) + { + s_long = s_1; + s_short = s_2; + } + + for (auto const & pair_trkid_ftr : s_short) + { + SizeStd trk_id = pair_trkid_ftr.first; + if (s_long.count(trk_id)) + pairs[trk_id] = pair<FeatureBaseConstPtr, FeatureBaseConstPtr>(s_1.at(trk_id), s_2.at(trk_id)); + } + + return pairs; +} + +TrackMatches TrackMatrix::matches(CaptureBasePtr _cap_1, CaptureBasePtr _cap_2) { TrackMatches pairs; - Snapshot s_1 = snapshot(_cap_1); - Snapshot s_2 = snapshot(_cap_2); - Snapshot s_short = s_1; - Snapshot s_long = s_2; + auto s_1 = snapshot(_cap_1); + auto s_2 = snapshot(_cap_2); + auto s_short = s_1; + auto s_long = s_2; if (s_1.size() > s_2.size()) { s_long = s_1; @@ -212,7 +304,7 @@ TrackMatches TrackMatrix::matches(CaptureBasePtr _cap_1, CaptureBasePtr _cap_2) return pairs; } -FeatureBasePtr TrackMatrix::feature(const SizeStd& _track_id, CaptureBasePtr _cap) const +FeatureBaseConstPtr TrackMatrix::feature(const SizeStd& _track_id, CaptureBaseConstPtr _cap) const { if (snapshot(_cap).count(_track_id)) return snapshot(_cap).at(_track_id); @@ -220,12 +312,44 @@ FeatureBasePtr TrackMatrix::feature(const SizeStd& _track_id, CaptureBasePtr _ca return nullptr; } -CaptureBasePtr TrackMatrix::firstCapture(const SizeStd& _track_id) const +FeatureBasePtr TrackMatrix::feature(const SizeStd& _track_id, CaptureBasePtr _cap) +{ + if (snapshot(_cap).count(_track_id)) + return snapshot(_cap).at(_track_id); + else + return nullptr; +} + +CaptureBaseConstPtr TrackMatrix::firstCapture(const SizeStd& _track_id) const +{ + return firstFeature(_track_id)->getCapture(); +} + +CaptureBasePtr TrackMatrix::firstCapture(const SizeStd& _track_id) { return firstFeature(_track_id)->getCapture(); } -Track TrackMatrix::trackAtKeyframes(size_t _track_id) const +TrackConst TrackMatrix::trackAtKeyframes(size_t _track_id) const +{ + // We assemble a track_kf on the fly by checking each capture's frame. + if (tracks_.count(_track_id)) + { + TrackConst track_kf; + for (auto& pair_ts_ftr : tracks_.at(_track_id)) + { + auto& ts = pair_ts_ftr.first; + auto& ftr = pair_ts_ftr.second; + if (ftr && ftr->getCapture() && ftr->getCapture()->getFrame() && ftr->getCapture()->getFrame()->getProblem()) + track_kf[ts] = ftr; + } + return track_kf; + } + else + return TrackConst(); +} + +Track TrackMatrix::trackAtKeyframes(size_t _track_id) { // We assemble a track_kf on the fly by checking each capture's frame. if (tracks_.count(_track_id))