SDfile.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:4k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // 
  3. // SDfile.h
  4. //
  5. // Kari Pulli
  6. // Tue Feb 23 13:09:27 CET 1999
  7. //
  8. // Read, write, and store the raw data of an *.sd file
  9. //
  10. //############################################################
  11. #ifndef __SDFILE_H__
  12. #define __SDFILE_H__
  13. #include <rope.h>
  14. #include <fstream.h>
  15. #include "CyberXform.h"
  16. #include "Bbox.h"
  17. class VertexFilter;
  18. typedef unsigned char uchar;
  19. struct sd_raw_pnt {
  20.   unsigned int config;
  21.   short        y,z;
  22.   float        nod, turn, tr_h;
  23. };  
  24. class SDfile {
  25. private:
  26.   unsigned int    version;
  27.   unsigned int    header_size;
  28. public:
  29.   float           other_screw;
  30.   float           scanner_trans;
  31.   float           scanner_vert;
  32.   unsigned int    scanner_config;
  33. private:
  34.   float           laser_intensity;
  35.   float           camera_sensitivity;
  36. public:
  37.   CyberXform      xf;
  38. private:
  39.   float           frame_pitch;// screw pitch between frames
  40.   float           scan_screw; // "center" scan screw value 
  41.   unsigned int    n_pts;      // size of z_data and intensity_data
  42.   unsigned int    n_valid_pts;
  43.   unsigned int    pts_per_frame;
  44.   unsigned int    n_frames;   // number of frames
  45.   unsigned int   *row_start;  // index to z_data for start of row
  46.   unsigned short *first_good; // the first good column of row
  47.   unsigned short *first_bad;  // the first missing column of row
  48.   unsigned short *z_data;     // the raw z data
  49.   unsigned char  *intensity_data;
  50.   // preprocessing for space carving
  51.   bool  axis_proj_done;
  52.   float axis_proj_min, axis_proj_max;
  53.   void  prepare_axis_proj(void);
  54.   void make_tstrip_horizontal(vector<int>  &tstrips,
  55.       vector<char> &bdry);
  56.   void make_tstrip_vertical(vector<int>  &tstrips,
  57.     vector<char> &bdry);
  58.   enum SubSampMode { fast, conf, holesGrow, filterAvg };
  59.   void fill_index_array(int  step, 
  60. int  row,
  61. SubSampMode subSampMode,
  62. vector<int> &p,
  63. vector<Pnt3>  &pnts,
  64. vector<int>   &ssmap,
  65. vector<uchar> &intensity,
  66. vector<uchar> &confidence);
  67.   bool find_row_range(float screw, float radius, const Pnt3 &ctr,
  68.       int rowrange[2]);
  69. public:
  70.   SDfile(void);
  71.   ~SDfile(void);
  72.   bool read (const crope &fname);
  73.   bool write (const crope &fname);
  74.   void fill_holes(int max_missing, int thresh);
  75.   int  valid_pts(void) { return n_valid_pts; }
  76.   void make_tstrip(vector<int>  &tstrips,
  77.    vector<char> &bdry);
  78.   void subsampled_tstrip(int            step, 
  79.  char          *behavior,
  80.  vector<int>   &tstrips,
  81.  vector<char>  &bdry,
  82.  vector<Pnt3>  &pnts,
  83.  vector<uchar> &intensity,
  84.  vector<uchar> &confidence,
  85.  vector<int>   &ssmap);
  86.   void set_xf(int row, bool both = true);
  87.   void get_pnts_and_intensities(vector<Pnt3>  &pnts,
  88. vector<uchar> &intensity);
  89.   // access a data point, transformed or in laser coords
  90.   // row is the frame, col is a point on scanline,
  91.   // col even: frame 0; col odd: frame 1
  92.   // returns false if there is no such point
  93.   bool get_point(int r, int c, Pnt3 &p, bool transformed = true);
  94.   Xform<float> vrip_reorientation_frame(void);
  95.   bool find_data(float screw, float y_in, 
  96.  int &row,unsigned short &y,
  97.  unsigned short &z);
  98.   int  count_valid_pnts(void);
  99.   void filtered_copy(const VertexFilter &filter,
  100.      SDfile &sdnew);
  101.   void get_piece(int firstFrame, int lastFrame,
  102.  SDfile &sdnew);
  103.   int  num_frames(void) { return n_frames; }
  104.   Bbox get_bbox(void);
  105.   // for space carving
  106.   int sphere_status(const Pnt3 &ctr, float r);
  107.   // for auto calibration
  108.   int dump_pts_laser_subsampled(ofstream &out, int nPnts);
  109.   Pnt3 raw_for_ith      (int   i, sd_raw_pnt &data);
  110.   Pnt3 raw_for_ith_valid(int   i, sd_raw_pnt &data);
  111. };
  112. #endif