main.cpp
上传用户:liuping58
上传日期:2022-06-05
资源大小:105k
文件大小:8k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <float.h>
  5. #include <GL/glew.h>
  6. #include <cuda_runtime.h>
  7. #include <cutil.h>
  8. #include <math.h>
  9. #include <GL/glut.h>
  10. #define IMAGE "bigbrain.bmp"
  11. #define MASK "bigmask.bmp"
  12. #define ITERATIONS   5000
  13. #define THRESHOLD  170
  14. #define EPSILON  35
  15. #define ALPHA  0.009
  16. #define DT  0.25
  17. #define RITS  50
  18. float *phi, *phi1, *D, *contour;
  19. uchar4 *h_Src, *h_Mask;
  20. int imageW, imageH, N;
  21. void LoadBMPFile(uchar4 **dst, int *width, int *height, const char *name);
  22. void sedt2d(int *_d,unsigned char *_bimg,int _h,int _w);
  23. int its=0;
  24. unsigned int Timer = 0;
  25. unsigned int ReInitTimer = 0;
  26. int r;
  27. int c;
  28. int i;
  29. void init_phi(){
  30. int *init;
  31. unsigned char *mask;
  32. const char *mask_path = MASK;
  33. if((init=(int *)malloc(imageW*imageH*sizeof(int)))==NULL)printf("ME_INITn");
  34. if((phi=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_PHIn");
  35. mask = (unsigned char *)malloc(imageW*imageH*sizeof(unsigned char));
  36. //printf("Init Maskn");
  37. LoadBMPFile(&h_Mask, &imageW, &imageH, mask_path);
  38. for(r=0;r<imageH;r++){
  39. for(c=0;c<imageW;c++){
  40. mask[r*imageW+c] = (h_Mask[r*imageW+c].x)/255;
  41. //printf("%3d ", mask[r*imageW+c]);
  42. }
  43. //printf("n");
  44. }
  45. sedt2d(init,mask,imageH,imageW);
  46. //printf("sdf of init maskn");
  47. for(r=0;r<imageH;r++){
  48. for(c=0;c<imageW;c++){
  49. phi[r*imageW+c]=(float)init[r*imageW+c];
  50. if(phi[r*imageW+c]>0){
  51. phi[r*imageW+c]=0.5*sqrt(abs(phi[r*imageW+c]));
  52. } else {
  53. phi[r*imageW+c]=-0.5*sqrt(abs(phi[r*imageW+c]));
  54. }
  55. //printf("%6.3f ", phi[r*imageW+c]);
  56. }
  57. //printf("n");
  58. }
  59. free(init);
  60. free(mask);
  61. }
  62. void reinit_phi(){
  63. int *intphi;
  64. unsigned char *reinit;
  65. if((intphi=(int *)malloc(imageW*imageH*sizeof(int)))==NULL)printf("ME_INITn");
  66. reinit=(unsigned char *)malloc(imageW*imageH*sizeof(unsigned char));//TODO check
  67. for(i=0;i<N;i++){
  68. if(phi[i]<0){
  69. phi[i]=1;
  70. } else {
  71. phi[i]=0;
  72. }
  73. reinit[i]=(int)phi[i];
  74. }
  75. sedt2d(intphi,reinit,imageH,imageW);
  76. for(r=0;r<imageH;r++){
  77. for(c=0;c<imageW;c++){
  78. phi[r*imageW+c]=(float)intphi[r*imageW+c];
  79. if(phi[r*imageW+c]>0){
  80. phi[r*imageW+c]=0.5*sqrt(abs(phi[r*imageW+c]));
  81. } else {
  82. phi[r*imageW+c]=-0.5*sqrt(abs(phi[r*imageW+c]));
  83. }
  84. //printf("%6.3f ", phi[r*imageW+c]);
  85. }
  86. //printf("n");
  87. }
  88. free(reinit);
  89. free(intphi);
  90. }
  91. void update_phi(){
  92. float dx;
  93. float dxplus;
  94. float dxminus;
  95. float dxplusy;
  96. float dxminusy;
  97. float maxdxplus;
  98. float maxminusdxminus;
  99. float mindxplus;
  100. float minminusdxminus;
  101. float dy;
  102. float dyplus;
  103. float dyminus;
  104. float dyplusx;
  105. float dyminusx;
  106. float maxdyplus;
  107. float maxminusdyminus;
  108. float mindyplus;
  109. float minminusdyminus;
  110. float gradphimax;
  111. float gradphimin;
  112. float nplusx;
  113. float nplusy;
  114. float nminusx;
  115. float nminusy;
  116. float curvature;
  117. float F;
  118. float gradphi;
  119. int ind;
  120. for(i=0;i<N;i++){
  121. phi1[i]=phi[i];
  122. }
  123. for(r=0;r<imageH;r++){
  124. for(c=0;c<imageW;c++){
  125. ind=r*imageW+c;
  126. if(c==0||c==imageW-1){dx=0;} else {dx=(phi1[ind+1]-phi1[ind-1])/2;}
  127. if(c==imageW-1){dxplus=0;} else {dxplus=(phi1[ind+1]-phi1[ind]);}
  128. if(c==0){dxminus=0;} else {dxminus=(phi1[ind]-phi1[ind-1]);}
  129. if(r==0||c==0||c==imageW-1){dxplusy=0;} else {dxplusy=(phi1[ind-imageW+1]-phi1[ind-imageW-1])/2;}
  130. if(r==imageH-1||c==0||c==imageW-1){dxminusy=0;} else {dxminusy=(phi1[ind+imageW+1]-phi1[ind+imageW-1])/2;}
  131. if(dxplus<0){maxdxplus=0;} else { maxdxplus= dxplus*dxplus; }
  132. if(-dxminus<0){maxminusdxminus=0;} else { maxminusdxminus= dxminus*dxminus; }
  133. if(dxplus>0){mindxplus=0;} else { mindxplus= dxplus*dxplus; }
  134. if(-dxminus>0){minminusdxminus=0;} else { minminusdxminus= dxminus*dxminus; }
  135. if(r==0||r==imageH-1){dy=0;} else {dy=(phi1[ind-imageW]-phi1[ind+imageW])/2;}
  136. if(r==0){dyplus=0;} else {dyplus=(phi1[ind-imageW]-phi1[ind]);}
  137. if(r==imageH-1){dyminus=0;} else {dyminus=(phi1[ind]-phi1[ind+imageW]);}
  138. if(r==0||c==imageW-1||r==imageH-1){dyplusx=0;} else {dyplusx=(phi1[ind-imageW+1]-phi1[ind+imageW+1])/2;}
  139. if(r==0||c==0||r==imageH-1){dyminusx=0;} else {dyminusx=(phi1[ind-imageW-1]-phi1[ind+imageW-1])/2;}
  140. if(dyplus<0){maxdyplus=0;} else { maxdyplus= dyplus*dyplus; }
  141. if(-dyminus<0){maxminusdyminus=0;} else { maxminusdyminus= dyminus*dyminus; }
  142. if(dyplus>0){mindyplus=0;} else { mindyplus= dyplus*dyplus; }
  143. if(-dyminus>0){minminusdyminus=0;} else { minminusdyminus= dyminus*dyminus; }
  144. gradphimax=sqrt((sqrt(maxdxplus+maxminusdxminus))*(sqrt(maxdxplus+maxminusdxminus))+(sqrt(maxdyplus+maxminusdyminus))*(sqrt(maxdyplus+maxminusdyminus)));
  145. gradphimin=sqrt((sqrt(mindxplus+minminusdxminus))*(sqrt(mindxplus+minminusdxminus))+(sqrt(mindyplus+minminusdyminus))*(sqrt(mindyplus+minminusdyminus)));
  146. nplusx= dxplus / sqrt(1.192092896e-07F + (dxplus*dxplus) + ((dyplusx + dy)*(dyplusx + dy)*0.25) );
  147. nplusy= dyplus / sqrt(1.192092896e-07F + (dyplus*dyplus) + ((dxplusy + dx)*(dxplusy + dx)*0.25) );
  148. nminusx= dxminus / sqrt(1.192092896e-07F + (dxminus*dxminus) + ((dyminusx + dy)*(dyminusx + dy)*0.25) );
  149. nminusy= dyminus / sqrt(1.192092896e-07F + (dyminus*dyminus) + ((dxminusy + dx)*(dxminusy + dx)*0.25) );
  150. curvature= ((nplusx-nminusx)+(nplusy-nminusy))/2;
  151. F = (-ALPHA * D[ind]) + ((1-ALPHA) * curvature);
  152. if(F>0) {gradphi=gradphimax;} else {gradphi=gradphimin;}
  153. phi[ind]=phi1[ind] + (DT * F * gradphi);
  154. }
  155. }
  156. }
  157. void disp(void){
  158. glClear(GL_COLOR_BUFFER_BIT);
  159. update_phi();
  160. its++;
  161. if(its<ITERATIONS){
  162. glutPostRedisplay();
  163. if(its%50==0){
  164. printf("Iteration %3d Total Time: %3.2f ReInit Time: %3.2fn", its, 0.001*cutGetTimerValue(Timer), 0.001*cutGetTimerValue(ReInitTimer));
  165. cutStartTimer(ReInitTimer); // ReInit Timer Start
  166. reinit_phi(); // ReInit
  167. glDrawPixels(imageW, imageH, GL_GREEN, GL_FLOAT, phi);
  168. glutSwapBuffers();
  169. cutStopTimer(ReInitTimer); // ReInit Timer Stop
  170. }
  171. } else {
  172. printf("Iteration %3d Total Time: %3.2f ReInit Time: %3.2fn", its, 0.001*cutGetTimerValue(Timer), 0.001*cutGetTimerValue(ReInitTimer));
  173. glDrawPixels(imageW, imageH, GL_GREEN, GL_FLOAT, phi);
  174. glutSwapBuffers();
  175. }
  176. }
  177. int main(int argc, char** argv){
  178. const char *image_path = IMAGE;
  179. //TODO : declare ALL variables here
  180. LoadBMPFile(&h_Src, &imageW, &imageH, image_path);
  181. D = (float *)malloc(imageW*imageH*sizeof(float));
  182. //printf("Input Imagen");
  183. for(r=0;r<imageH;r++){
  184. for(c=0;c<imageW;c++){
  185. D[r*imageW+c] = h_Src[r*imageW+c].x;
  186. /*printf("%3.0f ", D[r*imageW+c]);*/
  187. }
  188. //printf("n");
  189. }
  190. N = imageW*imageH;
  191. for(i=0;i<N;i++){
  192. D[i] = EPSILON - abs(D[i] - THRESHOLD);
  193. }
  194. //printf("Speed Functionn");
  195. //for(int r=0;r<imageH;r++){
  196. // for(int c=0;c<imageW;c++){
  197. // printf("%3.0f ", D[r*imageW+c]);
  198. // }
  199. // printf("n");
  200. //}
  201. // Set up CUDA Timer
  202. cutCreateTimer(&Timer);
  203. cutCreateTimer(&ReInitTimer);
  204. cutStartTimer(Timer);
  205. init_phi();
  206. if((contour=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("Contourn");
  207. if((phi1=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("GRADPHIn");
  208. //update_phi();
  209.   // GL initialisation
  210.   glutInit(&argc, argv);
  211.   glutInitDisplayMode(GLUT_ALPHA | GLUT_DOUBLE);
  212.   glutInitWindowSize(imageW,imageH);
  213.   glutInitWindowPosition(100,100);
  214.   glutCreateWindow("GL Level Set Evolution");
  215.   glClearColor(0.0,0.0,0.0,0.0);
  216.   glutDisplayFunc(disp);
  217.   glutMainLoop();
  218. //printf("phi+1n");
  219. //for(int r=0;r<imageH;r++){
  220. // for(int c=0;c<imageW;c++){
  221. // printf("%6.3f ", phi[r*imageW+c]);
  222. // }
  223. // printf("n");
  224. //}
  225. }
  226. //TODO Memory Malloc Free
  227. //TODO Timer
  228. //TODO Comment Code