Program Listing for File TrackableKeyFrameSearch.h

Return to documentation for file (lib/GlobalMapping/TrackableKeyFrameSearch.h)

#pragma once
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include "util/SophusUtil.h"
#include "util/Configuration.h"

#ifdef HAVE_FABMAP
    #include "GlobalMapping/FabMap.h"
#endif

#include "util/MovingAverage.h"
#include "util/settings.h"

#include "DataStructures/KeyFrame.h"


namespace lsd_slam
{


class KeyFrameGraph;
class SE3Tracker;


struct TrackableKFStruct
{
    KeyFrame::SharedPtr keyframe;
    SE3 refToFrame;
    float dist;
    float angle;
};

class TrackableKeyFrameSearch
{
public:
    TrackableKeyFrameSearch( const std::shared_ptr<KeyFrameGraph> &graph );
    ~TrackableKeyFrameSearch();

    std::unordered_set<KeyFrame::SharedPtr> findCandidates(const KeyFrame::SharedPtr &keyframe, KeyFrame::SharedPtr &fabMapResult_out, bool includeFABMAP=true, bool closenessTH=1.0);
    KeyFrame::SharedPtr findRePositionCandidate( const KeyFrame::SharedPtr &frame, float maxScore=1);


    inline float getRefFrameScore(float distanceSquared, float usage)
    {
        return distanceSquared*KFDistWeight*KFDistWeight
                + (1-usage)*(1-usage) * KFUsageWeight * KFUsageWeight;
    }

    MsRateAverage trackPermaRef;


private:
    KeyFrame::SharedPtr findAppearanceBasedCandidate(const KeyFrame::SharedPtr &keyframe);
    std::vector<TrackableKFStruct> findEuclideanOverlapFrames(const KeyFrame::SharedPtr &frame, float distanceTH, float angleTH, bool checkBothScales = false);

#ifdef HAVE_FABMAP
    std::unordered_map<int, KeyFrame::SharedPtr> fabmapIDToKeyframe;
    FabMap fabMap;
#endif
    std::shared_ptr<KeyFrameGraph> graph;
    std::unique_ptr<SE3Tracker> tracker;

    //float fowX, fowY;

};

}