stereoMatching.h
上传用户:fengshi120
上传日期:2014-07-17
资源大小:6155k
文件大小:7k
源码类别:

3D图形编程

开发平台:

C/C++

  1. /*************************************************************************** 
  2. *
  3. * Copyright 2000 by David Demirdjian.   All rights reserved. 
  4. *  
  5. * Developed  by David Demirdjian
  6. *  
  7. * Permission to use, copy, or modify this software and  its documentation 
  8. * for  educational  and  research purposes only and without fee  is hereby 
  9. * granted, provided  that this copyright notice and the original authors's 
  10. * names appear  on all copies and supporting documentation.  If individual 
  11. * files are  separated from  this  distribution directory  structure, this 
  12. * copyright notice must be included.  For any other uses of this software, 
  13. * in original or  modified form, including but not limited to distribution 
  14. * in whole or in  part, specific  prior permission  must be  obtained from 
  15. * MIT.  These programs shall not  be  used, rewritten, or  adapted as  the 
  16. * basis  of  a  commercial  software  or  hardware product  without  first 
  17. * obtaining appropriate  licenses from David Demirdjian.  The author makes 
  18. * no representations about the suitability of this software for any purpose.  
  19. * It is provided "as is" without express or implied warranty. 
  20. *  
  21. **************************************************************************/
  22. #ifndef _STEREOMATCHING_H
  23. #define _STEREOMATCHING_H
  24. #include "stereobuffer.h"
  25. #include "datastructures.h"
  26. #include "reconst3d.h"
  27. // ********************************************************************
  28. // ********************************************************************
  29. // StereoMatching: class encapsulating all the stereo estimation algos
  30. // ********************************************************************
  31. // ********************************************************************
  32. class StereoMatching {
  33. public:
  34. // constructor/destructor
  35. StereoMatching();
  36. ~StereoMatching();
  37. // processing data at one scale only or using multiple scale
  38. enum tScaleProcessing { MONOSCALE, MULTISCALE };
  39. // array of buffers corresponding to different scale levels
  40. StereoBuffer* sbuffer;
  41. // context definition: create all buffers for stereo processing
  42. void initializeContext();
  43. // destroy all buffers
  44. void destroyContext();
  45. // compute input images as given scale 'sc'
  46. void setInputImages(int sc, const uchar* iml8_bw,  const uchar* imr8_bw);
  47. void setInputImages(int sc, const uchar* iml8_bw,  const uchar* imr8_bw,
  48. const uchar* imt8_bw);
  49. // set/get image size
  50. void setInputImageSize(int w, int h);
  51. int getWidth() const;
  52. int getHeight() const; 
  53. // set threshold to set a pixel disparity as defined/undefined
  54. void setAcceptDisparityThreshold(const float newVal);
  55. float getAcceptDisparityThreshold() const;
  56. // set the number of scales
  57. void setNumScales (const int numscales);
  58. int getNumScales() const;
  59. // set the (log) scale (scale at which the stereo image is returned)
  60. // eg. if scale = n, the stereo image will be 2^n twice as small as the input images
  61. //     if scale = 0, the stereo and input images will have same size
  62. void setScale (const int scale);
  63. int getScale() const;
  64. // for monoscale (standard) or multiscale
  65. void setScaleProcessing(tScaleProcessing sprocessing);
  66. tScaleProcessing getScaleProcessing(void) const;
  67. // set horopter
  68. void setHoropter (const int horopt);
  69. int getHoropter() const;
  70. // set the range of disp to look for ... from 8 to 64 (step. 8)
  71. void setNumDepth (const int nDepth);
  72. int getNumDepth() const;
  73. // set correlation window size from 5 to 17
  74. void setCorrelationWindowSize(const int hmaskX, const int hmaskY);
  75. int getCorrelationWindowSizeX() const;
  76. int getCorrelationWindowSizeY() const;
  77. // *****************************************************
  78. // doStereo: performs stereo using 2 or 3 images
  79. // input:
  80. // - leftImage, rightImage, (topImage): arrays of unsigned char containing the
  81. //   intensity (grayscale) values of an image
  82. // output:
  83. // - simage: a pointer on a StereoImage structure containing the stereo information
  84. void doStereo(StereoImage* simage, 
  85.   const unsigned char* leftImage, const unsigned char* rightImage, 
  86.   const unsigned char* topImage = NULL);
  87. // -------- monoscale algorithm
  88. // performs stereo at a given scale
  89. void doStereo_fixedScale(StereoImage* simage, int scale, const InputImages* inputImage);
  90. // -------- multiscale algorithm
  91. // assumes simageHigh and simageLow are 2 stereo images estimated at some consecutive scales
  92. void doStereo_multiscale(StereoImage* simage, 
  93.  const StereoImage* simageHigh, const StereoImage* simageLow, 
  94.  const unsigned char acceptNew);
  95. // -------- perform sub-pixel estimation -------- 
  96. void getList_subPixel(StereoImage* sdata, int scale, const StereoBuffer* sb = NULL);
  97. // check if (x,y,d) is a valid hypothesis
  98. bool checkValidity(short x, short y, unsigned char d, const char tol) const;
  99. private:
  100. int width, height; // input image size
  101. int horopter;    // translation to apply to left image
  102. int numScales;    
  103. int scale; // eg. scale = 2 -> disparity image twice as smaller as input images
  104. int nbDepth, maxNbDepth; // range to search disp.
  105. // type of processing (monoscale/multiscale)
  106. tScaleProcessing scaleProcessing;
  107. // parameters for the (SAD) stereo algorithm 
  108. int maskSizeX, maskSizeY; // sizes of SAD filter
  109. float peakValidationThreshold;
  110. // for sub-pixel estimation
  111. bool subPixelPerformed;
  112. float *scorePrev, *scoreInit, *scoreNext;
  113. float *scorePrev_origin, *scoreInit_origin, *scoreNext_origin;
  114. // internal input images
  115. InputImages* inputImages;
  116. void estimateStereo(const unsigned char* iml8_bw, const unsigned char* imr8_bw,  const unsigned char* imtop8_bw,
  117. int width, int height,
  118. int maskSizeX, int maskSizeY,  char minDiff, int nbDepth, int nbPartitions,
  119. StereoBuffer* sb, StereoImage* sdata);
  120. void estimateStereo_sse2(const unsigned char* iml8_bw, const unsigned char* imr8_bw,  const unsigned char* imtop8_bw,
  121. int width, int height,
  122. int maskSizeX, int maskSizeY,  char minDiff, int nbDepth, int nbPartitions,
  123. StereoBuffer* sb, StereoImage* sdata);
  124. void estimateStereo_Horiz(const unsigned char* iml8_bw, const unsigned char* imr8_bw, 
  125. int width, int height,
  126. int maskSizeX, int maskSizeY,  char minDiff, int nbDepth, int nbPartitions,
  127. StereoBuffer* sb, StereoImage* sdata);
  128. void estimateStereo_Horiz_mmx(const unsigned char* iml8_bw, const unsigned char* imr8_bw, 
  129. int width, int height,
  130. int maskSizeX, int maskSizeY,  char minDiff, int nbDepth, int nbPartitions,
  131. StereoBuffer* sb, StereoImage* sdata);
  132. /// estimate subpixel disparities 'd' on a list of 'nbPoints' image points (x,y)
  133. void getList_subPixel(const short* x, const short* y,  float* subpixel_depth_list, int nbPoints, 
  134.   const StereoBuffer* sb, unsigned char* imDepth, int scale);
  135. // -------- region growing algo -------- 
  136. // iterative region growing algorithm: 
  137. // - mode (algo)  {0,1}
  138. // - acceptNew threshold to accept a previously undefined pixel as defined
  139. // - nbIterations nb iteration of the algo 
  140. // - imDisp_start contains the initial disp image to start with
  141. // if not given, the internal disp. image is used as starting image
  142. void doStereo_grow(StereoImage* simage, int mode, const unsigned char acceptNew, int nbIteration);
  143. // return the diff. between best corr. score and the associated with (x,y,d) ... return -1 if not in the image
  144. short checkValidity_error(short x, short y, unsigned char d, const char tol) const;
  145. };
  146. #endif