Go to the documentation of this file.00001 #include <boost/thread/mutex.hpp>
00002
00003 #include <fstream>
00004 #include <iostream>
00005 #include <Eigen/Core>
00006 #include <unsupported/Eigen/MatrixFunctions>
00007
00008 #include <opencv2/core/core.hpp>
00009 #include <opencv2/imgproc/imgproc.hpp>
00010 #include <opencv2/highgui/highgui.hpp>
00011 #include <Eigen/StdVector>
00012 #include <time.h>
00013
00014 #define EIGEN_USE_NEW_STDVECTOR
00015
00016 #ifndef SDF_TRACKER
00017 #define SDF_TRACKER
00018
00019 class SDF_Parameters
00020 {
00021 public:
00022 bool interactive_mode;
00023 int XSize;
00024 int YSize;
00025 int ZSize;
00026 int raycast_steps;
00027 int image_height;
00028 int image_width;
00029 double fx;
00030 double fy;
00031 double cx;
00032 double cy;
00033 double Wmax;
00034 double resolution;
00035 double Dmax;
00036 double Dmin;
00037 Eigen::Matrix4d pose_offset;
00038 double robust_statistic_coefficient;
00039 double regularization;
00040 double min_parameter_update;
00041 double min_pose_change;
00042 std::string render_window;
00043
00044 SDF_Parameters();
00045 virtual ~SDF_Parameters();
00046 };
00047
00048 typedef Eigen::Matrix<double,6,1> Vector6d;
00049
00050 class SDFTracker
00051 {
00052 protected:
00053
00054 std::vector<Eigen::Matrix4d,Eigen::aligned_allocator<Eigen::Matrix4d> > transformations_;
00055 std::vector<Eigen::Vector4d,Eigen::aligned_allocator<Eigen::Vector4d> > interest_points_;
00056 std::vector<Eigen::Vector4d,Eigen::aligned_allocator<Eigen::Vector4d> > Points_;
00057
00058 Eigen::Matrix4d Transformation_;
00059 Vector6d Pose_;
00060 Vector6d cumulative_pose_;
00061 cv::Mat *depthImage_;
00062 cv::Mat *depthImage_denoised_;
00063
00064 boost::mutex transformation_mutex_;
00065 boost::mutex depth_mutex_;
00066 boost::mutex points_mutex_;
00067 boost::mutex depthDenoised_mutex_;
00068 std::string camera_name_;
00069
00070 bool** validityMask_;
00071 float*** myGrid_;
00072 bool first_frame_;
00073 bool quit_;
00074
00075 Eigen::Vector4d VertexInterp(double iso, Eigen::Vector4d &p1d, Eigen::Vector4d &p2d,double valp1, double valp2);
00076 void MarchingTetrahedrons(Eigen::Vector4d &Origin, int tetrahedron);
00077 virtual void Init(SDF_Parameters ¶meters);
00078 virtual void DeleteGrids(void);
00079
00080 public:
00081 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00082
00083 std::vector<Eigen::Vector4d> triangles_;
00084 SDF_Parameters parameters_;
00085
00087 virtual double SDF(const Eigen::Vector4d &location);
00088
00090 virtual double SDFGradient(const Eigen::Vector4d &location, int dim, int stepSize);
00091
00093 virtual void SaveSDF(const std::string &filename = std::string("sdf_volume.vti"));
00094
00096 virtual void LoadSDF(const std::string &filename);
00097
00099 bool ValidGradient(const Eigen::Vector4d &location);
00100
00102 virtual void UpdateDepth(const cv::Mat &depth);
00103
00105 virtual void UpdatePoints(const std::vector<Eigen::Vector4d,Eigen::aligned_allocator<Eigen::Vector4d> > &Points);
00106
00107
00109 virtual Vector6d EstimatePoseFromDepth(void);
00110
00112 virtual Vector6d EstimatePoseFromPoints(void);
00113
00115 virtual void FuseDepth(void);
00116
00118 virtual void FusePoints(void);
00119
00121 virtual void FuseDepth(const cv::Mat &depth);
00122
00124 virtual void Render(void);
00125
00127 cv::Point2d To2D(const Eigen::Vector4d &location, double fx, double fy, double cx, double cy);
00128
00130 Eigen::Vector4d To3D(int row, int column, double depth, double fx, double fy, double cx, double cy);
00131
00133 Eigen::Matrix4d Twist(const Vector6d &xi);
00134
00136 void MakeTriangles(void);
00137
00139 void SaveTriangles(const std::string filename = std::string("triangles.obj"));
00140
00142 void SaveTrianglesSTL(const std::string filename = std::string("triangles.stl"));
00144 void GetDenoisedImage(cv::Mat &img);
00145
00147 Eigen::Matrix4d GetCurrentTransformation(void);
00148
00150 void SetCurrentTransformation(const Eigen::Matrix4d &T);
00151
00153 Eigen::Vector3d ShootSingleRay(int row, int col, Eigen::Matrix4d &pose);
00154
00156 Eigen::Vector3d ShootSingleRay(int row, int col);
00157
00159 Eigen::Vector3d ShootSingleRay(Eigen::Vector3d &start, Eigen::Vector3d &direction);
00160
00161 cv::Mat* GetCurrentDepthImg() {
00162 return depthImage_;
00163 }
00165 bool Quit(void);
00166
00168 SDFTracker();
00169
00171 SDFTracker(SDF_Parameters ¶meters);
00172 virtual ~SDFTracker();
00173
00174 };
00175
00176 #endif