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

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, int  xOffset, int  yOffset, const uchar* iml8_bw,  const uchar* imr8_bw);
  47. void setInputImages(int sc, int  xOffset, int  yOffset, 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. void setLeftImageXOffset(int x);
  71. void setLeftImageYOffset(int y);
  72. int getLeftImageXOffset() const;
  73. int getLeftImageYOffset() const;
  74. // set the range of disp to look for ... from 8 to 64 (step. 8)
  75. void setNumDepth (const int nDepth);
  76. int getNumDepth() const;
  77. // set correlation window size from 5 to 17
  78. void setCorrelationWindowSize(const int hmaskX, const int hmaskY);
  79. int getCorrelationWindowSizeX() const;
  80. int getCorrelationWindowSizeY() const;
  81. // *****************************************************
  82. // doStereo: performs stereo using 2 or 3 images
  83. // input:
  84. // - leftImage, rightImage, (topImage): arrays of unsigned char containing the
  85. //   intensity (grayscale) values of an image
  86. // output:
  87. // - simage: a pointer on a StereoImage structure containing the stereo information
  88. void doStereo(StereoImage* simage, 
  89.   const unsigned char* leftImage, const unsigned char* rightImage, 
  90.   const unsigned char* topImage = NULL);
  91. // -------- monoscale algorithm
  92. // performs stereo at a given scale
  93. void doStereo_fixedScale(StereoImage* simage, int scale, const InputImages* inputImage);
  94. // -------- multiscale algorithm
  95. // assumes simageHigh and simageLow are 2 stereo images estimated at some consecutive scales
  96. void doStereo_multiscale(StereoImage* simage, 
  97.  const StereoImage* simageHigh, const StereoImage* simageLow, 
  98.  const unsigned char acceptNew);
  99. // -------- perform sub-pixel estimation -------- 
  100. void getList_subPixel(StereoImage* sdata, int scale, const StereoBuffer* sb = NULL);
  101. // check if (x,y,d) is a valid hypothesis
  102. bool checkValidity(short x, short y, unsigned char d, const char tol) const;
  103. private:
  104. int width, height; // input image size
  105. int horopter;    // translation to apply to left image
  106. int numScales;    
  107. int scale; // eg. scale = 2 -> disparity image twice as smaller as input images
  108. int nbDepth, maxNbDepth; // range to search disp.
  109. int leftImageXOffset; // x-offset to apply to left image
  110. int leftImageYOffset; // y-offset to apply to left image
  111. // type of processing (monoscale/multiscale)
  112. tScaleProcessing scaleProcessing;
  113. // parameters for the (SAD) stereo algorithm 
  114. int maskSizeX, maskSizeY; // sizes of SAD filter
  115. float peakValidationThreshold;
  116. // for sub-pixel estimation
  117. bool subPixelPerformed;
  118. float *scorePrev, *scoreInit, *scoreNext;
  119. float *scorePrev_origin, *scoreInit_origin, *scoreNext_origin;
  120. // internal input images
  121. InputImages* inputImages;
  122. void estimateStereo(const unsigned char* iml8_bw, const unsigned char* imr8_bw,  const unsigned char* imtop8_bw,
  123. int width, int height,
  124. int maskSizeX, int maskSizeY,  char minDiff, int nbDepth, int nbPartitions,
  125. StereoBuffer* sb, StereoImage* sdata);
  126. void estimateStereo_sse2(const unsigned char* iml8_bw, const unsigned char* imr8_bw,  const unsigned char* imtop8_bw,
  127. int width, int height,
  128. int maskSizeX, int maskSizeY,  char minDiff, int nbDepth, int nbPartitions,
  129. StereoBuffer* sb, StereoImage* sdata);
  130. void estimateStereo_Horiz(const unsigned char* iml8_bw, const unsigned char* imr8_bw, 
  131. int width, int height,
  132. int maskSizeX, int maskSizeY,  char minDiff, int nbDepth, int nbPartitions,
  133. StereoBuffer* sb, StereoImage* sdata);
  134. void estimateStereo_Horiz_mmx(const unsigned char* iml8_bw, const unsigned char* imr8_bw, 
  135. int width, int height,
  136. int maskSizeX, int maskSizeY,  char minDiff, int nbDepth, int nbPartitions,
  137. StereoBuffer* sb, StereoImage* sdata);
  138. /// estimate subpixel disparities 'd' on a list of 'nbPoints' image points (x,y)
  139. void getList_subPixel(const short* x, const short* y,  float* subpixel_depth_list, int nbPoints, 
  140.   const StereoBuffer* sb, unsigned char* imDepth, int scale);
  141. // -------- region growing algo -------- 
  142. // iterative region growing algorithm: 
  143. // - mode (algo)  {0,1}
  144. // - acceptNew threshold to accept a previously undefined pixel as defined
  145. // - nbIterations nb iteration of the algo 
  146. // - imDisp_start contains the initial disp image to start with
  147. // if not given, the internal disp. image is used as starting image
  148. void doStereo_grow(StereoImage* simage, int mode, const unsigned char acceptNew, int nbIteration);
  149. // return the diff. between best corr. score and the associated with (x,y,d) ... return -1 if not in the image
  150. short checkValidity_error(short x, short y, unsigned char d, const char tol) const;
  151. };
  152. #endif