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

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 "mask.bmp"
  11. #define MASK "mask.bmp"
  12. #define ITERATIONS   500
  13. #define THRESHOLD  45
  14. #define EPSILON  30
  15. #define ALPHA  0.003
  16. #define DT  0.2
  17. #define RITS  50
  18. float *phi, *D, *contour;
  19. uchar4 *h_Src, *h_Mask;
  20. int imageW, imageH, N;
  21. unsigned char *output;
  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. void init_phi(){
  31. int *init;
  32. unsigned char *mask;
  33. const char *mask_path = MASK;
  34. if((init=(int *)malloc(imageW*imageH*sizeof(int)))==NULL)printf("ME_INITn");
  35. if((phi=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_PHIn");
  36. mask = (unsigned char *)malloc(imageW*imageH*sizeof(unsigned char));
  37. //printf("Init Maskn");
  38. LoadBMPFile(&h_Mask, &imageW, &imageH, mask_path);
  39. for(r=0;r<imageH;r++){
  40. for(c=0;c<imageW;c++){
  41. mask[r*imageW+c] = (h_Mask[r*imageW+c].x)/255;
  42. //printf("%3d ", mask[r*imageW+c]);
  43. }
  44. //printf("n");
  45. }
  46. sedt2d(init,mask,imageH,imageW);
  47. //printf("sdf of init maskn");
  48. for(r=0;r<imageH;r++){
  49. for(c=0;c<imageW;c++){
  50. phi[r*imageW+c]=(float)init[r*imageW+c];
  51. if(phi[r*imageW+c]>0){
  52. phi[r*imageW+c]=0.5*sqrt(abs(phi[r*imageW+c]));
  53. } else {
  54. phi[r*imageW+c]=-0.5*sqrt(abs(phi[r*imageW+c]));
  55. }
  56. //printf("%6.3f ", phi[r*imageW+c]);
  57. }
  58. //printf("n");
  59. }
  60. free(init);
  61. free(mask);
  62. }
  63. void reinit_phi(){
  64. int *intphi;
  65. unsigned char *reinit;
  66. if((intphi=(int *)malloc(imageW*imageH*sizeof(int)))==NULL)printf("ME_INITn");
  67. reinit=(unsigned char *)malloc(imageW*imageH*sizeof(unsigned char));//TODO check
  68. for(i=0;i<N;i++){
  69. if(phi[i]<0){
  70. phi[i]=1;
  71. } else {
  72. phi[i]=0;
  73. }
  74. reinit[i]=(int)phi[i];
  75. }
  76. sedt2d(intphi,reinit,imageH,imageW);
  77. for(r=0;r<imageH;r++){
  78. for(c=0;c<imageW;c++){
  79. phi[r*imageW+c]=(float)intphi[r*imageW+c];
  80. if(phi[r*imageW+c]>0){
  81. phi[r*imageW+c]=0.5*sqrt(abs(phi[r*imageW+c]));
  82. } else {
  83. phi[r*imageW+c]=-0.5*sqrt(abs(phi[r*imageW+c]));
  84. }
  85. //printf("%6.3f ", phi[r*imageW+c]);
  86. }
  87. //printf("n");
  88. }
  89. free(reinit);
  90. free(intphi);
  91. }
  92. void update_phi(){
  93. float dx;
  94. float dxplus;
  95. float dxminus;
  96. float dxplusy;
  97. float dxminusy;
  98. float maxdxplus;
  99. float maxminusdxminus;
  100. float mindxplus;
  101. float minminusdxminus;
  102. float dy;
  103. float dyplus;
  104. float dyminus;
  105. float dyplusx;
  106. float dyminusx;
  107. float maxdyplus;
  108. float maxminusdyminus;
  109. float mindyplus;
  110. float minminusdyminus;
  111. float gradphimax;
  112. float gradphimin;
  113. float nplusx;
  114. float nplusy;
  115. float nminusx;
  116. float nminusy;
  117. float curvature;
  118. float F;
  119. float gradphi;
  120. float *phi1;
  121. int ind;
  122. if((phi1=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("GRADPHIn");
  123. for(i=0;i<N;i++){
  124. phi1[i]=phi[i];
  125. }
  126. for(r=0;r<imageH;r++){
  127. for(c=0;c<imageW;c++){
  128. ind=r*imageW+c;
  129. if(c==0||c==imageW-1){dx=0;} else {dx=(phi1[ind+1]-phi1[ind-1])/2;}
  130. if(c==imageW-1){dxplus=0;} else {dxplus=(phi1[ind+1]-phi1[ind]);}
  131. if(c==0){dxminus=0;} else {dxminus=(phi1[ind]-phi1[ind-1]);}
  132. if(r==0||c==0||c==imageW-1){dxplusy=0;} else {dxplusy=(phi1[ind-imageW+1]-phi1[ind-imageW-1])/2;}
  133. if(r==imageH-1||c==0||c==imageW-1){dxminusy=0;} else {dxminusy=(phi1[ind+imageW+1]-phi1[ind+imageW-1])/2;}
  134. if(dxplus<0){maxdxplus=0;} else { maxdxplus= dxplus*dxplus; }
  135. if(-dxminus<0){maxminusdxminus=0;} else { maxminusdxminus= dxminus*dxminus; }
  136. if(dxplus>0){mindxplus=0;} else { mindxplus= dxplus*dxplus; }
  137. if(-dxminus>0){minminusdxminus=0;} else { minminusdxminus= dxminus*dxminus; }
  138. if(r==0||r==imageH-1){dy=0;} else {dy=(phi1[ind-imageW]-phi1[ind+imageW])/2;}
  139. if(r==0){dyplus=0;} else {dyplus=(phi1[ind-imageW]-phi1[ind]);}
  140. if(r==imageH-1){dyminus=0;} else {dyminus=(phi1[ind]-phi1[ind+imageW]);}
  141. if(r==0||c==imageW-1||r==imageH-1){dyplusx=0;} else {dyplusx=(phi1[ind-imageW+1]-phi1[ind+imageW+1])/2;}
  142. if(r==0||c==0||r==imageH-1){dyminusx=0;} else {dyminusx=(phi1[ind-imageW-1]-phi1[ind+imageW-1])/2;}
  143. if(dyplus<0){maxdyplus=0;} else { maxdyplus= dyplus*dyplus; }
  144. if(-dyminus<0){maxminusdyminus=0;} else { maxminusdyminus= dyminus*dyminus; }
  145. if(dyplus>0){mindyplus=0;} else { mindyplus= dyplus*dyplus; }
  146. if(-dyminus>0){minminusdyminus=0;} else { minminusdyminus= dyminus*dyminus; }
  147. gradphimax=sqrt((sqrt(maxdxplus+maxminusdxminus))*(sqrt(maxdxplus+maxminusdxminus))+(sqrt(maxdyplus+maxminusdyminus))*(sqrt(maxdyplus+maxminusdyminus)));
  148. gradphimin=sqrt((sqrt(mindxplus+minminusdxminus))*(sqrt(mindxplus+minminusdxminus))+(sqrt(mindyplus+minminusdyminus))*(sqrt(mindyplus+minminusdyminus)));
  149. nplusx= dxplus / sqrt(1.192092896e-07F + (dxplus*dxplus) + ((dyplusx + dy)*(dyplusx + dy)*0.25) );
  150. nplusy= dyplus / sqrt(1.192092896e-07F + (dyplus*dyplus) + ((dxplusy + dx)*(dxplusy + dx)*0.25) );
  151. nminusx= dxminus / sqrt(1.192092896e-07F + (dxminus*dxminus) + ((dyminusx + dy)*(dyminusx + dy)*0.25) );
  152. nminusy= dyminus / sqrt(1.192092896e-07F + (dyminus*dyminus) + ((dxminusy + dx)*(dxminusy + dx)*0.25) );
  153. curvature= ((nplusx-nminusx)+(nplusy-nminusy))/2;
  154. F = (-ALPHA * D[ind]) + ((1-ALPHA) * curvature);
  155. if(F>0) {gradphi=gradphimax;} else {gradphi=gradphimin;}
  156. phi[ind]=phi1[ind] + (DT * F * gradphi);
  157. }
  158. }
  159. free(phi1);
  160. }
  161. int main(int argc, char** argv){
  162. const char *image_path = IMAGE;
  163. //TODO : declare ALL variables here
  164. LoadBMPFile(&h_Src, &imageW, &imageH, image_path);
  165. D = (float *)malloc(imageW*imageH*sizeof(float));
  166. //printf("Input Imagen");
  167. for(r=0;r<imageH;r++){
  168. for(c=0;c<imageW;c++){
  169. D[r*imageW+c] = h_Src[r*imageW+c].x;
  170. /*printf("%3.0f ", D[r*imageW+c]);*/
  171. }
  172. //printf("n");
  173. }
  174. N = imageW*imageH;
  175. for(i=0;i<N;i++){
  176. D[i] = EPSILON - abs(D[i] - THRESHOLD);
  177. }
  178. // Set up CUDA Timer
  179. cutCreateTimer(&Timer);
  180. cutCreateTimer(&ReInitTimer);
  181. cutStartTimer(Timer);
  182. init_phi();
  183. if((contour=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("Contourn");
  184. for(its=0;its<=ITERATIONS;its++){
  185. update_phi();
  186. if(its%50==0)printf("Iteration %3d Total Time: %3.2fn", its, 0.001*cutGetTimerValue(Timer));
  187. }
  188. if((output = (unsigned char *) malloc(N))==NULL)printf("ME_OUTPUTn");
  189. for(i=0;i<N;i++){
  190. if(phi[i]>0){output[i]=0;} else { output[i]=255; }
  191. }
  192. char *outputFilename= "output.raw";
  193. FILE *fp = fopen(outputFilename, "wb");
  194. size_t write = fwrite(output, 1, N, fp);
  195. fclose(fp);
  196.     printf("Write '%s', %d bytesn", outputFilename, write);
  197. char dummy[100];
  198. scanf("%c",dummy);
  199. }