datastructures.cpp
上传用户: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. #include "stdafx.h"
  23. #include "datastructures.h"
  24. #include "processingmmx.h"
  25. #include <iostream>
  26. #include <fstream>
  27. using namespace std;
  28. #define ALLOC_ALIGN_MEMORY(X, X_origin, type, size) (X_origin)=((type*)malloc((size)*sizeof(type)+127)); (X) = (type*)((((unsigned int)(X_origin))+127) & (~127));
  29. #define DELETENULL(object) if (object) {delete object;object = NULL;}
  30. #define FREENULL(object) if (object) {free(object); object = NULL;}
  31. typedef unsigned char uchar;
  32. typedef unsigned short ushort;
  33. #ifdef _DEBUG
  34. #define new DEBUG_NEW
  35. #undef THIS_FILE
  36. static char THIS_FILE[] = __FILE__;
  37. #endif
  38. // ******************************************************************
  39. // ******************************************************************
  40. StereoImage::StereoImage()
  41. {
  42. UNDEFINED_DEPTH = 0;
  43. width = 0;
  44. height = 0;
  45. imDepth8u_origin = NULL;
  46. imDepth32f_origin = NULL;
  47. depth_float_list_origin = NULL; 
  48. valid_pixels_origin = NULL;
  49. x_origin = NULL;
  50. y_origin = NULL;
  51. }
  52. StereoImage::~StereoImage()
  53. {
  54. deAlloc();
  55. }
  56. void StereoImage::alloc(int w, int h)
  57. {
  58. deAlloc();
  59. width = w;
  60. height = h;
  61. ALLOC_ALIGN_MEMORY(imDepth8u, imDepth8u_origin, uchar, w*h);
  62. ALLOC_ALIGN_MEMORY(imDepth32f, imDepth32f_origin, float, w*h);
  63. ALLOC_ALIGN_MEMORY(depth_float_list, depth_float_list_origin, float, w*h);
  64. ALLOC_ALIGN_MEMORY(valid_pixels, valid_pixels_origin, int, w*h);
  65. ALLOC_ALIGN_MEMORY(x, x_origin, short, w*h);
  66. ALLOC_ALIGN_MEMORY(y, y_origin, short, w*h);
  67. // set (x,y) images (pixel value containing the coordinate of the pixel itself)
  68. short *ptx = x, *pty = y;
  69. for (int i=0; i<width; ++i) {
  70. for (int j=0; j<height; ++j, ++ptx,++pty) {
  71. *ptx = i; *pty = j;
  72. }
  73. }
  74. }
  75. void StereoImage::Reset(void)
  76. {
  77. }
  78. // set the left and right hand pixels of the disparity image as undefined
  79. // (they have been wrongly estimated)
  80. void StereoImage::setUndefinedBorders(int leftMargin, int rightMargin)
  81. {
  82. for (int j=0; j<height; ++j) {
  83. // left border
  84. uchar* ptd = imDepth8u + j*width;
  85. for (int i=0; i<leftMargin; ++i,++ptd) *ptd = UNDEFINED_DEPTH;
  86. // right border
  87. ptd = imDepth8u + j*width + (width-rightMargin);
  88. for (int i=0; i<rightMargin; ++i,++ptd) *ptd = UNDEFINED_DEPTH;
  89. }
  90. }
  91. void StereoImage::setUndefinedDepthValue(const uchar undefined_val)
  92. {
  93. UNDEFINED_DEPTH = undefined_val ;
  94. }
  95. void StereoImage::deAlloc()
  96. {
  97. FREENULL(imDepth8u_origin); 
  98. FREENULL(imDepth32f_origin); 
  99. FREENULL(depth_float_list_origin); 
  100. FREENULL(valid_pixels_origin);
  101. FREENULL(x_origin);
  102. FREENULL(y_origin);
  103. }
  104. void StereoImage::createValidPixelsList(int topmargin)
  105. {
  106. int siz = width*height;
  107. const uchar *ptIm = imDepth8u + topmargin*width;
  108. int* ptValid = valid_pixels;
  109. short* ptx = x, *pty = y;
  110. m_nGood3DPoints=0;
  111. for (int i=topmargin*width; i<siz-topmargin*width; ++i, ++ptIm) {
  112. if (*ptIm != UNDEFINED_DEPTH) {
  113. *ptValid = i;
  114. *ptx = i%width;
  115. *pty = i/width;
  116. ++ptx; ++pty;
  117. ++ptValid;
  118. ++m_nGood3DPoints;
  119. }
  120. }
  121. }
  122. void StereoImage::generateDepth32f()
  123. {
  124. // build imDepth32f from x, y, depth_float_list and m_nGood3DPoints
  125. memset(imDepth32f, 0, sizeof(float)*width*height);
  126. short* ptx = x;
  127. short* pty = y;
  128. float * d = depth_float_list;
  129. for (int i=0; i<m_nGood3DPoints; ++i,++ptx,++pty,++d) {
  130. int idx = *ptx + width*(*pty);
  131. *(imDepth32f+idx) = *d;
  132. }
  133. }
  134. void StereoImage::generateDepth8uFromDepth32f()
  135. {
  136. unsigned char* ptDepth8u_new = imDepth8u;
  137. float* ptDepth32f_new = imDepth32f;
  138. for (int i=0; i<height*width; ++i,++ptDepth8u_new,++ptDepth32f_new) {
  139. *ptDepth8u_new = (unsigned char)(*ptDepth32f_new+0.5f);
  140. }
  141. }
  142. // ******************************************************************
  143. // ******************************************************************
  144. InputImages::InputImages()
  145. {
  146. subIm_l_origin = subIm_r_origin = subIm_t_origin = NULL; 
  147. }
  148. InputImages::~InputImages()
  149. {
  150. }
  151. void InputImages::alloc(int width, int height, int extra_margin)
  152. {
  153. // allocation
  154. ALLOC_ALIGN_MEMORY(subIm_l, subIm_l_origin, uchar, (width+extra_margin)*height );
  155. ALLOC_ALIGN_MEMORY(subIm_r, subIm_r_origin, uchar, width*height);
  156. ALLOC_ALIGN_MEMORY(subIm_t, subIm_t_origin, uchar, width*(height+extra_margin) );
  157. setMMX((char*) subIm_l, 0, (width+extra_margin)*height );
  158. setMMX((char*) subIm_r, 0, width*height);
  159. setMMX((char*) subIm_t, 0, width*(height+extra_margin) );
  160. }
  161. void InputImages::deAlloc()
  162. {
  163. FREENULL(subIm_l_origin); 
  164. FREENULL(subIm_r_origin); 
  165. FREENULL(subIm_t_origin); 
  166. }
  167. // ******************************************************************
  168. // ******************************************************************
  169. ReconstPoints3D::ReconstPoints3D()
  170. {
  171. m_fExtentMinX = 0.0f;
  172. m_fExtentMaxX = 0.0f;
  173. m_fExtentMinY = 0.0f;
  174. m_fExtentMaxY = 0.0f;
  175. m_fExtentMinZ = 0.0f;
  176. m_fExtentMaxZ = 0.0f;
  177. m_p3DPointsX_origin = NULL;
  178. m_p3DPointsY_origin = NULL;
  179. m_p3DPointsZ_origin = NULL;
  180. m_p3DPointsC = NULL;
  181. m_p3DPointsS = NULL;
  182. m_nGood3DPoints = 0;
  183. }
  184. ReconstPoints3D::~ReconstPoints3D()
  185. {
  186. FreeMemoryBuffers();
  187. }
  188. void ReconstPoints3D::alloc(int N)
  189. {
  190. // 3D reconstructions
  191. ALLOC_ALIGN_MEMORY(m_p3DPointsX, m_p3DPointsX_origin, float, N);
  192. ALLOC_ALIGN_MEMORY(m_p3DPointsY, m_p3DPointsY_origin, float, N);
  193. ALLOC_ALIGN_MEMORY(m_p3DPointsZ, m_p3DPointsZ_origin, float, N);
  194. //m_p3DPointsC = new Color[N];
  195. m_p3DPointsC = new uchar[N*4];
  196. m_p3DPointsS = new float[N];
  197. }
  198. void ReconstPoints3D::FreeMemoryBuffers(void)
  199. {
  200. FREENULL(m_p3DPointsX_origin);
  201. FREENULL(m_p3DPointsY_origin);
  202. FREENULL(m_p3DPointsZ_origin);
  203. if(m_p3DPointsC)
  204. delete [] m_p3DPointsC;
  205. if(m_p3DPointsS)
  206. delete [] m_p3DPointsS;
  207. }
  208. int ReconstPoints3D::load(char* filename)
  209. {
  210. ifstream file(filename, ios::in);   
  211. if (!file) {
  212. return 0;
  213. }
  214. // read num. of points
  215. file >> m_nGood3DPoints;
  216. alloc(m_nGood3DPoints);
  217. // read points coo3D
  218. float* ptX=m_p3DPointsX, *ptY=m_p3DPointsY, *ptZ=m_p3DPointsZ;
  219. while (!file.eof()) {
  220. file >> *ptX;
  221. file >> *ptY;
  222. file >> *ptZ;
  223. ++ptX; ++ptY; ++ptZ;
  224. }
  225. return 1;
  226. }
  227. int ReconstPoints3D::save(char* filename)
  228. {
  229. ofstream file(filename, ios::out);   
  230. if (file.fail()) return 0;
  231. file << m_nGood3DPoints << endl;//" " << width << " " << height << endl;
  232. float* ptX=m_p3DPointsX, *ptY=m_p3DPointsY, *ptZ=m_p3DPointsZ;
  233. for (int i=0; i<(int)m_nGood3DPoints; ++i, ++ptX,++ptY,++ptZ) {
  234. file << *ptX << " " << *ptY << " " << *ptZ << " ";
  235. }
  236. return 1;
  237. }
  238. float* ReconstPoints3D::getXlist() const
  239. {
  240. return m_p3DPointsX;
  241. }
  242. float* ReconstPoints3D::getYlist() const
  243. {
  244. return m_p3DPointsY;
  245. }
  246. float* ReconstPoints3D::getZlist() const
  247. {
  248. return m_p3DPointsZ;
  249. }
  250. unsigned char* ReconstPoints3D::getARGBlist() const
  251. {
  252. return m_p3DPointsC;
  253. }
  254. float* ReconstPoints3D::getPointSizelist() const
  255. {
  256. return m_p3DPointsS;
  257. }
  258. int ReconstPoints3D::getNumPoints() const
  259. {
  260. return m_nGood3DPoints;
  261. }
  262. // return 3 images containing X,Y and Z values
  263. void ReconstPoints3D::getImages_3D(float* X_im, float* Y_im, float* Z_im, const int* valid_pixels)
  264. {
  265. }