Program Listing for File DepthMap.h¶
↰ Return to documentation for file (lib/DepthEstimation/DepthMap.h)
#pragma once
#include "opencv2/core/core.hpp"
#include "util/Configuration.h"
#include "util/EigenCoreInclude.h"
#include "util/IndexThreadReduce.h"
#include "util/MovingAverage.h"
#include "util/SophusUtil.h"
#include "util/Timer.h"
#include "util/settings.h"
#include "DataStructures/Frame.h"
#include "DataStructures/ImageSet.h"
#include "DepthMapDebugImages.h"
#include <opencv2/calib3d.hpp>
namespace lsd_slam {
class DepthMapPixelHypothesis;
class KeyFrameGraph;
class KeyFrame;
class DepthMap {
public:
typedef std::shared_ptr<DepthMap> SharedPtr;
// Delete default constructors
DepthMap(const DepthMap &) = delete;
DepthMap &operator=(const DepthMap &) = delete;
DepthMap(const std::shared_ptr<Frame> &frame);
DepthMap(const std::shared_ptr<ImageSet> &set);
// //== Propagation constructor for subsequent keyframes
// DepthMap( const DepthMap::SharedPtr &other, const Frame::SharedPtr &frame
// );
~DepthMap();
void reset();
// /**
// * does obervation and regularization only.
// **/
// void updateKeyframe(std::deque< Frame::SharedPtr > referenceFrames);
//
// /**
// * does propagation and whole-filling-regularization (no observation, for
// that need to call updateKeyframe()!)
// **/
// void createKeyFrame( const Frame::SharedPtr &new_keyframe );
// void finalizeKeyFrame();
// void invalidate();
// inline bool isValid() {return (bool)activeKeyFrame;};
// int debugPlotDepthMap();
const DepthMapDebugImages &debugImages() const { return _debugImages; }
// This is the only debug plot which is triggered externally..
void plotDepthMap(const char *buf1, const char *buf2);
//== Initializers, required only when propagating from a previous keyframe
void initializeFromFrame();
void initializeFromSet();
void initializeFromGTDepth();
void initializeFromStereo();
void initializeRandomly();
// void initializefromStereo( const std::shared_ptr<ImageSet> &set);
void propagateFrom(const DepthMap::SharedPtr &new_keyframe,
float &rescaleFactor, bool stereo_depth);
void finalize();
// void activateExistingKF(const Frame::SharedPtr &kf);
void activateExistingKF(const Frame::SharedPtr &kf);
//==
bool updateDepthFrom(const Frame::SharedPtr &frame);
struct PerformanceData {
PerformanceData(void) { ; }
MsRateAverage update, create, finalize, observe, regularize, propagate,
fillHoles, setDepth;
};
PerformanceData perf() const { return _perf; }
void logPerformanceData();
// Convenience accessors
std::shared_ptr<Frame> &frame() { return _frame; }
//
DepthMapPixelHypothesis *hypothesisAt(const int x, const int y) {
return currentDepthMap + x + y * Conf().slamImageSize.width;
}
private:
IndexThreadReduce threadReducer;
PerformanceData _perf;
DepthMapDebugImages _debugImages;
// ============= parameter copies for convenience ===========================
// these are just copies of the pointers given to this function, for
// convenience. these are NOT managed by this object!
std::shared_ptr<Frame> _frame;
std::shared_ptr<ImageSet> _set;
const float *activeKeyFrameImageData() { return frame()->image(0); }
bool activeKeyFrameIsReactivated;
// Frame::SharedPtr oldest_referenceFrame;
// Frame::SharedPtr newest_referenceFrame;
// std::vector< Frame::SharedPtr > referenceFrameByID;
// int referenceFrameByID_offset;
// ============= internally used buffers for intermediate calculations etc.
// ============= for internal depth tracking, their memory is managed (created
// & deleted) by this object.
DepthMapPixelHypothesis *otherDepthMap;
DepthMapPixelHypothesis *currentDepthMap;
int *validityIntegralBuffer;
// ============ internal functions
// ================================================== does the line-stereo
// seeking. takes a lot of parameters, because they all have been pre-computed
// before.
inline float doLineStereo(const float u, const float v, const float epxn,
const float epyn, const float min_idepth,
const float prior_idepth, float max_idepth,
const Frame *const referenceFrame,
const float *referenceFrameImage,
float &result_idepth, float &result_var,
float &result_eplLength, RunningStats *const stats);
// Reset currentDepthMap by re-projecting is from activeKeyFrame to
// new_keyframe
void propagateDepthFrom(const DepthMap::SharedPtr &new_keyframe,
float &rescaleFactor);
void propagateDepthFromSet(const DepthMap::SharedPtr &new_keyframe,
float &rescaleFactor);
// This is a local state variable used to share data between the observeDepth*
// functions. Sucks, I know
Frame::SharedPtr _observeFrame;
void observeDepth(const Frame::SharedPtr &updateFrame);
void observeDepthRow(int yMin, int yMax, RunningStats *stats);
bool observeDepthCreate(const int &x, const int &y, const int &idx,
RunningStats *const &stats);
bool observeDepthUpdate(const int &x, const int &y, const int &idx,
const float *keyFrameMaxGradBuf,
RunningStats *const &stats);
bool makeAndCheckEPL(const int x, const int y, const Frame *const ref,
float *pepx, float *pepy, RunningStats *const stats);
void regularizeDepthMap(bool removeOcclusion, int validityTH);
template <bool removeOcclusions>
void regularizeDepthMapRow(int validityTH, int yMin, int yMax,
RunningStats *stats);
void buildRegIntegralBuffer();
void buildRegIntegralBufferRow1(int yMin, int yMax, RunningStats *stats);
void regularizeDepthMapFillHoles();
void regularizeDepthMapFillHolesRow(int yMin, int yMax, RunningStats *stats);
void resetCounters();
// float clocksPropagate, clocksPropagateKF, clocksObserve, msObserve,
// clocksReg1, clocksReg2, msReg1, msReg2, clocksFinalize;
};
} // namespace lsd_slam