Skip to content
Snippets Groups Projects
Commit 8434102c authored by Mederic Fourmy's avatar Mederic Fourmy
Browse files

Merge branch 'devel' into 451-refactoring-wolf-installation-system

parents 8a386df3 dd1674a9
No related branches found
No related tags found
2 merge requests!451After cmake and const refactor,!445Resolve "Refactoring WOLF installation system"
Pipeline #15084 failed
--- ---
Language: Cpp Language: Cpp
BasedOnStyle: Google BasedOnStyle: Google
AccessModifierOffset: 0 IndentAccessModifiers: false
AccessModifierOffset: -2
AlignAfterOpenBracket: Align AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: true AlignConsecutiveAssignments: true
AlignConsecutiveDeclarations: true AlignConsecutiveDeclarations: true
...@@ -11,7 +12,7 @@ AlignTrailingComments: true ...@@ -11,7 +12,7 @@ AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: false AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: false AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: true AllowShortIfStatementsOnASingleLine: true
AllowShortLoopsOnASingleLine: true AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterDefinitionReturnType: None
...@@ -20,24 +21,24 @@ AlwaysBreakBeforeMultilineStrings: true ...@@ -20,24 +21,24 @@ AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: true AlwaysBreakTemplateDeclarations: true
BinPackArguments: true BinPackArguments: true
BinPackParameters: false BinPackParameters: false
BreakBeforeBraces: Custom
BraceWrapping: BraceWrapping:
AfterClass: false AfterClass: true
AfterControlStatement: false AfterControlStatement: Always
AfterEnum: false AfterEnum: true
AfterFunction: false AfterFunction: true
AfterNamespace: false AfterNamespace: true
AfterObjCDeclaration: false AfterObjCDeclaration: true
AfterStruct: false AfterStruct: true
AfterUnion: false AfterUnion: true
AfterExternBlock: false AfterExternBlock: false
BeforeCatch: false BeforeCatch: true
BeforeElse: false BeforeElse: true
IndentBraces: false IndentBraces: false
SplitEmptyFunction: true SplitEmptyFunction: true
SplitEmptyRecord: true SplitEmptyRecord: true
SplitEmptyNamespace: true SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None BreakBeforeBinaryOperators: None
BreakBeforeBraces: Linux
BreakBeforeInheritanceComma: false BreakBeforeInheritanceComma: false
BreakBeforeTernaryOperators: true BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false BreakConstructorInitializersBeforeComma: false
...@@ -45,7 +46,8 @@ BreakConstructorInitializers: BeforeColon ...@@ -45,7 +46,8 @@ BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true BreakStringLiterals: true
ColumnLimit: 119 ColumnLimit: 119
CommentPragmas: "^ IWYU pragma:" # CommentPragmas: "^ IWYU pragma: ^\\.+"
CommentPragmas: '^\\.+'
CompactNamespaces: false CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4 ConstructorInitializerIndentWidth: 4
...@@ -60,17 +62,17 @@ ForEachMacros: ...@@ -60,17 +62,17 @@ ForEachMacros:
- Q_FOREACH - Q_FOREACH
- BOOST_FOREACH - BOOST_FOREACH
IncludeBlocks: Preserve IncludeBlocks: Preserve
IncludeCategories: # IncludeCategories:
- Regex: '^<pinocchio/fwd\.hpp>' # - Regex: '^<pinocchio/fwd\.hpp>'
Priority: 1 # Priority: 1
- Regex: '^<ext/.*\.h>' # - Regex: '^<ext/.*\.h>'
Priority: 3 # Priority: 3
- Regex: '^<.*\.h>' # - Regex: '^<.*\.h>'
Priority: 2 # Priority: 2
- Regex: "^<.*" # - Regex: "^<.*"
Priority: 3 # Priority: 3
- Regex: ".*" # - Regex: ".*"
Priority: 4 # Priority: 4
IncludeIsMainRegex: "([-_](test|unittest))?$" IncludeIsMainRegex: "([-_](test|unittest))?$"
IndentCaseLabels: true IndentCaseLabels: true
IndentPPDirectives: None IndentPPDirectives: None
......
...@@ -45,8 +45,8 @@ using std::list; ...@@ -45,8 +45,8 @@ using std::list;
using std::pair; using std::pair;
using std::shared_ptr; using std::shared_ptr;
typedef map<TimeStamp, FeatureBasePtr> Track; typedef map<TimeStamp, FeatureBasePtr> Track;
typedef map<TimeStamp, FeatureBaseConstPtr> TrackConst; typedef map<TimeStamp, FeatureBaseConstPtr> TrackConst;
typedef map<SizeStd, FeatureBasePtr > Snapshot; typedef map<SizeStd, FeatureBasePtr > Snapshot;
typedef map<SizeStd, FeatureBaseConstPtr > SnapshotConst; typedef map<SizeStd, FeatureBaseConstPtr > SnapshotConst;
typedef map<SizeStd, pair<FeatureBasePtr, FeatureBasePtr> > TrackMatches; // matched feature pairs indexed by track_id typedef map<SizeStd, pair<FeatureBasePtr, FeatureBasePtr> > TrackMatches; // matched feature pairs indexed by track_id
...@@ -102,41 +102,40 @@ class TrackMatrix ...@@ -102,41 +102,40 @@ class TrackMatrix
TrackMatrix(); TrackMatrix();
virtual ~TrackMatrix(); virtual ~TrackMatrix();
void newTrack (FeatureBasePtr _ftr); void newTrack (FeatureBasePtr _ftr);
void add (const SizeStd& _track_id, const FeatureBasePtr& _ftr); void add (const SizeStd& _track_id, const FeatureBasePtr& _ftr);
void add (const FeatureBasePtr& _ftr_existing, const FeatureBasePtr& _ftr_new); void add (const FeatureBasePtr& _ftr_existing, const FeatureBasePtr& _ftr_new);
void remove (FeatureBasePtr _ftr); void remove (FeatureBasePtr _ftr);
void remove (const SizeStd& _track_id); void remove (const SizeStd& _track_id);
void remove (CaptureBasePtr _cap); void remove (CaptureBasePtr _cap);
SizeStd numTracks () const;
SizeStd trackSize (const SizeStd& _track_id) const; SizeStd numTracks () const;
TrackConst track (const SizeStd& _track_id) const; SizeStd trackSize (const SizeStd& _track_id) const;
Track track (const SizeStd& _track_id); TrackConst track (const SizeStd& _track_id) const;
SnapshotConst snapshot (CaptureBaseConstPtr _capture) const; Track track (const SizeStd& _track_id);
Snapshot snapshot (CaptureBasePtr _capture); SnapshotConst snapshot (CaptureBaseConstPtr _capture) const;
Snapshot snapshot (CaptureBasePtr _capture);
vector<FeatureBaseConstPtr> trackAsVector(const SizeStd& _track_id) const; vector<FeatureBaseConstPtr> trackAsVector(const SizeStd& _track_id) const;
vector<FeatureBasePtr> trackAsVector(const SizeStd& _track_id); vector<FeatureBasePtr> trackAsVector(const SizeStd& _track_id);
FeatureBaseConstPtrList snapshotAsList(CaptureBaseConstPtr _cap) const; FeatureBaseConstPtrList snapshotAsList(CaptureBaseConstPtr _cap) const;
FeatureBasePtrList snapshotAsList(CaptureBasePtr _cap); FeatureBasePtrList snapshotAsList(CaptureBasePtr _cap);
TrackMatchesConst matches (CaptureBaseConstPtr _cap_1, CaptureBaseConstPtr _cap_2) const; TrackMatchesConst matches (CaptureBaseConstPtr _cap_1, CaptureBaseConstPtr _cap_2) const;
TrackMatches matches (CaptureBasePtr _cap_1, CaptureBasePtr _cap_2); TrackMatches matches (CaptureBasePtr _cap_1, CaptureBasePtr _cap_2);
FeatureBaseConstPtr firstFeature(const SizeStd& _track_id) const;
FeatureBasePtr firstFeature(const SizeStd& _track_id); FeatureBaseConstPtr firstFeature(const SizeStd& _track_id) const;
FeatureBaseConstPtr lastFeature (const SizeStd& _track_id) const; FeatureBasePtr firstFeature(const SizeStd& _track_id);
FeatureBasePtr lastFeature (const SizeStd& _track_id); FeatureBaseConstPtr lastFeature (const SizeStd& _track_id) const;
FeatureBaseConstPtr feature (const SizeStd& _track_id, CaptureBaseConstPtr _cap) const; FeatureBasePtr lastFeature (const SizeStd& _track_id);
FeatureBasePtr feature (const SizeStd& _track_id, CaptureBasePtr _cap); FeatureBaseConstPtr feature (const SizeStd& _track_id, CaptureBaseConstPtr _cap) const;
CaptureBaseConstPtr firstCapture(const SizeStd& _track_id) const; FeatureBasePtr feature (const SizeStd& _track_id, CaptureBasePtr _cap);
CaptureBasePtr firstCapture(const SizeStd& _track_id); CaptureBaseConstPtr firstCapture(const SizeStd& _track_id) const;
CaptureBasePtr firstCapture(const SizeStd& _track_id);
list<SizeStd> trackIds() const;
list<SizeStd> trackIds(CaptureBaseConstPtr _capture = nullptr) const;
// tracks across captures that belong to keyframe // tracks across captures that belong to keyframe
TrackConst trackAtKeyframes(const SizeStd& _track_id) const; TrackConst trackAtKeyframes(const SizeStd& _track_id) const;
Track trackAtKeyframes(const SizeStd& _track_id); Track trackAtKeyframes(const SizeStd& _track_id);
const map<SizeStd, Track>& getTracks() {return tracks_;}
const map<CaptureBasePtr, Snapshot >& getSnapshots() {return snapshots_;}
private: private:
......
...@@ -112,15 +112,15 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr) ...@@ -112,15 +112,15 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
incoming_ptr_->link(keyframe); incoming_ptr_->link(keyframe);
// Process info // Process info
// TrackerFeature: We only process new features in Last, here last = nullptr, so we do not have anything to do.
// TrackerLandmark: If we have been given a map, all landmarks in the map are known. Process them.
processKnown(); processKnown();
// We only process new features in Last, here last = nullptr, so we do not have anything to do.
// Issue KF callback with new KF // Issue KF callback with new KF
getProblem()->keyFrameCallback(keyframe, shared_from_this()); getProblem()->keyFrameCallback(keyframe, shared_from_this());
resetDerived();
// Update pointers // Update pointers
resetDerived();
origin_ptr_ = incoming_ptr_; origin_ptr_ = incoming_ptr_;
last_ptr_ = incoming_ptr_; last_ptr_ = incoming_ptr_;
incoming_ptr_ = nullptr; incoming_ptr_ = nullptr;
...@@ -130,9 +130,17 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr) ...@@ -130,9 +130,17 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
case SECOND_TIME_WITH_KEYFRAME : case SECOND_TIME_WITH_KEYFRAME :
{ {
// No-break case only for debug. Next case will be executed too. // No-break case only for debug. Next case will be executed too.
FrameBasePtr keyframe_from_callback = buffer_frame_.select( incoming_ptr_->getTimeStamp(), FrameBasePtr keyframe_from_callback = buffer_frame_.select( last_ptr_->getTimeStamp(),
params_tracker_->time_tolerance); params_tracker_->time_tolerance);
// This received KF is discarded since it is most likely the same KF we createed in FIRST_TIME, ...
// ... only that in FIRST_TIME we checked for incominig, and now we checked for last.
// Such KF however should have been removed from the buffer of keyframes with the call to buffer_frame_.removeUpTo()
// The debug line is here to check if this is really the same KF
// or it is rather a new KF created by some other processor,
// which happens to be within tolerance of timestamps.
// In this case we discard it anyway because we already have a KF in last
// and we can't link a capture to two KFs.
WOLF_DEBUG( "PT ", getName(), " SECOND_TIME_WITH_KEYFRAME: KF" , keyframe_from_callback->id() , " callback unpacked with ts= " , keyframe_from_callback->getTimeStamp() ); WOLF_DEBUG( "PT ", getName(), " SECOND_TIME_WITH_KEYFRAME: KF" , keyframe_from_callback->id() , " callback unpacked with ts= " , keyframe_from_callback->getTimeStamp() );
} }
// Fall through // Fall through
...@@ -140,14 +148,16 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr) ...@@ -140,14 +148,16 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
{ {
WOLF_DEBUG( "PT ", getName(), " SECOND_TIME_WITHOUT_KEYFRAME" ); WOLF_DEBUG( "PT ", getName(), " SECOND_TIME_WITHOUT_KEYFRAME" );
// Make a NON KEY Frame to hold incoming capture
FrameBasePtr keyframe = std::make_shared<FrameBase>(incoming_ptr_->getTimeStamp(), FrameBasePtr keyframe = std::make_shared<FrameBase>(incoming_ptr_->getTimeStamp(),
getProblem()->getFrameStructure(), getProblem()->getFrameStructure(),
getProblem()->getState()); getProblem()->getState());
incoming_ptr_->link(keyframe); incoming_ptr_->link(keyframe);
// We have a last_ Capture with no features, so we do not process known features, and we do not vote for KF.
// Process info // Process info
// TrackerLandmark: If we have been given a map, all landmarks in the map are known. Process them.
processKnown(); processKnown();
// Both Trackers: We have a last_ Capture with not enough features, so populate it.
processNew(params_tracker_->max_new_features); processNew(params_tracker_->max_new_features);
// Establish factors // Establish factors
...@@ -177,13 +187,13 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr) ...@@ -177,13 +187,13 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
last_ptr_->move(keyframe_from_callback); last_ptr_->move(keyframe_from_callback);
last_old_frame->remove(); last_old_frame->remove();
// Create new frame for incoming // Create new NON KEY frame for incoming
FrameBasePtr frame = std::make_shared<FrameBase>(incoming_ptr_->getTimeStamp(), FrameBasePtr frame = std::make_shared<FrameBase>(incoming_ptr_->getTimeStamp(),
getProblem()->getFrameStructure(), getProblem()->getFrameStructure(),
getProblem()->getState()); getProblem()->getState());
incoming_ptr_->link(frame); incoming_ptr_->link(frame);
// Detect new Features, initialize Landmarks, create Factors, ... // Detect new Features, initialize Landmarks, ...
processNew(params_tracker_->max_new_features); processNew(params_tracker_->max_new_features);
// Establish factors // Establish factors
...@@ -209,8 +219,6 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr) ...@@ -209,8 +219,6 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
// process // process
processNew(params_tracker_->max_new_features); processNew(params_tracker_->max_new_features);
//TODO abort KF if known_features_last_.size() < params_tracker_->min_features_for_keyframe
// We create a KF // We create a KF
// set KF on last // set KF on last
last_ptr_->getFrame()->setState(getProblem()->getState(last_ptr_->getTimeStamp())); last_ptr_->getFrame()->setState(getProblem()->getState(last_ptr_->getTimeStamp()));
...@@ -222,14 +230,15 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr) ...@@ -222,14 +230,15 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
// Call the new keyframe callback in order to let the other processors to establish their factors // Call the new keyframe callback in order to let the other processors to establish their factors
getProblem()->keyFrameCallback(last_ptr_->getFrame(), shared_from_this()); getProblem()->keyFrameCallback(last_ptr_->getFrame(), shared_from_this());
// Update pointers
resetDerived();
// make F; append incoming to new F // make NON KEY frame; append incoming to new frame
FrameBasePtr frame = std::make_shared<FrameBase>(incoming_ptr_->getTimeStamp(), FrameBasePtr frame = std::make_shared<FrameBase>(incoming_ptr_->getTimeStamp(),
getProblem()->getFrameStructure(), getProblem()->getFrameStructure(),
getProblem()->getState(incoming_ptr_->getTimeStamp())); getProblem()->getState(incoming_ptr_->getTimeStamp()));
incoming_ptr_ ->link(frame); incoming_ptr_ ->link(frame);
// Update pointers
resetDerived();
origin_ptr_ = last_ptr_; origin_ptr_ = last_ptr_;
last_ptr_ = incoming_ptr_; last_ptr_ = incoming_ptr_;
last_frame_ptr_ = frame; last_frame_ptr_ = frame;
...@@ -243,7 +252,7 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr) ...@@ -243,7 +252,7 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
// Advance this // Advance this
advanceDerived(); advanceDerived();
// Replace last frame for a new one in incoming // Replace last frame for a new NON KEY frame in incoming
FrameBasePtr frame = std::make_shared<FrameBase>(incoming_ptr_->getTimeStamp(), FrameBasePtr frame = std::make_shared<FrameBase>(incoming_ptr_->getTimeStamp(),
getProblem()->getFrameStructure(), getProblem()->getFrameStructure(),
getProblem()->getState(incoming_ptr_->getTimeStamp())); getProblem()->getState(incoming_ptr_->getTimeStamp()));
...@@ -278,7 +287,7 @@ void ProcessorTracker::computeProcessingStep() ...@@ -278,7 +287,7 @@ void ProcessorTracker::computeProcessingStep()
// Then combine with the existence (or not) of a keyframe callback pack // Then combine with the existence (or not) of a keyframe callback pack
switch (step) switch (step)
{ {
case FIRST_TIME : case FIRST_TIME : // We check for KF in incoming
if (buffer_frame_.select(incoming_ptr_->getTimeStamp(), params_tracker_->time_tolerance)) if (buffer_frame_.select(incoming_ptr_->getTimeStamp(), params_tracker_->time_tolerance))
processing_step_ = FIRST_TIME_WITH_KEYFRAME; processing_step_ = FIRST_TIME_WITH_KEYFRAME;
...@@ -286,7 +295,7 @@ void ProcessorTracker::computeProcessingStep() ...@@ -286,7 +295,7 @@ void ProcessorTracker::computeProcessingStep()
processing_step_ = FIRST_TIME_WITHOUT_KEYFRAME; processing_step_ = FIRST_TIME_WITHOUT_KEYFRAME;
break; break;
case SECOND_TIME : case SECOND_TIME : // We check for KF in last
if (buffer_frame_.select(last_ptr_->getTimeStamp(), params_tracker_->time_tolerance)) if (buffer_frame_.select(last_ptr_->getTimeStamp(), params_tracker_->time_tolerance))
processing_step_ = SECOND_TIME_WITH_KEYFRAME; processing_step_ = SECOND_TIME_WITH_KEYFRAME;
...@@ -294,7 +303,7 @@ void ProcessorTracker::computeProcessingStep() ...@@ -294,7 +303,7 @@ void ProcessorTracker::computeProcessingStep()
processing_step_ = SECOND_TIME_WITHOUT_KEYFRAME; processing_step_ = SECOND_TIME_WITHOUT_KEYFRAME;
break; break;
case RUNNING : case RUNNING : // We check for KF in last
default : default :
if (buffer_frame_.select(last_ptr_->getTimeStamp(), params_tracker_->time_tolerance)) if (buffer_frame_.select(last_ptr_->getTimeStamp(), params_tracker_->time_tolerance))
......
...@@ -369,12 +369,26 @@ Track TrackMatrix::trackAtKeyframes(const SizeStd& _track_id) ...@@ -369,12 +369,26 @@ Track TrackMatrix::trackAtKeyframes(const SizeStd& _track_id)
return Track(); return Track();
} }
list<SizeStd> TrackMatrix::trackIds() const list<SizeStd> TrackMatrix::trackIds(CaptureBaseConstPtr _capture) const
{ {
list<SizeStd> track_ids; list<SizeStd> track_ids;
for (auto track : tracks_)
if (not _capture)
for (auto track_pair : tracks_)
track_ids.push_back(track_pair.first);
else
{ {
track_ids.push_back(track.first); auto it = std::find_if(snapshots_.begin(),
snapshots_.end(),
[_capture](const std::pair<CaptureBasePtr, Snapshot>& pair)
{
return pair.first == _capture;
}
);
if (it != snapshots_.end())
for (auto track_pair : it->second)
track_ids.push_back(track_pair.first);
} }
return track_ids; return track_ids;
} }
......
...@@ -42,7 +42,7 @@ class TrackMatrixTest : public testing::Test ...@@ -42,7 +42,7 @@ class TrackMatrixTest : public testing::Test
FrameBasePtr F0, F1, F2, F3, F4; FrameBasePtr F0, F1, F2, F3, F4;
CaptureBasePtr C0, C1, C2, C3, C4; CaptureBasePtr C0, C1, C2, C3, C4;
FeatureBasePtr f0, f1, f2, f3, f4; FeatureBasePtr f0, f1, f2, f3, f4, f5;
ProblemPtr problem; ProblemPtr problem;
void SetUp() override void SetUp() override
...@@ -71,6 +71,7 @@ class TrackMatrixTest : public testing::Test ...@@ -71,6 +71,7 @@ class TrackMatrixTest : public testing::Test
f2 = FeatureBase::emplace<FeatureBase>(nullptr, "FeatureBase", m, m_cov); f2 = FeatureBase::emplace<FeatureBase>(nullptr, "FeatureBase", m, m_cov);
f3 = FeatureBase::emplace<FeatureBase>(nullptr, "FeatureBase", m, m_cov); f3 = FeatureBase::emplace<FeatureBase>(nullptr, "FeatureBase", m, m_cov);
f4 = FeatureBase::emplace<FeatureBase>(nullptr, "FeatureBase", m, m_cov); f4 = FeatureBase::emplace<FeatureBase>(nullptr, "FeatureBase", m, m_cov);
f5 = FeatureBase::emplace<FeatureBase>(nullptr, "FeatureBase", m, m_cov);
// F0 and F4 are keyframes // F0 and F4 are keyframes
F0->link(problem); F0->link(problem);
...@@ -507,6 +508,37 @@ TEST_F(TrackMatrixTest, trackAtKeyframes) ...@@ -507,6 +508,37 @@ TEST_F(TrackMatrixTest, trackAtKeyframes)
ASSERT_EQ(trk_kf_1.size(), 0); ASSERT_EQ(trk_kf_1.size(), 0);
} }
TEST_F(TrackMatrixTest, trackIds)
{
f0->link(C0);
f1->link(C1);
f2->link(C1);
f3->link(C1);
f4->link(C2);
f5->link(C2);
track_matrix.newTrack(f0);
track_matrix.add(f0->trackId(), f1);
track_matrix.newTrack(f2);
track_matrix.newTrack(f3);
track_matrix.add(f0->trackId(), f4);
track_matrix.add(f2->trackId(), f5);
/* KC0 C1 C2
*
* f0---f1---f4 trk 0
* | |
* f2---f5 trk 1
* |
* f3 trk 2
*/
ASSERT_EQ(track_matrix.trackIds().size(), 3);
ASSERT_EQ(track_matrix.trackIds(C0).size(), 1);
ASSERT_EQ(track_matrix.trackIds(C1).size(), 3);
ASSERT_EQ(track_matrix.trackIds(C2).size(), 2);
}
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