diff options
author | cathook <b01902109@csie.ntu.edu.tw> | 2014-06-01 14:16:38 +0800 |
---|---|---|
committer | cathook <b01902109@csie.ntu.edu.tw> | 2014-06-01 14:16:38 +0800 |
commit | c60dba253906a30d3042f1dc4e9b7fe38f053fbe (patch) | |
tree | 57018f05908f0edef30cba255d46688ebfd5cd85 /meowpp.test/src/autostitch_RansacCheck.cpp | |
parent | 8bc9f2e8496c0c021b80eb0fb21e828f5900f08d (diff) | |
download | meow-c60dba253906a30d3042f1dc4e9b7fe38f053fbe.tar meow-c60dba253906a30d3042f1dc4e9b7fe38f053fbe.tar.gz meow-c60dba253906a30d3042f1dc4e9b7fe38f053fbe.tar.bz2 meow-c60dba253906a30d3042f1dc4e9b7fe38f053fbe.tar.lz meow-c60dba253906a30d3042f1dc4e9b7fe38f053fbe.tar.xz meow-c60dba253906a30d3042f1dc4e9b7fe38f053fbe.tar.zst meow-c60dba253906a30d3042f1dc4e9b7fe38f053fbe.zip |
add test...
Diffstat (limited to 'meowpp.test/src/autostitch_RansacCheck.cpp')
-rw-r--r-- | meowpp.test/src/autostitch_RansacCheck.cpp | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/meowpp.test/src/autostitch_RansacCheck.cpp b/meowpp.test/src/autostitch_RansacCheck.cpp new file mode 100644 index 0000000..0410396 --- /dev/null +++ b/meowpp.test/src/autostitch_RansacCheck.cpp @@ -0,0 +1,121 @@ +#include "autostitch.h" + +#include "meowpp/math/Matrix.h" +#include "meowpp/math/Vector.h" +#include <utility> + +using namespace meow; + +double MyRansacCheck::threshold = 5.0; + +meow::Usage MyRansacCheck::usage(){ + Usage usg; + usg.optionAdd('t', + "Threshold for RANSAC", + "<floating point>", stringPrintf("%.10f", threshold), + false); + return usg; +} + +bool MyRansacCheck::usage(Usage const& usg){ + threshold = inRange(0.0000001, 1000.0, + atof(usg.optionValue('t', 0).c_str())); + return true; +} + +MyRansacCheck::MyRansacCheck(){ +} + + +MyRansacCheck::MyRansacCheck(MyRansacCheck const& __rc): +_from(__rc._from), +_to(__rc._to){ +} + + +MyRansacCheck::MyRansacCheck(std::vector<Vector<double> > const* __from, + std::vector<Vector<double> > const* __to): +_from(__from), +_to(__to){ +} + + +MyRansacCheck::~MyRansacCheck(){ +} + + +std::pair<Vector3D<double>, Vector3D<double> > MyRansacCheck::vCalc( + std::vector<FeaturePointIndexPair> const& __sample +) const{ + Matrix<double> m(6, 7, 0.0); + for(size_t i = 0; i < 3u; i++){ + m(i * 2 , 0, (*_from)[__sample[i].from.second](0)); + m(i * 2 , 1, (*_from)[__sample[i].from.second](1)); + m(i * 2 , 2, 1.0); + m(i * 2 , 6, (*_to)[__sample[i].to.second](0)); + m(i * 2 + 1, 3, (*_from)[__sample[i].from.second](0)); + m(i * 2 + 1, 4, (*_from)[__sample[i].from.second](1)); + m(i * 2 + 1, 5, 1.0); + m(i * 2 + 1, 6, (*_to)[__sample[i].to.second](1)); + } + m.triangulared(); + Vector<double> x(6, 0.0); + for(ssize_t i = 5; i >= 0; i--){ + double sum = 0; + for(size_t j = i + 1; j < 6u; j++){ + sum += x(j) * m(i, j); + } + x.entry(i, (m(i, 6) - sum) / m(i, i)); + } + Vector3D<double> vX(x(0), x(1), x(2)); + Vector3D<double> vY(x(3), x(4), x(5)); + return std::pair<Vector3D<double>, Vector3D<double> >(vX, vY); +} + + +void MyRansacCheck::rememberVCalc(std::vector<FeaturePointIndexPair> + const& __sample){ + std::pair<Vector3D<double>, Vector3D<double> > p(vCalc(__sample)); + _vX = p.first; + _vY = p.second; +} + + +bool MyRansacCheck::ok(FeaturePointIndexPair const& __m) const{ + Vector2D<double> from( + (*_from)[__m.from.second](0), + (*_from)[__m.from.second](1)); + Vector2D<double> me( + (*_to)[__m.to.second](0), + (*_to)[__m.to.second](1)); + Vector2D<double> me2(to(from)); + return ((me - me2).length2() <= threshold); +} + + +double MyRansacCheck::operator()(std::vector<FeaturePointIndexPair> + const& __sample, + std::vector<FeaturePointIndexPair> + const& __data) const{ + for(size_t i = 0, I = __sample.size(); i < I; i++){ + for(size_t j = 0, J = __sample.size(); j < J; j++){ + if(i == j) continue; + if(__sample[i].from.second == __sample[j].from.second) return -1; + if(__sample[i].to .second == __sample[j].to .second) return -1; + } + } + ((MyRansacCheck*)this)->rememberVCalc(__sample); + size_t ret = 0; + for(size_t i = 0, I = __data.size(); i < I; i++){ + if(ok(__data[i])){ + ret++; + } + } + return 0.001 + ret; +} + + +Vector2D<double> MyRansacCheck::to(Vector2D<double> const& __v) const{ + Vector3D<double> v(__v(0), __v(1), 1); + return Vector2D<double>(v.dot(_vX), v.dot(_vY)); +} |