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