📄 keyframe.h
字号:
// -*- c++ -*-// Copyright 2008 Isis Innovation Limited//// This header declares the data structures to do with keyframes:// structs KeyFrame, Level, Measurement, Candidate.// // A KeyFrame contains an image pyramid stored as array of Level;// A KeyFrame also has associated map-point mesurements stored as a vector of Measurment;// Each individual Level contains an image, corner points, and special corner points// which are promoted to Candidate status (the mapmaker tries to make new map points from those.)//// KeyFrames are stored in the Map class and manipulated by the MapMaker.// However, the tracker also stores its current frame as a half-populated// KeyFrame struct.#ifndef __KEYFRAME_H#define __KEYFRAME_H#include <TooN/numerics.h>#include <TooN/se3.h>#include <cvd/image.h>#include <cvd/byte.h>#include <vector>#include <set>#include <map>class MapPoint;class SmallBlurryImage;#define LEVELS 4// Candidate: a feature in an image which could be made into a map pointstruct Candidate{ CVD::ImageRef irLevelPos; Vector<2> v2RootPos; double dSTScore;};// Measurement: A 2D image measurement of a map point. Each keyframe stores a bunch of these.struct Measurement{ int nLevel; // Which image level? bool bSubPix; // Has this measurement been refined to sub-pixel level? Vector<2> v2RootPos; // Position of the measurement, REFERED TO PYRAMID LEVEL ZERO enum {SRC_TRACKER, SRC_REFIND, SRC_ROOT, SRC_TRAIL, SRC_EPIPOLAR} Source; // Where has this measurement come frome?};// Each keyframe is made of LEVELS pyramid levels, stored in struct Level.// This contains image data and corner points.struct Level{ inline Level() { bImplaneCornersCached = false; }; CVD::Image<CVD::byte> im; // The pyramid level pixels std::vector<CVD::ImageRef> vCorners; // All FAST corners on this level std::vector<int> vCornerRowLUT; // Row-index into the FAST corners, speeds up access std::vector<CVD::ImageRef> vMaxCorners; // The maximal FAST corners Level& operator=(const Level &rhs); std::vector<Candidate> vCandidates; // Potential locations of new map points bool bImplaneCornersCached; // Also keep image-plane (z=1) positions of FAST corners to speed up epipolar search std::vector<Vector<2> > vImplaneCorners; // Corner points un-projected into z=1-plane coordinates};// The actual KeyFrame struct. The map contains of a bunch of these. However, the tracker uses this// struct as well: every incoming frame is turned into a keyframe before tracking; most of these // are then simply discarded, but sometimes they're then just added to the map.struct KeyFrame{ inline KeyFrame() { pSBI = NULL; } SE3 se3CfromW; // The coordinate frame of this key-frame as a Camera-From-World transformation bool bFixed; // Is the coordinate frame of this keyframe fixed? (only true for first KF!) Level aLevels[LEVELS]; // Images, corners, etc lives in this array of pyramid levels std::map<MapPoint*, Measurement> mMeasurements; // All the measurements associated with the keyframe void MakeKeyFrame_Lite(CVD::BasicImage<CVD::byte> &im); // This takes an image and calculates pyramid levels etc to fill the // keyframe data structures with everything that's needed by the tracker.. void MakeKeyFrame_Rest(); // ... while this calculates the rest of the data which the mapmaker needs. double dSceneDepthMean; // Hacky hueristics to improve epipolar search. double dSceneDepthSigma; SmallBlurryImage *pSBI; // The relocaliser uses this};typedef std::map<MapPoint*, Measurement>::iterator meas_it; // For convenience, and to work around an emacs paren-matching bug#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -