⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atancamera.h

📁 this is software for visual SLAM
💻 H
字号:
// *-* c++ *-*// Copyright 2008 Isis Innovation Limited// N-th implementation of a camera model// GK 2007// Evolved a half dozen times from the CVD-like model I was given by// TWD in 2000// // This one uses the ``FOV'' distortion model of// Deverneay and Faugeras, Straight lines have to be straight, 2001//// BEWARE: This camera model caches intermediate results in member variables// Some functions therefore depend on being called in order: i.e.// GetProjectionDerivs() uses data stored from the last Project() or UnProject()// THIS MEANS YOU MUST BE CAREFUL WITH MULTIPLE THREADS// Best bet is to give each thread its own version of the camera!//// Camera parameters are stored in a GVar, but changing the gvar has no effect// until the next call to RefreshParams() or SetImageSize().//// Pixel conventions are as follows:// For Project() and Unproject(),// round pixel values - i.e. (0.0, 0.0) - refer to pixel centers// I.e. the top left pixel in the image covers is centered on (0,0)// and covers the area (-.5, -.5) to (.5, .5)//// Be aware that this is not the same as what opengl uses but makes sense// for acessing pixels using ImageRef, especially ir_rounded.//// What is the UFB?// This is for projecting the visible image area// to a unit square coordinate system, with the top-left at 0,0,// and the bottom-right at 1,1// This is useful for rendering into textures! The top-left pixel is NOT// centered at 0,0, rather the top-left corner of the top-left pixel is at // 0,0!!! This is the way OpenGL thinks of pixel coords.// There's the Linear and the Distorting version - // For the linear version, can use // glMatrixMode(GL_PROJECTION); glLoadIdentity();// glMultMatrix(Camera.MakeUFBLinearFrustumMatrix(near,far));// To render un-distorted geometry with full frame coverage.//#ifndef __ATAN_CAMERA_H#define __ATAN_CAMERA_H#include <TooN/numerics.h>#include <cvd/vector_image_ref.h>#include <gvars3/gvars3.h>#define NUMTRACKERCAMPARAMETERS 5class CameraCalibrator;class CalibImage;// The parameters are:// 0 - normalized x focal length// 1 - normalized y focal length// 2 - normalized x offset// 3 - normalized y offset// 4 - w (distortion parameter)class ATANCamera { public:  ATANCamera(std::string sName);  // Image size get/set: updates the internal projection params to that target image size.  void SetImageSize(Vector<2> v2ImageSize);  inline void SetImageSize(CVD::ImageRef irImageSize) {SetImageSize(vec(irImageSize));};  inline Vector<2> GetImageSize() {return mvImageSize;};  void RefreshParams();    // Various projection functions  Vector<2> Project(const Vector<2>& camframe); // Projects from camera z=1 plane to pixel coordinates, with radial distortion  inline Vector<2> Project(CVD::ImageRef ir) { return Project(vec(ir)); }  Vector<2> UnProject(const Vector<2>& imframe); // Inverse operation  inline Vector<2> UnProject(CVD::ImageRef ir)  { return UnProject(vec(ir)); }    Vector<2> UFBProject(const Vector<2>& camframe);  Vector<2> UFBUnProject(const Vector<2>& camframe);  inline Vector<2> UFBLinearProject(const Vector<2>& camframe);  inline Vector<2> UFBLinearUnProject(const Vector<2>& fbframe);    Matrix<2,2> GetProjectionDerivs(); // Projection jacobian    inline bool Invalid() {  return mbInvalid;}  inline double LargestRadiusInImage() {  return mdLargestRadius; }  inline double OnePixelDist() { return mdOnePixelDist; }    // The z=1 plane bounding box of what the camera can see  inline Vector<2> ImplaneTL();   inline Vector<2> ImplaneBR();   // OpenGL helper function  Matrix<4> MakeUFBLinearFrustumMatrix(double near, double far);    // Useful for gvar-related reasons (in case some external func tries to read the camera params gvar, and needs some defaults.)  static const Vector<NUMTRACKERCAMPARAMETERS> mvDefaultParams;   protected:  GVars3::gvar3<Vector<NUMTRACKERCAMPARAMETERS> > mgvvCameraParams; // The actual camera parameters    Matrix<2, NUMTRACKERCAMPARAMETERS> GetCameraParameterDerivs();  void UpdateParams(Vector<NUMTRACKERCAMPARAMETERS> vUpdate);    // Cached from the last project/unproject:  Vector<2> mvLastCam;      // Last z=1 coord  Vector<2> mvLastIm;       // Last image/UFB coord  Vector<2> mvLastDistCam;  // Last distorted z=1 coord  double mdLastR;           // Last z=1 radius  double mdLastDistR;       // Last z=1 distorted radius  double mdLastFactor;      // Last ratio of z=1 radii  bool mbInvalid;           // Was the last projection invalid?    // Cached from last RefreshParams:  double mdLargestRadius; // Largest R in the image  double mdMaxR;          // Largest R for which we consider projection valid  double mdOnePixelDist;  // z=1 distance covered by a single pixel offset (a rough estimate!)  double md2Tan;          // distortion model coeff  double mdOneOver2Tan;   // distortion model coeff  double mdW;             // distortion model coeff  double mdWinv;          // distortion model coeff  Vector<2> mvCenter;     // Pixel projection center  Vector<2> mvFocal;      // Pixel focal length  Vector<2> mvInvFocal;   // Inverse pixel focal length  Vector<2> mvImageSize;    Vector<2> mvUFBLinearFocal;  Vector<2> mvUFBLinearInvFocal;  Vector<2> mvUFBLinearCenter;  Vector<2> mvImplaneTL;     Vector<2> mvImplaneBR;    // Radial distortion transformation factor: returns ration of distorted / undistorted radius.  inline double rtrans_factor(double r)  {    if(r < 0.001 || mdW == 0.0)      return 1.0;    else       return (mdWinv* atan(r * md2Tan) / r);  };  // Inverse radial distortion: returns un-distorted radius from distorted.  inline double invrtrans(double r)  {    if(mdW == 0.0)      return r;    return(tan(r * mdW) * mdOneOver2Tan);  };    std::string msName;  friend class CameraCalibrator;   // friend declarations allow access to calibration jacobian and camera update function.  friend class CalibImage;};// Some inline projection functions:inline Vector<2> ATANCamera::UFBLinearProject(const Vector<2>& camframe){  Vector<2> v2Res;  v2Res[0] = camframe[0] * mvUFBLinearFocal[0] + mvUFBLinearCenter[0];  v2Res[1] = camframe[1] * mvUFBLinearFocal[1] + mvUFBLinearCenter[1];  return v2Res;}inline Vector<2> ATANCamera::UFBLinearUnProject(const Vector<2>& fbframe){  Vector<2> v2Res;  v2Res[0] = (fbframe[0] - mvUFBLinearCenter[0]) * mvUFBLinearInvFocal[0];  v2Res[1] = (fbframe[1] - mvUFBLinearCenter[1]) * mvUFBLinearInvFocal[1];  return v2Res;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -