processingMMX.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 _PROCESSING_MMX_H
  23. #define _PROCESSING_MMX_H
  24. typedef unsigned char uchar;
  25. typedef unsigned short ushort;
  26. // translate image of 'tx' pixels to the right
  27. // (or left if tx<0)
  28. inline void translateImage(int tx, uchar* data1, int siz);
  29. // normalize intensities in images
  30. inline void normalizeImages(uchar* data1, uchar* data2, uchar* data3, int siz);
  31. inline void normalizeImages(uchar* data1, uchar* data, int siz);
  32. inline void normalizeImages(const uchar* data1, const uchar* data2, const uchar* data3, 
  33. uchar* out1, uchar* out2, uchar* out3, int siz);
  34. inline void normalizeImages(const uchar* data1, const uchar* data2, 
  35. uchar* out1, uchar* out2, int siz);
  36. // shrink images by a factor 'fact'. eg if fact = 2, out will be twice as small as src
  37. inline void shrinkImages(uchar* dst, const uchar* src, int width, int height, int fact);
  38. //  ImgSub2: D = saturation0(|S1 - S2| + |S1 - S3|)
  39. inline int ImgSubandAdd(const uchar *Src1, const uchar *Src2, 
  40.  const uchar *Src3, uchar *Dest, int l);
  41. // int ImgSubandAdd_sse2(const uchar *Src1, const uchar *Src2, const uchar *Src3, uchar *Dest, int l);
  42. inline int ImgSubandAdd(const uchar *Src1, const uchar *Src2, 
  43.  uchar *Dest, int l);
  44. inline int ImgSubandAdd2(const uchar *Src1, const uchar *Src2, 
  45.  const uchar *Src3, uchar* Dest1, int l, int imageSize, int width);
  46. inline int ImgSubandAdd2_Vert(const uchar *Src1, const uchar *Src2, 
  47.  uchar* Dest1,
  48.  int l, int imageSize, int width);
  49. inline int ImgSubandAdd_Horiz(const uchar *Src1, const uchar *Src3, uchar* Dest1,
  50.  int l, int imageSize, int width);
  51. // ---------------------
  52. // init BestCorrelation and SecondCOrrelation with CurrentCorrelation
  53. // init Disparity with disparityInit
  54. inline int initMinimumCorrelation(const uchar *CurrentCorrelation, uchar disparityInit, uchar *Disparity,
  55.    uchar *BestCorrelation,  uchar *SecondCorrelation, int bytecount);
  56. // ----------------------
  57. // FULL IMAGE, BEST ONLY : Keith's code
  58. inline int findMinimumCorrelation_mmx(const uchar *CurrentCorrelation, uchar CurrentDisparity, uchar *Disparity,
  59. uchar *BestCorrelation, int bytecount) ;
  60. // ----------------------
  61. // FULL IMAGE, BEST+SECOND : Keith's code
  62. inline int findMinimumCorrelation_mmx( const uchar *CurrentCorrelation, uchar CurrentDisparity, uchar *Disparity,
  63. uchar *BestCorrelation, uchar *SecondCorrelation, int bytecount);
  64. // ------------------------ image filters -------------------------------
  65. inline void sum_5x5_mmx(uchar* im, ushort* im_out, int dataSize, int width, ushort* buff);
  66. inline void sum_5x5_mmx(uchar* im, uchar* im_out, int dataSize, int width, ushort* buff);
  67. // ------- row filters -------
  68.  template<class T> void sum_Row_5(T* im, ushort* im_out, int rowSize);
  69.  inline void sum_Row_mmx(uchar* im, ushort* im_out, int rowSize, int maskSize);
  70.  inline void sum_Row_mmx(ushort* im, ushort* im_out, int rowSize, int maskSize) ;
  71.  inline void sum_Row_5_mmx(uchar* im, ushort* im_out, int rowSize);
  72.  inline void sum_Row_5_mmx(ushort* im, ushort* im_out, int rowSize);
  73. // ------- cols filters -------
  74.  inline void avg_Col(ushort* im, uchar* im_out, int dataSize, int width, int sizeMask);
  75.  inline void avg_Col_mmx(ushort* im, uchar* im_out, int dataSize, int width, int sizeMask);
  76.  inline void avg_Col_sse2(ushort* im, uchar* im_out, int dataSize, int width, int sizeMask);
  77.  inline void avg_Col_5(ushort* im, uchar* im_out, int dataSize, int width);
  78.  inline void avg_Col_7(ushort* im, uchar* im_out, int dataSize, int width);
  79.  inline void avg_Col_9(ushort* im, uchar* im_out, int dataSize, int width);
  80.  inline void avg_Col_11(ushort* im, uchar* im_out, int dataSize, int width);
  81.  inline void avg_Col_13(ushort* im, uchar* im_out, int dataSize, int width);
  82.  inline void avg_Col_15(ushort* im, uchar* im_out, int dataSize, int width);
  83.  inline void avg_Col_17(ushort* im, uchar* im_out, int dataSize, int width);
  84. inline void add_Col_5_wb(ushort* im, uchar* im_out, int dataSize, int width);
  85. inline void add_Col_5_ww(ushort* im, ushort* im_out, int dataSize, int width);
  86. // ------- cols filters -------
  87. inline void avg_Col_5_sse2(ushort* im, uchar* im_out, int dataSize, int width);
  88. inline void avg_Col_7_sse2(ushort* im, uchar* im_out, int dataSize, int width);
  89. inline void avg_Col_9_sse2(ushort* im, uchar* im_out, int dataSize, int width);
  90. inline void avg_Col_11_sse2(ushort* im, uchar* im_out, int dataSize, int width);
  91. inline void avg_Col_13_sse2(ushort* im, uchar* im_out, int dataSize, int width);
  92. // return the average pixel value
  93. inline float pixelMean(const uchar* im, int imageSize);
  94. // check that the diff. between best and second disp. scores in great enough
  95. inline void compareBestAndSecond(uchar* bestScores, uchar* secondScores, char thresh, 
  96.  uchar valForReplacement, 
  97.  uchar* disp, int dataSize);
  98. // image copy 
  99. // windowWidth must be multiple of 8
  100. inline void cropImage(const uchar* imSrc, int width, int height, 
  101.    uchar* imDest, int x0, int y0, int windowWidth, int windowHeight);
  102. // apply mask:  if mask[]==undefined_val im[]->im[]
  103. //  otherwise im[]->mask[]
  104. inline void overrideImage(uchar* im, const uchar* mask, uchar undefined_val, int imageSize);
  105. inline void overrideImageMMX(uchar* im, const uchar* mask, uchar undefined_val, int imageSize);
  106. inline void copyMMX(void* imDest, const void* imSrc, int dataSize);
  107. inline void copySSE(void* imDest, const void* imSrc, int dataSize);
  108. inline void setMMX(float* imDest, const float value, int dataSize);
  109. inline void setMMX(char* imDest, const char value, int dataSize);
  110. // multiply im. by a constant 'fact'
  111. inline void multiply(uchar* im, float fact, int imageSize);
  112. inline void multiply(const uchar* imSrc, uchar* imDest, float fact, int imageSize);
  113. inline void divide(ushort* im,  uchar* div, uchar* result, int imageSize);
  114. inline void binarize(uchar* im, uchar* im_out, uchar undefined_val, int dataSize);
  115. inline void set_undefined_to_zero(uchar* im, uchar* im_out, uchar undefined_val, int dataSize);
  116. inline void set_zero_to_undefined(uchar* im, uchar* im_out, uchar undefined_val, int dataSize);
  117. // check depth validity
  118. void checkDisparityValidity(uchar* disp, uchar* buff, int buffStep, 
  119. uchar* bestScore, uchar tol, 
  120. uchar undefined_val, uchar nbDepth, 
  121. int imageSize);
  122. void checkDisparityValidityAndSearchAround(uchar* disp, uchar* buff, int buffStep, 
  123. uchar* bestScore, uchar tol, 
  124. uchar undefined_val, uchar nbDepth, 
  125. int imageSize);
  126. // 3D reconst
  127. //void createIdxValidPixelsList(const uchar* depth_image, int* idx_valid_pixels, int& nbPoints, int siz, int UNDEFINED_DEPTH);
  128. #include "processingMMX.inl"
  129. #include "processingSSE2.inl"
  130. #endif