/** * This file is part of ORB-SLAM3 * * Copyright (C) 2017-2020 Carlos Campos, Richard Elvira, Juan J. Gómez Rodríguez, José M.M. Montiel and Juan D. Tardós, University of Zaragoza. * Copyright (C) 2014-2016 Raúl Mur-Artal, José M.M. Montiel and Juan D. Tardós, University of Zaragoza. * * ORB-SLAM3 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public * License as published by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ORB-SLAM3 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with ORB-SLAM3. * If not, see . */ #ifndef ORBMATCHER_H #define ORBMATCHER_H #include #include #include #include "Frame.h" #include "KeyFrame.h" #include "MapPoint.h" namespace ORB_SLAM3 { class ORBmatcher { public: ORBmatcher(float nnratio = 0.6, bool checkOri = true); // Computes the Hamming distance between two ORB descriptors static int DescriptorDistance(const cv::Mat& a, const cv::Mat& b); //myx : //cv::Mat GetEssential(KeyFrame& CurrentKeyFrame, KeyFrame& LastKeyFrame, const float th, const bool bMono, int &numInliers, int &numOutliers ,cv::Mat & R,cv::Mat & t); cv::Mat GetFundamental(KeyFrame& CurrentKeyFrame, KeyFrame& LastKeyFrame, const float th, const bool bMono, vector & KeyPointsOutliers, cv::Mat& showFeature); void countEpipolarOutliers(KeyFrame& CurrentKeyFrame, KeyFrame& LastKeyFrame, const float th, const bool bMono, cv::Mat & F, double E_threshold, double scale_threshold ,vector & KeyPointsOutliers, cv::Mat & showFeature); // Search matches between Frame keypoints and projected MapPoints. Returns number of matches // Used to track the local map (Tracking) int SearchByProjection(Frame& F, const std::vector& vpMapPoints, const float th = 3, const bool bFarPoints = false, const float thFarPoints = 50.0f); // Project MapPoints tracked in last frame into the current frame and search matches. // Used to track from previous frame (Tracking) // int SearchByProjection(Frame &CurrentFrame, const Frame &LastFrame, const float th, const bool bMono); // TODO [Semantic] Remove const label for LastFrame int SearchByProjection(Frame& CurrentFrame, Frame& LastFrame, const float th, const bool bMono); int SearchByProjection(KeyFrame& CurrentFrame, KeyFrame& LastFrame, const float th, const bool bMono); // Project MapPoints seen in KeyFrame into the Frame and search matches. // Used in relocalisation (Tracking) int SearchByProjection(Frame& CurrentFrame, KeyFrame* pKF, const std::set& sAlreadyFound, const float th, const int ORBdist); // Project MapPoints using a Similarity Transformation and search matches. // Used in loop detection (Loop Closing) int SearchByProjection(KeyFrame* pKF, cv::Mat Scw, const std::vector& vpPoints, std::vector& vpMatched, int th, float ratioHamming = 1.0); // Project MapPoints using a Similarity Transformation and search matches. // Used in Place Recognition (Loop Closing and Merging) int SearchByProjection(KeyFrame* pKF, cv::Mat Scw, const std::vector& vpPoints, const std::vector& vpPointsKFs, std::vector& vpMatched, std::vector& vpMatchedKF, int th, float ratioHamming = 1.0); // Search matches between MapPoints in a KeyFrame and ORB in a Frame. // Brute force constrained to ORB that belong to the same vocabulary node (at a certain level) // Used in Relocalisation and Loop Detection int SearchByBoW(KeyFrame* pKF, Frame& F, std::vector& vpMapPointMatches); int SearchByBoW(KeyFrame* pKF1, KeyFrame* pKF2, std::vector& vpMatches12); // Matching for the Map Initialization (only used in the monocular case) int SearchForInitialization(Frame& F1, Frame& F2, std::vector& vbPrevMatched, std::vector& vnMatches12, int windowSize = 10); // Matching to triangulate new MapPoints. Check Epipolar Constraint. int SearchForTriangulation(KeyFrame* pKF1, KeyFrame* pKF2, cv::Mat F12, std::vector >& vMatchedPairs, const bool bOnlyStereo, const bool bCoarse = false); int SearchForTriangulation(KeyFrame* pKF1, KeyFrame* pKF2, cv::Mat F12, vector >& vMatchedPairs, const bool bOnlyStereo, vector& vMatchedPoints); // Search matches between MapPoints seen in KF1 and KF2 transforming by a Sim3 [s12*R12|t12] // In the stereo and RGB-D case, s12=1 int SearchBySim3(KeyFrame* pKF1, KeyFrame* pKF2, std::vector& vpMatches12, const float& s12, const cv::Mat& R12, const cv::Mat& t12, const float th); // Project MapPoints into KeyFrame and search for duplicated MapPoints. int Fuse(KeyFrame* pKF, const vector& vpMapPoints, const float th = 3.0, const bool bRight = false); // Project MapPoints into KeyFrame using a given Sim3 and search for duplicated MapPoints. int Fuse(KeyFrame* pKF, cv::Mat Scw, const std::vector& vpPoints, float th, vector& vpReplacePoint); public: static const int TH_LOW; static const int TH_HIGH; static const int HISTO_LENGTH; protected: bool CheckDistEpipolarLine(const cv::KeyPoint& kp1, const cv::KeyPoint& kp2, const cv::Mat& F12, const KeyFrame* pKF, const bool b1 = false); bool CheckDistEpipolarLine2(const cv::KeyPoint& kp1, const cv::KeyPoint& kp2, const cv::Mat& F12, const KeyFrame* pKF, const float unc); float RadiusByViewingCos(const float& viewCos); void ComputeThreeMaxima(std::vector* histo, const int L, int& ind1, int& ind2, int& ind3); float mfNNratio; bool mbCheckOrientation; }; } // namespace ORB_SLAM #endif // ORBMATCHER_H