SVO-1-Frame.h–2021.1.15
Frame.h
#ifndef SVO_FRAME_H_
#define SVO_FRAME_H_
#include <sophus/se3.h>
#include <vikit/math_utils.h>
#include <vikit/abstract_camera.h>
#include <boost/noncopyable.hpp>
#include <svo/global.h>
namespace g2o{
class VertexSE3Expmap;
}
typedef g2o::VertexSE3Expmap g2oFrameSE3;
namespace svo{
class Point;
class Feature;
typedef list<Feature*> Features;
typedef vector<cv::Mat> ImgPyr;
class Frame : boost::noncopyable{
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
static int frame_counter_;
int id;
double timestamp_;
vk::AbstracCamera* cam_;
Matrix<double> Cov_;
ImgPyr img_pyr_;
Features fts_;
vector<Features*> key_pts_;
bool is_keyframe_;
g2oFrameSE3* v_kf_;
int last_published_ts;
Frame(vk::AbstracCamera* cam,const cv::Mat& img,double timestamp;
~Frame();
void initFrame(const cv::Mat& img);
void setKeyframe();
void addFeature(Feature* ftr);
void setKeyPoints();
void checkKeyPoints(Feature* ftr);
void removeKeyPoint(Feature* ftr);
inline size_t nObs() const{return fts_.size();}
inline isVisble(const Vector3d& xyz_w) const;
inline const cv::Mat& img() const{
return img_pyr_[0];
}
inline bool isKeyframe() const{
return is_keyframe_;
}
inline Vector2d w2c(const Vector3d& xyz_w) const{
return cam_ -> world2cam(T_f_w_ *xyz_w);
}
inline Vector3d c2f(const Vector2d& px) const{
return cam_ -> cam2world(px[0],px[1]);
}
inline Vector3d c2f(const double x,const double y) const{
return cam_-> cam2world(x,y);
}
inline Vector3d w2f(const Vector3d& xyz_w) const{
return T_f_w_ * xyz_w;
}
inline Vector3d f2w(const Vector3d& f) const{
return T_f_w_.inverse() * f;
}
inline Vector2d f2c(const Vector3d& f) const{
return cam_ -> world2cam(f);
}
inline Vector3d pos() const{
return T_f_w_.inverse().translation();
}
inline static void jacobian_xyz2uv(const Vector3d& xyz_in_f,Matrix<double,2,6>& J){
const double x = xyz_in_f[0];
const double y = xyz_in_f[1];
const double z_inv = 1. / xyz_in_f[2];
const double z_inv_2 = z_inv * z_inv;
J(0,0) = -z_inv;
J(0,1) = 0.0;
J(0,2) = -x * z_inv_2;
J(0,3) = x * y * z_inv_2;
J(0,4) = -(1.0 + x * J(0,2));
J(0,5) = y * z_inv;
J(1,0) = 0;
J(1,1) = -z_inv;
J(1,2) = y * z_inv_2;
J(1,3) = 1.0 + y * J(1,2);
J(1,4) = - x * y * z_inv_2;
J(1,5) = -x * z_inv;
}
};
namespace frame_utils{
void createImgPyramid(const cv::Mat& img_level_0,int n_levels,ImgPyr& pyr);
bool getScenceDepth(const Frame& frame,double& depth_mean,double& depth_min);
}
}
#endif