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

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. #include "stdafx.h"
  23. #include "stereoMatching.h"
  24. #include "processingMMX.h"
  25. // ************************************************************
  26. // ************************************************************
  27. // *** List of functions for image processing
  28. // ************************************************************
  29. // ************************************************************
  30. #ifdef _DEBUG
  31. #define new DEBUG_NEW
  32. #undef THIS_FILE
  33. static char THIS_FILE[] = __FILE__;
  34. #endif
  35. // ---------------------------------------------------------------
  36. // check if the disparities correspond to 'acceptable' values of
  37. void checkDisparityValidity(uchar* disp, uchar* buff, int buffStep, 
  38. uchar* bestScore, uchar tol, 
  39. uchar undefined_val, uchar nbDepth, int imageSize)
  40. {
  41. uchar* ptDisp = disp, *ptBuff=buff, *ptBestScore = bestScore;
  42. for (int i=0; i<imageSize; ++i,++ptDisp,++ptBuff,++ptBestScore)
  43. {
  44. uchar d=*ptDisp;
  45. if (d!=undefined_val && d>=0 && d<nbDepth ) 
  46. {
  47. uchar* ptBuffToCheck=ptBuff+d*buffStep; // points to the score associated with d
  48. if (*ptBuffToCheck >= *ptBestScore + tol)  *ptDisp=0;
  49. }
  50. }
  51. }
  52. // ---------------------------------------------------------------
  53. // check if the disparities correspond to 'acceptable' values of
  54. void checkDisparityValidityAndSearchAround(uchar* disp, uchar* buff, int buffStep, 
  55. uchar* bestScore, uchar tol, 
  56. uchar undefined_val, uchar nbDepth, int imageSize)
  57. {
  58. float score_prevDisp, score_nextDisp, minScore;
  59. bool test;
  60. uchar* ptDisp = disp, *ptBuff=buff, *ptBestScore = bestScore;
  61. for (int i=0; i<imageSize; ++i,++ptDisp,++ptBuff,++ptBestScore)
  62. {
  63. uchar d=*ptDisp;
  64. if (d!=undefined_val && d>0 && d<nbDepth-1 ) {
  65. uchar* ptBuffToCheck=ptBuff+d*buffStep; // points to the score associated with d
  66. int thresh = *ptBestScore + tol;
  67. if (*ptBuffToCheck >= thresh) 
  68. {
  69. // pixel not valid
  70. score_prevDisp = *(ptBuffToCheck-buffStep) ;
  71. score_nextDisp = *(ptBuffToCheck+buffStep) ;
  72. test = (score_prevDisp < score_nextDisp);
  73. minScore = (test)?score_prevDisp:score_nextDisp;
  74. if (minScore > thresh) 
  75. *ptDisp=0;
  76. else
  77. {
  78. if (test) 
  79. --(*ptDisp); 
  80. else 
  81. ++(*ptDisp);
  82. }
  83. }
  84. }
  85. }
  86. }
  87. #define _ABS_DIFF_TRI_320_240(width,sizeImage,Z) __asm 
  88. __asm movq mm4,mm1 /* mm4=mm1 */ 
  89. __asm por mm3,mm7 /* here mm2=new src2 mm3=new src3 */ 
  90. __asm movq mm7, mm0 
  91. __asm psubusb mm4,mm2 /* mm4 = src1 - src2 */ 
  92. __asm psubusb mm2,mm1 /* mm2 = src2 - src1 */ 
  93. __asm psllq mm7,Z
  94. __asm movq mm5,mm1 /* mm5=src1 */ 
  95. __asm por mm4,mm2 /* mm2=|src1-src2| */ 
  96. __asm movq mm2,[ebx + width] /* mm2= src2 + 'width' = new src2*/ 
  97. __asm psubusb mm5,mm3 /* mm5=src1-src3*/ 
  98. __asm movq mm6,mm3 /* mm6=src3*/ 
  99.     __asm   psubusb mm6,mm1   /* mm3=src3-src1*/ 
  100. __asm por mm6,mm5 /* mm6=|src1-src3|*/ 
  101. __asm paddusb mm4,mm6 /* mm4 = |src1-src2|+|src1-src3|*/ 
  102. __asm movq    [edi+sizeImage], mm4  /* here mm1=src1*/  
  103. __asm psrlq mm3, 8 /* mm3 = src3 + '1' ... with [x00000000] at the end*/
  104. }
  105. //  ImgSubandAdd2: D = saturation0(|S1 - S2| + |S1 - S3|)
  106. // process 8 disparities at a time
  107. //
  108. // Src1: right
  109. // Src2: top
  110. // Src3: left
  111. //
  112. // TODO? divide the result by 2 (shift)
  113. int ImgSubandAdd2_320_240(const unsigned char *Src1, const unsigned char *Src2, 
  114.  const unsigned char *Src3, 
  115.  unsigned char* Dest1, int l)
  116. {
  117. if (l < 8) return 0;              // image size must be at least 8 bytes 
  118.   __asm 
  119.   {
  120.         mov eax, Src1     
  121.         mov ebx, Src2
  122. mov edx, Src3
  123.         mov edi, Dest1   
  124.         mov ecx, l   
  125.         shr ecx, 3
  126. movq mm0,[edx] // mm0=src3
  127. movq mm0,[edx] // mm0=src3
  128. align 16
  129. inner_loop:
  130. // mov esi, width
  131. movq mm1,[eax] // mm1=src1
  132. movq mm3,mm0 // mm3=src3
  133. movq mm2,[ebx] // mm2=src2
  134.         add eax,8         
  135.  
  136. // -- 1 --------- in : mm1,mm2,mm3     out: mm4=SAD  mm2=new mm2 --
  137. movq mm4,mm1 // mm4=mm1
  138. psubusb mm4,mm2 // mm4 = src1 - src2
  139. movq mm0,[edx+8]
  140. psubusb mm2,mm1 // mm2 = src2 - src1
  141.         
  142. movq mm5,mm1 // mm5=src1
  143. por mm4,mm2 // mm2=|src1-src2|
  144. movq mm2,[ebx+320] // mm2= src2 + 'width' = new src2
  145. psubusb mm5,mm3 // mm5=src1-src3
  146. movq mm6,mm3 // mm6=src3
  147.         psubusb mm6,mm1   // mm3=src3-src1
  148. movq mm7, mm0
  149. psrlq mm3, 8 // mm3 = src3 + '1' ... with [x00000000] at the end
  150. por mm6,mm5 // mm6=|src1-src3|
  151. paddusb mm4,mm6 // mm4 = |src1-src2|+|src1-src3|
  152.         movq    [edi], mm4  
  153. psllq mm7, 56 // here mm1=src1 mm2=NEW src2 mm3=begin of NEWsrc3    mm7=end of NEWsrc3
  154. // -------------------------------------------------------------
  155. // - 2 ----------------
  156. _ABS_DIFF_TRI_320_240(640,320*240,48)
  157.   // - 3 ----------------
  158. _ABS_DIFF_TRI_320_240(960,2*320*240,40)
  159.   // - 4 ----------------
  160. _ABS_DIFF_TRI_320_240(1280,3*320*240,32)
  161. // - 5 ----------------
  162. _ABS_DIFF_TRI_320_240(1600,4*320*240,24)
  163. // - 6 ----------------
  164. _ABS_DIFF_TRI_320_240(1920,5*320*240,16)
  165. // - 7 ----------------
  166. _ABS_DIFF_TRI_320_240(2240,6*320*240,8)
  167. // - 8 ----------------
  168. movq mm4,mm1 // mm4=mm1
  169. por mm3,mm7 // here mm2=new src2 mm3=new src3
  170. psubusb mm4,mm2 // mm4 = src1 - src2
  171. psubusb mm2,mm1 // mm2 = src2 - src1
  172.         
  173. movq mm5,mm1 // mm5=src1
  174. por mm4,mm2 // mm2=|src1-src2|
  175. psubusb mm5,mm3 // mm5=src1-src3
  176.         psubusb mm3,mm1   // mm3=src3-src1
  177. por mm3,mm5 // mm6=|src1-src3|
  178. paddusb mm4,mm3 // mm4 = |src1-src2|+|src1-src3|
  179.         movq    [edi+2560], mm4  // here mm1=src1
  180. // -------------------------------------------------------------
  181.   // 
  182.         add ebx,8
  183.         add edx,8     
  184.         add edi,8
  185.         dec ecx      
  186.         jnz inner_loop    
  187.         emms   
  188.   }
  189.   return 1;
  190. }
  191. // macro: in: mm1,mm2
  192. #define _ABS_DIFF_HORIZ_16(Z) __asm 
  193. __asm  movq mm7, mm0 
  194. __asm  add edi, imageSize 
  195. __asm  movq mm5,mm1 /* mm5=src1 */ 
  196. __asm  psllq mm7, Z 
  197. __asm  psubusb mm5,mm3 /* mm5=src1-src3 */ 
  198. __asm  movq mm6,mm3 /* mm6=src3 */ 
  199.     __asm  psubusb mm6,mm1   /* mm3=src3-src1 */ 
  200. __asm  por mm6,mm5 /* mm6=|src1-src3| */ 
  201. __asm  psrlq mm3, 8 /* mm3 = src3 + '1' ... with [x00000000] at the end */ 
  202. __asm  por mm3,mm7 /* here mm3=new src3 */ 
  203. __asm  movq mm7, mm6 /* copy results to mm7 as well */ 
  204. __asm  pxor mm5, mm5  
  205. __asm  punpcklbw mm6, mm5 /* unpack mm6 */ 
  206.     __asm  movq    [edi], mm6  /* here mm1=src1 */ 
  207. __asm  punpckhbw mm7, mm5 /* unpack mm6 */ 
  208.     __asm  movq    [edi+8], mm7  /* here mm1=src1 */ 
  209. }
  210. //  ImgSubandAdd2: D = saturation0(|S1 - S2| + |S1 - S3|)
  211. // process 8 disparities at a time
  212. //
  213. // Src1: right
  214. // Src2: top
  215. // Src3: left
  216. //
  217. // TODO? divide the result by 2 (shift)
  218. int ImgSubandAdd2_Horiz_16(const unsigned char *rightIm, const unsigned char *leftIm, 
  219.    unsigned short* Dest, int l, int imageSize, int width)
  220. {
  221. if (l < 8) return 0;              // image size must be at least 8 bytes 
  222. const int back_step2 = 7*imageSize;
  223.   __asm 
  224.   {
  225.         mov eax, rightIm     
  226.   mov edx, leftIm
  227.         mov edi, Dest 
  228.         mov ecx, l   
  229.         shr ecx, 3
  230. movq mm0,[edx] // mm0=src3
  231. movq mm0,[edx] // mm0=src3
  232. align 16
  233. inner_loop:
  234. movq mm1,[eax] // mm1=src1
  235. movq mm3,mm0 // mm3=src3
  236. // -- 1 --------- in : mm1,mm2,mm3     out: mm4=SAD  mm2=new mm2 --
  237. movq mm0,[edx+8]
  238.         add eax,8         
  239.    
  240. movq mm5,mm1 // mm5=src1
  241. psubusb mm5,mm3 // mm5=src1-src3
  242. movq mm6,mm3 // mm6=src3
  243.         psubusb mm6,mm1   // mm3=src3-src1
  244. movq mm7, mm0
  245. psrlq mm3, 8 // mm3 = src3 + '1' ... with [x00000000] at the end
  246. por mm6,mm5 // mm6=|src1-src3|
  247. psllq mm7, 56 // here mm1=src1 mm3=begin of NEWsrc3    mm7=end of NEWsrc3
  248. por mm3,mm7 // here mm3=new src3
  249. // ------ new ---------
  250. movq mm7, mm6 // copy results to mm7 as well
  251. pxor mm5, mm5
  252. punpcklbw mm6, mm5 // unpack mm6
  253. movq    [edi], mm6  /* here mm1=src1 */ 
  254. punpckhbw mm7, mm5 // unpack mm6
  255. movq    [edi+8], mm7  /* here mm1=src1 */ 
  256. // - 2 ----------------
  257. _ABS_DIFF_HORIZ_16(48)
  258. _ABS_DIFF_HORIZ_16(40)
  259. _ABS_DIFF_HORIZ_16(32)
  260. _ABS_DIFF_HORIZ_16(24)
  261. _ABS_DIFF_HORIZ_16(16)
  262. _ABS_DIFF_HORIZ_16(8)
  263. // - 8 ----------------
  264. movq mm5,mm1 // mm5=src1
  265. add edi, imageSize
  266. psubusb mm5,mm3 // mm5=src1-src3
  267.         psubusb mm3,mm1   // mm3=src3-src1
  268. por mm3,mm5 // mm6=|src1-src3|
  269.         movq    [edi], mm3  
  270. // ------ new ---------
  271. movq mm7, mm3 // copy results to mm7 as well
  272. pxor mm5, mm5
  273. punpcklbw mm3, mm5 // unpack mm6
  274. movq    [edi], mm3  /* here mm1=src1 */ 
  275. punpckhbw mm7, mm5 // unpack mm6
  276. movq    [edi+8], mm7  /* here mm1=src1 */ 
  277. // -------------------------------------------------------------
  278.   // 
  279.         add edx,8     
  280. sub edi, back_step2
  281.         add edi,16
  282.         dec ecx      
  283.         jnz inner_loop    
  284.         emms   
  285.   }
  286.   return 1;
  287. }