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

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 "brainslice.bmp"
  11. #define ITERATIONS   700
  12. #define THRESHOLD  155
  13. #define EPSILON  60
  14. #define RITS  50
  15. #define BLOCKDIM_X  32
  16. #define BLOCKDIM_Y  8
  17. float *phi, *D;
  18. uchar4 *h_Src, *h_Mask;
  19. int imageW, imageH, N, pitch;
  20. size_t pitchbytes;
  21. float *d_phi, *d_D;
  22. float *d_phi1;
  23. void LoadBMPFile(uchar4 **dst, int *width, int *height, const char *name);
  24. void sedt2d(int *_d,unsigned char *_bimg,int _h,int _w);
  25. int its=0;
  26. unsigned int Timer = 0;
  27. unsigned int ReInitTimer = 0;
  28. int r;
  29. int c;
  30. int i;
  31. __global__ void updatephi( float *d_phi, float *d_phi1, float *d_D, int imageW, int imageH, int pitch);
  32. void init_phi(){
  33. int *init;
  34. unsigned char *mask;
  35. const char *mask_path = "mask.bmp";
  36. if((init=(int *)malloc(imageW*imageH*sizeof(int)))==NULL)printf("ME_INITn");
  37. if((phi=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_PHIn");
  38. mask = (unsigned char *)malloc(imageW*imageH*sizeof(unsigned char));
  39. //printf("Init Maskn");
  40. LoadBMPFile(&h_Mask, &imageW, &imageH, mask_path);
  41. for(r=0;r<imageH;r++){
  42. for(c=0;c<imageW;c++){
  43. mask[r*imageW+c] = (h_Mask[r*imageW+c].x)/255;
  44. //printf("%3d ", mask[r*imageW+c]);
  45. }
  46. //printf("n");
  47. }
  48. sedt2d(init,mask,imageH,imageW);
  49. //printf("sdf of init maskn");
  50. for(r=0;r<imageH;r++){
  51. for(c=0;c<imageW;c++){
  52. phi[r*imageW+c]=(float)init[r*imageW+c];
  53. if(phi[r*imageW+c]>0){
  54. phi[r*imageW+c]=0.5*sqrt(abs(phi[r*imageW+c]));
  55. } else {
  56. phi[r*imageW+c]=-0.5*sqrt(abs(phi[r*imageW+c]));
  57. }
  58. //printf("%6.3f ", phi[r*imageW+c]);
  59. }
  60. //printf("n");
  61. }
  62. free(init);
  63. free(mask);
  64. }
  65. void reinit_phi(){
  66. int *intphi;
  67. unsigned char *reinit;
  68. if((intphi=(int *)malloc(imageW*imageH*sizeof(int)))==NULL)printf("ME_INITn");
  69. reinit=(unsigned char *)malloc(imageW*imageH*sizeof(unsigned char));//TODO check
  70. for(i=0;i<N;i++){
  71. if(phi[i]<0){
  72. phi[i]=1;
  73. } else {
  74. phi[i]=0;
  75. }
  76. reinit[i]=(int)phi[i];
  77. }
  78. sedt2d(intphi,reinit,imageH,imageW);
  79. /*printf("ReInit @ %4d itsn",its);*/
  80. for(r=0;r<imageH;r++){
  81. for(c=0;c<imageW;c++){
  82. phi[r*imageW+c]=(float)intphi[r*imageW+c];
  83. if(phi[r*imageW+c]>0){
  84. phi[r*imageW+c]=0.5*sqrt(abs(phi[r*imageW+c]));
  85. } else {
  86. phi[r*imageW+c]=-0.5*sqrt(abs(phi[r*imageW+c]));
  87. }
  88. //printf("%6.3f ", phi[r*imageW+c]);
  89. }
  90. //printf("n");
  91. }
  92. free(reinit);
  93. free(intphi);
  94. }
  95. void cuda_update(){
  96. dim3 dimGrid( ((imageW-1)/BLOCKDIM_X) + 1, ((imageH-1)/BLOCKDIM_Y) +1 );
  97. dim3 dimBlock(BLOCKDIM_X, BLOCKDIM_Y);
  98. cutStartTimer(ReInitTimer); // ReInit Timer Start
  99. updatephi<<< dimGrid, dimBlock>>>(d_phi, d_phi1, d_D,  imageW, imageH, pitch);
  100. cutStopTimer(ReInitTimer); // ReInit Timer Stop
  101. d_phi=d_phi1;
  102. }
  103. void disp(void){
  104. glClear(GL_COLOR_BUFFER_BIT);
  105. cuda_update();
  106. its++;
  107. if(its<ITERATIONS){
  108. glutPostRedisplay();
  109. if(its%50==0){
  110. printf("Iteration %3d Total Time: %3.2f ReInit Time: %3.2fn", its, 0.001*cutGetTimerValue(Timer), 0.001*cutGetTimerValue(ReInitTimer));
  111. cudaMemcpy(phi, d_phi, sizeof(float)*imageW*imageH, cudaMemcpyDeviceToHost);
  112. reinit_phi(); // ReInit
  113. glDrawPixels(imageW, imageH, GL_GREEN, GL_FLOAT, phi);
  114. glutSwapBuffers();
  115. }
  116. } else {
  117. printf("Iteration %3d Total Time: %3.2f ReInit Time: %3.2fn", its, 0.001*cutGetTimerValue(Timer), 0.001*cutGetTimerValue(ReInitTimer));
  118. cudaMemcpy(phi, d_phi, sizeof(float)*imageW*imageH, cudaMemcpyDeviceToHost);
  119. glDrawPixels(imageW, imageH, GL_GREEN, GL_FLOAT, phi);
  120. glutSwapBuffers();
  121. }
  122. }
  123. int main(int argc, char** argv){
  124. // Load the Input Image using BMPLoader
  125. const char *image_path = IMAGE;
  126. LoadBMPFile(&h_Src, &imageW, &imageH, image_path);
  127. D = (float *)malloc(imageW*imageH*sizeof(float));
  128. for(r=0;r<imageH;r++){
  129. for(c=0;c<imageW;c++){
  130. D[r*imageW+c] = h_Src[r*imageW+c].x;
  131. }
  132. }
  133. N = imageW*imageH;
  134. // Threshold based on hash defined paramters
  135. for(i=0;i<N;i++){
  136. D[i] = EPSILON - abs(D[i] - THRESHOLD);
  137. }
  138. // Init phi to SDF
  139. init_phi();
  140. // Set up CUDA Timer
  141. cutCreateTimer(&Timer);
  142. cutCreateTimer(&ReInitTimer);
  143. cutStartTimer(Timer);
  144. // Allocate Memory on Device
  145. cudaMallocPitch((void**)&d_D,   &pitchbytes, sizeof(float)*imageW, imageH);
  146. cudaMallocPitch((void**)&d_phi,           &pitchbytes, sizeof(float)*imageW, imageH);
  147. cudaMallocPitch((void**)&d_phi1,          &pitchbytes, sizeof(float)*imageW, imageH);
  148. pitch=pitchbytes/sizeof(float);
  149. // Copy Host Thresholding Data to Device Memory
  150. cudaMemcpy2D(d_D,    pitchbytes, D,   sizeof(float)*imageW, sizeof(float)*imageW, imageH, cudaMemcpyHostToDevice);
  151. cudaMemcpy2D(d_phi1, pitchbytes, phi, sizeof(float)*imageW, sizeof(float)*imageW, imageH, cudaMemcpyHostToDevice);
  152. // Init GL Window
  153. glutInit(&argc, argv);
  154. glutInitDisplayMode(GLUT_ALPHA | GLUT_DOUBLE);
  155. glutInitWindowSize(imageW,imageH);
  156. glutInitWindowPosition(100,100);
  157. glutCreateWindow("GL Level Set Evolution");
  158. glClearColor(0.0,0.0,0.0,0.0);
  159. glutDisplayFunc(disp);
  160. glutMainLoop();
  161. cudaFree(d_D);
  162. cudaFree(d_phi1);
  163. cudaFree(d_phi);
  164. }
  165. //TODO Memory Malloc Free
  166. //TODO Comment Code
  167. //TODO Cutil PGm