Skip to content
Snippets Groups Projects
Commit 4db0d6f8 authored by Joan Solà Ortega's avatar Joan Solà Ortega
Browse files

Merge branch 'redesign-track_kf' into 'devel'

Redesign track kf

See merge request !287
parents 3d7e32af 1b479aba
No related branches found
No related tags found
1 merge request!287Redesign track kf
Pipeline #3646 passed
...@@ -99,10 +99,10 @@ class TrackMatrix ...@@ -99,10 +99,10 @@ class TrackMatrix
CaptureBasePtr firstCapture(size_t _track_id); CaptureBasePtr firstCapture(size_t _track_id);
// tracks across captures that belong to keyframe // tracks across captures that belong to keyframe
SizeStd numKeyframeTracks(); // SizeStd numKeyframeTracks();
Track trackAtKeyframes(size_t _track_id); Track trackAtKeyframes(size_t _track_id);
bool markKeyframe(CaptureBasePtr _capture); // bool markKeyframe(CaptureBasePtr _capture);
bool unmarkKeyframe(CaptureBasePtr _capture); // bool unmarkKeyframe(CaptureBasePtr _capture);
private: private:
...@@ -111,8 +111,8 @@ class TrackMatrix ...@@ -111,8 +111,8 @@ class TrackMatrix
// Along track: maps of Feature pointers indexed by time stamp. // Along track: maps of Feature pointers indexed by time stamp.
// tracks across all Captures // tracks across all Captures
map<size_t, Track > tracks_; // map indexed by track_Id of ( maps indexed by TimeStamp of ( features ) ) map<size_t, Track > tracks_; // map indexed by track_Id of ( maps indexed by TimeStamp of ( features ) )
// tracks across captures that belong to keyframe // // 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 ) ) // 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. // 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<CaptureBasePtr, Snapshot > snapshots_; // map indexed by capture_ptr of ( maps indexed by track_Id of ( features ) )
......
...@@ -53,8 +53,6 @@ void TrackMatrix::add(size_t _track_id, CaptureBasePtr _cap, FeatureBasePtr _ftr ...@@ -53,8 +53,6 @@ void TrackMatrix::add(size_t _track_id, CaptureBasePtr _cap, FeatureBasePtr _ftr
_ftr->setCapture(_cap); _ftr->setCapture(_cap);
tracks_[_track_id].emplace(_cap->getTimeStamp(), _ftr); tracks_[_track_id].emplace(_cap->getTimeStamp(), _ftr);
snapshots_[_cap].emplace(_track_id, _ftr); // will create new snapshot if _cap_id is not present snapshots_[_cap].emplace(_track_id, _ftr); // will create new snapshot if _cap_id is not present
if (_cap->getFrame() && _cap->getFrame()->isKey())
tracks_kf_[_track_id].emplace(_cap->getTimeStamp(), _ftr);
} }
void TrackMatrix::remove(size_t _track_id) void TrackMatrix::remove(size_t _track_id)
...@@ -74,9 +72,6 @@ void TrackMatrix::remove(size_t _track_id) ...@@ -74,9 +72,6 @@ void TrackMatrix::remove(size_t _track_id)
// Remove track // Remove track
tracks_.erase(_track_id); tracks_.erase(_track_id);
} }
if (tracks_kf_.count(_track_id))
// Remove track
tracks_kf_.erase(_track_id);
} }
void TrackMatrix::remove(CaptureBasePtr _cap) void TrackMatrix::remove(CaptureBasePtr _cap)
...@@ -91,12 +86,6 @@ void TrackMatrix::remove(CaptureBasePtr _cap) ...@@ -91,12 +86,6 @@ void TrackMatrix::remove(CaptureBasePtr _cap)
tracks_.at(trk_id).erase(ts); tracks_.at(trk_id).erase(ts);
if (tracks_.at(trk_id).empty()) if (tracks_.at(trk_id).empty())
tracks_.erase(trk_id); tracks_.erase(trk_id);
if (_cap->getFrame() && _cap->getFrame()->isKey())
{
tracks_kf_.at(trk_id).erase(ts);
if (tracks_kf_.at(trk_id).empty())
tracks_kf_.erase(trk_id);
}
} }
// remove snapshot // remove snapshot
...@@ -115,13 +104,6 @@ void TrackMatrix::remove(FeatureBasePtr _ftr) ...@@ -115,13 +104,6 @@ void TrackMatrix::remove(FeatureBasePtr _ftr)
if (tracks_.at(_ftr->trackId()).empty()) if (tracks_.at(_ftr->trackId()).empty())
tracks_.erase(_ftr->trackId()); tracks_.erase(_ftr->trackId());
if (cap->getFrame() && cap->getFrame()->isKey())
{
tracks_kf_ .at(_ftr->trackId()).erase(cap->getTimeStamp());
if (tracks_kf_.at(_ftr->trackId()).empty())
tracks_kf_.erase(_ftr->trackId());
}
snapshots_.at(cap) .erase(_ftr->trackId()); snapshots_.at(cap) .erase(_ftr->trackId());
if (snapshots_.at(cap).empty()) if (snapshots_.at(cap).empty())
snapshots_.erase(cap); snapshots_.erase(cap);
...@@ -134,11 +116,6 @@ size_t TrackMatrix::numTracks() ...@@ -134,11 +116,6 @@ size_t TrackMatrix::numTracks()
return tracks_.size(); return tracks_.size();
} }
size_t TrackMatrix::numKeyframeTracks()
{
return tracks_kf_.size();
}
size_t TrackMatrix::trackSize(size_t _track_id) size_t TrackMatrix::trackSize(size_t _track_id)
{ {
return track(_track_id).size(); return track(_track_id).size();
...@@ -220,48 +197,21 @@ CaptureBasePtr TrackMatrix::firstCapture(size_t _track_id) ...@@ -220,48 +197,21 @@ CaptureBasePtr TrackMatrix::firstCapture(size_t _track_id)
Track TrackMatrix::trackAtKeyframes(size_t _track_id) Track TrackMatrix::trackAtKeyframes(size_t _track_id)
{ {
if (tracks_kf_.count(_track_id) > 0) // We assemble a track_kf on the fly by checking each capture's frame.
return tracks_kf_.at(_track_id); if (tracks_.count(_track_id))
else
return Track();
}
bool TrackMatrix::markKeyframe(CaptureBasePtr _capture)
{
if (_capture->getFrame() && _capture->getFrame()->isKey())
{
auto snap = snapshot(_capture);
if (snap.empty())
return false;
for (auto pair_trkid_ftr : snap)
{
auto track_id = pair_trkid_ftr.first;
auto ftr = pair_trkid_ftr.second;
auto ts = _capture->getFrame()->getTimeStamp();
tracks_kf_[track_id][ts] = ftr;
}
return true;
}
return false;
}
bool TrackMatrix::unmarkKeyframe(CaptureBasePtr _capture)
{
bool removed = false;
auto ts = _capture->getTimeStamp();
for (auto pair_id_trk : tracks_kf_)
{ {
if (pair_id_trk.second.erase(ts)) Track track_kf;
for (auto& pair_ts_ftr : tracks_.at(_track_id))
{ {
if (pair_id_trk.second.empty()) auto& ts = pair_ts_ftr.first;
tracks_kf_.erase(pair_id_trk.first); auto& ftr = pair_ts_ftr.second;
removed = true; if (ftr && ftr->getCapture() && ftr->getCapture()->getFrame() && ftr->getCapture()->getFrame()->isKey())
track_kf[ts] = ftr;
} }
return track_kf;
} }
return removed; else
return Track();
} }
} }
...@@ -60,26 +60,21 @@ TEST_F(TrackMatrixTest, newTrack) ...@@ -60,26 +60,21 @@ TEST_F(TrackMatrixTest, newTrack)
{ {
track_matrix.newTrack(C0, f0); track_matrix.newTrack(C0, f0);
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 1); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 1);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 1);
track_matrix.newTrack(C0, f1); track_matrix.newTrack(C0, f1);
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 2); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 2);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 2);
track_matrix.newTrack(C1, f2); track_matrix.newTrack(C1, f2);
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 3); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 3);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 2);
track_matrix.newTrack(C1, f3); track_matrix.newTrack(C1, f3);
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 4); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 4);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 2);
} }
TEST_F(TrackMatrixTest, add) TEST_F(TrackMatrixTest, add)
{ {
track_matrix.newTrack(C0, f0); track_matrix.newTrack(C0, f0);
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 1); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 1);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 1);
track_matrix.add(f0->trackId(), C1, f1); track_matrix.add(f0->trackId(), C1, f1);
/* KC0 C1 C2 snapshots /* KC0 C1 C2 snapshots
...@@ -89,7 +84,6 @@ TEST_F(TrackMatrixTest, add) ...@@ -89,7 +84,6 @@ TEST_F(TrackMatrixTest, add)
ASSERT_EQ(track_matrix.trackSize(f1->trackId()), (unsigned int) 2); ASSERT_EQ(track_matrix.trackSize(f1->trackId()), (unsigned int) 2);
ASSERT_EQ(f1->trackId(), f0->trackId()); ASSERT_EQ(f1->trackId(), f0->trackId());
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 1); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 1);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 1);
track_matrix.add(f0->trackId(), C2, f2); track_matrix.add(f0->trackId(), C2, f2);
/* KC0 C1 C2 snapshots /* KC0 C1 C2 snapshots
...@@ -99,7 +93,6 @@ TEST_F(TrackMatrixTest, add) ...@@ -99,7 +93,6 @@ TEST_F(TrackMatrixTest, add)
ASSERT_EQ(track_matrix.trackSize(f2->trackId()), (unsigned int) 3); ASSERT_EQ(track_matrix.trackSize(f2->trackId()), (unsigned int) 3);
ASSERT_EQ(f2->trackId(), f0->trackId()); ASSERT_EQ(f2->trackId(), f0->trackId());
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 1); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 1);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 1);
track_matrix.add(f0->trackId(), C2, f2); track_matrix.add(f0->trackId(), C2, f2);
/* KC0 C1 C2 snapshots /* KC0 C1 C2 snapshots
...@@ -111,7 +104,6 @@ TEST_F(TrackMatrixTest, add) ...@@ -111,7 +104,6 @@ TEST_F(TrackMatrixTest, add)
ASSERT_EQ(track_matrix.trackSize(f3->trackId()), (unsigned int) 1); ASSERT_EQ(track_matrix.trackSize(f3->trackId()), (unsigned int) 1);
ASSERT_NE(f3->trackId(), f0->trackId()); ASSERT_NE(f3->trackId(), f0->trackId());
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 2); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 2);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 1);
} }
TEST_F(TrackMatrixTest, numTracks) TEST_F(TrackMatrixTest, numTracks)
...@@ -182,7 +174,6 @@ TEST_F(TrackMatrixTest, remove_ftr) ...@@ -182,7 +174,6 @@ TEST_F(TrackMatrixTest, remove_ftr)
*/ */
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 2); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 2);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 2);
track_matrix.remove(f0); track_matrix.remove(f0);
/* C0 C1 C2 snapshots /* C0 C1 C2 snapshots
...@@ -198,7 +189,6 @@ TEST_F(TrackMatrixTest, remove_ftr) ...@@ -198,7 +189,6 @@ TEST_F(TrackMatrixTest, remove_ftr)
ASSERT_EQ(track_matrix.snapshot(C0).at(f2->trackId()), f2); ASSERT_EQ(track_matrix.snapshot(C0).at(f2->trackId()), f2);
ASSERT_EQ(track_matrix.snapshot(C1).size(), (unsigned int) 1); ASSERT_EQ(track_matrix.snapshot(C1).size(), (unsigned int) 1);
ASSERT_EQ(track_matrix.snapshot(C1).at(f0->trackId()), f1); ASSERT_EQ(track_matrix.snapshot(C1).at(f0->trackId()), f1);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 1);
track_matrix.remove(f1); track_matrix.remove(f1);
/* C0 C1 C2 snapshots /* C0 C1 C2 snapshots
...@@ -207,14 +197,12 @@ TEST_F(TrackMatrixTest, remove_ftr) ...@@ -207,14 +197,12 @@ TEST_F(TrackMatrixTest, remove_ftr)
*/ */
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 1); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 1);
ASSERT_EQ(track_matrix.firstFeature(f2->trackId()), f2); ASSERT_EQ(track_matrix.firstFeature(f2->trackId()), f2);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 1);
track_matrix.remove(f2); track_matrix.remove(f2);
/* C0 C1 C2 snapshots /* C0 C1 C2 snapshots
* *
*/ */
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 0); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 0);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 0);
} }
TEST_F(TrackMatrixTest, remove_trk) TEST_F(TrackMatrixTest, remove_trk)
...@@ -231,16 +219,13 @@ TEST_F(TrackMatrixTest, remove_trk) ...@@ -231,16 +219,13 @@ TEST_F(TrackMatrixTest, remove_trk)
*/ */
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 2); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 2);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 2);
track_matrix.remove(f0->trackId()); track_matrix.remove(f0->trackId());
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 1); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 1);
ASSERT_EQ(track_matrix.firstFeature(f2->trackId()), f2); ASSERT_EQ(track_matrix.firstFeature(f2->trackId()), f2);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 1);
track_matrix.remove(f2->trackId()); track_matrix.remove(f2->trackId());
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 0); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 0);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 0);
} }
TEST_F(TrackMatrixTest, remove_snapshot) TEST_F(TrackMatrixTest, remove_snapshot)
...@@ -257,7 +242,6 @@ TEST_F(TrackMatrixTest, remove_snapshot) ...@@ -257,7 +242,6 @@ TEST_F(TrackMatrixTest, remove_snapshot)
*/ */
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 2); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 2);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 2);
track_matrix.remove(C0); track_matrix.remove(C0);
/* C1 C2 snapshots /* C1 C2 snapshots
...@@ -266,11 +250,9 @@ TEST_F(TrackMatrixTest, remove_snapshot) ...@@ -266,11 +250,9 @@ TEST_F(TrackMatrixTest, remove_snapshot)
*/ */
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 1); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 1);
ASSERT_EQ(track_matrix.firstFeature(f1->trackId()), f1); ASSERT_EQ(track_matrix.firstFeature(f1->trackId()), f1);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 0);
track_matrix.remove(C1); track_matrix.remove(C1);
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 0); ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 0);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 0);
} }
TEST_F(TrackMatrixTest, track) TEST_F(TrackMatrixTest, track)
...@@ -403,71 +385,13 @@ TEST_F(TrackMatrixTest, trackAtKeyframes) ...@@ -403,71 +385,13 @@ TEST_F(TrackMatrixTest, trackAtKeyframes)
wolf::Track trk_kf_0 = track_matrix.trackAtKeyframes(f0->trackId()); wolf::Track trk_kf_0 = track_matrix.trackAtKeyframes(f0->trackId());
ASSERT_EQ(trk_kf_0.size(), 2); ASSERT_EQ(trk_kf_0.size(), 2);
ASSERT_EQ(trk_kf_0[0.0], f0);
ASSERT_EQ(trk_kf_0[4.0], f4);
wolf::Track trk_kf_1 = track_matrix.trackAtKeyframes(f3->trackId()); wolf::Track trk_kf_1 = track_matrix.trackAtKeyframes(f3->trackId());
ASSERT_EQ(trk_kf_1.size(), 0); ASSERT_EQ(trk_kf_1.size(), 0);
} }
TEST_F(TrackMatrixTest, markKeyframe)
{
track_matrix.newTrack(C0, f0);
track_matrix.add(f0->trackId(), C1, f1);
track_matrix.add(f0->trackId(), C2, f2);
track_matrix.add(1, C1, f3);
/* KC0 C1 C2 C3 snapshots
*
* f0---f1---f2 trk 0
* |
* f3 trk 1
*/
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 2);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 1);
C1->getFrame()->setKey();
track_matrix.markKeyframe(C1);
/* KC0 KC1 C2 C3 snapshots
*
* f0---f1---f2 trk 0
* |
* f3 trk 1
*/
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 2);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 2);
}
TEST_F(TrackMatrixTest, unmarkKeyframe)
{
track_matrix.newTrack(C0, f0);
track_matrix.add(f0->trackId(), C1, f1);
track_matrix.add(f0->trackId(), C2, f2);
track_matrix.add(1, C1, f3);
/* KC0 C1 C2 C3 snapshots
*
* f0---f1---f2 trk 0
* |
* f3 trk 1
*/
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 2);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 1);
F0->setNonEstimated();
track_matrix.unmarkKeyframe(C0);
/* C0 C1 C2 C3 snapshots
*
* f0---f1---f2 trk 0
* |
* f3 trk 1
*/
ASSERT_EQ(track_matrix.numTracks(), (unsigned int) 2);
ASSERT_EQ(track_matrix.numKeyframeTracks(), (unsigned int) 0);
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment