123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- #ifndef ORB_SLAM3_MLPNPSOLVER_H
- #define ORB_SLAM3_MLPNPSOLVER_H
- #include "MapPoint.h"
- #include "Frame.h"
- #include<Eigen/Dense>
- #include<Eigen/Sparse>
- namespace ORB_SLAM3{
- class MLPnPsolver {
- public:
- MLPnPsolver(const Frame &F, const vector<MapPoint*> &vpMapPointMatches);
- ~MLPnPsolver();
- void SetRansacParameters(double probability = 0.99, int minInliers = 8, int maxIterations = 300, int minSet = 6, float epsilon = 0.4,
- float th2 = 5.991);
-
- cv::Mat iterate(int nIterations, bool &bNoMore, vector<bool> &vbInliers, int &nInliers);
-
-
- typedef Eigen::Vector3d bearingVector_t;
-
- typedef std::vector<bearingVector_t, Eigen::aligned_allocator<bearingVector_t> >
- bearingVectors_t;
-
- typedef Eigen::Matrix2d cov2_mat_t;
-
- typedef Eigen::Matrix3d cov3_mat_t;
-
- typedef std::vector<cov3_mat_t, Eigen::aligned_allocator<cov3_mat_t> >
- cov3_mats_t;
-
- typedef Eigen::Vector3d point_t;
-
- typedef std::vector<point_t, Eigen::aligned_allocator<point_t> >
- points_t;
-
- typedef Eigen::Vector4d point4_t;
-
- typedef std::vector<point4_t, Eigen::aligned_allocator<point4_t> >
- points4_t;
-
- typedef Eigen::Vector3d rodrigues_t;
-
- typedef Eigen::Matrix3d rotation_t;
-
- typedef Eigen::Matrix<double,3,4> transformation_t;
-
- typedef Eigen::Vector3d translation_t;
- private:
- void CheckInliers();
- bool Refine();
-
-
- void computePose(
- const bearingVectors_t & f,
- const points_t & p,
- const cov3_mats_t & covMats,
- const std::vector<int>& indices,
- transformation_t & result);
- void mlpnp_gn(Eigen::VectorXd& x,
- const points_t& pts,
- const std::vector<Eigen::MatrixXd>& nullspaces,
- const Eigen::SparseMatrix<double> Kll,
- bool use_cov);
- void mlpnp_residuals_and_jacs(
- const Eigen::VectorXd& x,
- const points_t& pts,
- const std::vector<Eigen::MatrixXd>& nullspaces,
- Eigen::VectorXd& r,
- Eigen::MatrixXd& fjac,
- bool getJacs);
- void mlpnpJacs(
- const point_t& pt,
- const Eigen::Vector3d& nullspace_r,
- const Eigen::Vector3d& nullspace_s,
- const rodrigues_t& w,
- const translation_t& t,
- Eigen::MatrixXd& jacs);
-
-
- Eigen::Matrix3d rodrigues2rot(const Eigen::Vector3d & omega);
-
- Eigen::Vector3d rot2rodrigues(const Eigen::Matrix3d & R);
-
-
-
- vector<MapPoint*> mvpMapPointMatches;
-
- vector<cv::Point2f> mvP2D;
-
- bearingVectors_t mvBearingVecs;
- vector<float> mvSigma2;
-
-
- points_t mvP3Dw;
-
- vector<size_t> mvKeyPointIndices;
-
- double mRi[3][3];
- double mti[3];
- cv::Mat mTcwi;
- vector<bool> mvbInliersi;
- int mnInliersi;
-
- int mnIterations;
- vector<bool> mvbBestInliers;
- int mnBestInliers;
- cv::Mat mBestTcw;
-
- cv::Mat mRefinedTcw;
- vector<bool> mvbRefinedInliers;
- int mnRefinedInliers;
-
- int N;
-
- vector<size_t> mvAllIndices;
-
- double mRansacProb;
-
- int mRansacMinInliers;
-
- int mRansacMaxIts;
-
- float mRansacEpsilon;
-
- float mRansacTh;
-
- int mRansacMinSet;
-
- vector<float> mvMaxError;
- GeometricCamera* mpCamera;
- };
- }
- #endif
|