adding track serialization and testable trait

release/4.3a0
Ayush Baid 2021-01-02 17:28:22 +05:30
parent b5db391e77
commit df4419b609
2 changed files with 64 additions and 9 deletions

View File

@ -29,8 +29,9 @@
#include <gtsam/nonlinear/NonlinearFactorGraph.h> #include <gtsam/nonlinear/NonlinearFactorGraph.h>
#include <gtsam/nonlinear/Values.h> #include <gtsam/nonlinear/Values.h>
#include <gtsam/linear/NoiseModel.h> #include <gtsam/linear/NoiseModel.h>
#include <gtsam/base/types.h>
#include <gtsam/base/Testable.h> #include <gtsam/base/Testable.h>
#include <gtsam/base/types.h>
#include <boost/serialization/vector.hpp> #include <boost/serialization/vector.hpp>
#include <boost/smart_ptr/shared_ptr.hpp> #include <boost/smart_ptr/shared_ptr.hpp>
@ -224,7 +225,7 @@ struct SfmTrack {
float r, g, b; ///< RGB color of the 3D point float r, g, b; ///< RGB color of the 3D point
std::vector<SfmMeasurement> measurements; ///< The 2D image projections (id,(u,v)) std::vector<SfmMeasurement> measurements; ///< The 2D image projections (id,(u,v))
std::vector<SiftIndex> siftIndices; std::vector<SiftIndex> siftIndices;
/// Total number of measurements in this track /// Total number of measurements in this track
size_t number_measurements() const { size_t number_measurements() const {
return measurements.size(); return measurements.size();
@ -245,7 +246,7 @@ struct SfmTrack {
void add_measurement(size_t idx, const gtsam::Point2& m) { void add_measurement(size_t idx, const gtsam::Point2& m) {
measurements.emplace_back(idx, m); measurements.emplace_back(idx, m);
} }
template<class ARCHIVE> template<class ARCHIVE>
void serialize(ARCHIVE & ar, const unsigned int /*version*/) { void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
ar & p; ar & p;
@ -258,14 +259,47 @@ struct SfmTrack {
/// assert equality up to a tolerance /// assert equality up to a tolerance
bool equals(const SfmTrack &sfmTrack, double tol = 1e-9) const { bool equals(const SfmTrack &sfmTrack, double tol = 1e-9) const {
if(!p.isApprox(sfmTrack.p)){
return false;
}
// TODO: compare RGB values
// compare size of vectors
if(number_measurements() != sfmTrack.number_measurements() ||
siftIndices.size() != sfmTrack.siftIndices.size()){
return false;
}
// compare measurements (order sensitive)
for(size_t idx=0; idx<number_measurements(); idx++){
SfmMeasurement measurement = measurements[idx];
SfmMeasurement otherMeasurement = sfmTrack.measurements[idx];
if(measurement.first != otherMeasurement.first || !measurement.second.isApprox(otherMeasurement.second)){
return false;
}
}
return true; return true;
} }
/// print
void print(const std::string& s = "") const {
cout << "Track with " << measurements.size() << "measurements\n";
}
// inline bool SfmTrack::operator == (const SfmTrack& rhs) const{ // inline bool SfmTrack::operator == (const SfmTrack& rhs) const{
// return p==rhs.p; // return p==rhs.p;
// } // }
}; };
/* ************************************************************************* */
/// traits
template<>
struct traits<SfmTrack> : public Testable<SfmTrack> {
};
/// Define the structure for the camera poses /// Define the structure for the camera poses
typedef PinholeCamera<Cal3Bundler> SfmCamera; typedef PinholeCamera<Cal3Bundler> SfmCamera;
@ -321,15 +355,18 @@ class GTSAM_EXPORT SfmData {
} }
/// print /// print
void print(const std::string& s = "") const; void print(const std::string& s = "") const {
cout << "Number of cameras = " << number_cameras() << "\n";
cout << "Number of tracks = " << number_tracks() << "\n";
}
private: private:
/** Serialization function */ /** Serialization function */
friend class boost::serialization::access; friend class boost::serialization::access;
template<class Archive> template<class Archive>
void serialize(Archive & ar, const unsigned int /*version*/) { void serialize(Archive & ar, const unsigned int /*version*/) {
// ar & cameras; ar & cameras;
// ar & tracks; ar & tracks;
} }
// inline bool SfmData::operator == (const SfmData& rhs) const{ // inline bool SfmData::operator == (const SfmData& rhs) const{
@ -337,6 +374,12 @@ class GTSAM_EXPORT SfmData {
// } // }
}; };
/* ************************************************************************* */
/// traits
template<>
struct traits<SfmData> : public Testable<SfmData> {
};
/** /**
* @brief This function parses a bundler output file and stores the data into a * @brief This function parses a bundler output file and stores the data into a
* SfmData structure * SfmData structure

View File

@ -18,8 +18,6 @@
#include <gtsam/slam/dataset.h> #include <gtsam/slam/dataset.h>
#include <CppUnitLite/TestHarness.h>
#include <gtsam/base/serializationTestHelpers.h> #include <gtsam/base/serializationTestHelpers.h>
#include <CppUnitLite/TestHarness.h> #include <CppUnitLite/TestHarness.h>
@ -39,6 +37,20 @@ TEST(dataSet, sfmDataSerialization){
// EXPECT(equalsBinary(mydata)); // EXPECT(equalsBinary(mydata));
} }
/* ************************************************************************* */
TEST(dataSet, sfmTrackSerialization){
// Test the serialization of SfmData
const string filename = findExampleDataFile("dubrovnik-3-7-pre");
SfmData mydata;
CHECK(readBAL(filename, mydata));
SfmTrack track = mydata.track(0);
EXPECT(equalsObj(track));
// EXPECT(equalsXML(mydata));
// EXPECT(equalsBinary(mydata));
}
/* ************************************************************************* */ /* ************************************************************************* */
int main() { TestResult tr; return TestRegistry::runAllTests(tr); } int main() { TestResult tr; return TestRegistry::runAllTests(tr); }
/* ************************************************************************* */ /* ************************************************************************* */