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

3D图形编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <float.h>
  5. #include <cuda_runtime.h>
  6. #include <cutil.h>
  7. #include <math.h>
  8. #include <GL/glut.h>
  9. #define IMAGE "liver.bmp"
  10. #define ITERATIONS   5000
  11. #define THRESHOLD  170
  12. #define EPSILON  35
  13. #define ALPHA  0.009
  14. #define DT  0.25
  15. #define RITS  50
  16. float *phi, *D, *contour;
  17. uchar4 *h_Src, *h_Mask;
  18. int imageW, imageH, N;
  19. unsigned char *mask;
  20. void LoadBMPFile(uchar4 **dst, int *width, int *height, const char *name);
  21. void sedt2d(int *_d,unsigned char *_bimg,int _h,int _w);
  22. int its=0;
  23. unsigned int Timer = 0;
  24. void init_phi(){
  25. const char *mask_path = "mask.bmp";
  26. //printf("Init Maskn");
  27. LoadBMPFile(&h_Mask, &imageW, &imageH, mask_path);
  28. mask = (unsigned char *)malloc(imageW*imageH*sizeof(unsigned char));
  29. for(int r=0;r<imageH;r++){
  30. for(int c=0;c<imageW;c++){
  31. mask[r*imageW+c] = (h_Mask[r*imageW+c].x)/255;
  32. //printf("%3d ", mask[r*imageW+c]);
  33. }
  34. //printf("n");
  35. }
  36. int *init;
  37. if((init=(int *)malloc(imageW*imageH*sizeof(int)))==NULL)printf("ME_INITn");
  38. if((phi=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_PHIn");
  39. sedt2d(init,mask,imageH,imageW);
  40. //printf("sdf of init maskn");
  41. for(int r=0;r<imageH;r++){
  42. for(int c=0;c<imageW;c++){
  43. phi[r*imageW+c]=(float)init[r*imageW+c];
  44. if(phi[r*imageW+c]>0){
  45. phi[r*imageW+c]=0.5*sqrt(abs(phi[r*imageW+c]));
  46. } else {
  47. phi[r*imageW+c]=-0.5*sqrt(abs(phi[r*imageW+c]));
  48. }
  49. //printf("%6.3f ", phi[r*imageW+c]);
  50. }
  51. //printf("n");
  52. }
  53. free(init);
  54. free(mask);
  55. }
  56. void reinit_phi(){
  57. unsigned char *reinit;
  58. reinit=(unsigned char *)malloc(imageW*imageH*sizeof(unsigned char));
  59. int *intphi;
  60. if((intphi=(int *)malloc(imageW*imageH*sizeof(int)))==NULL)printf("ME_INITn");
  61. for(int i=0;i<N;i++){
  62. if(phi[i]<0){
  63. phi[i]=1;
  64. } else {
  65. phi[i]=0;
  66. }
  67. reinit[i]=(int)phi[i];
  68. }
  69. sedt2d(intphi,reinit,imageH,imageW);
  70. printf("reinitn");
  71. for(int r=0;r<imageH;r++){
  72. for(int c=0;c<imageW;c++){
  73. phi[r*imageW+c]=(float)intphi[r*imageW+c];
  74. if(phi[r*imageW+c]>0){
  75. phi[r*imageW+c]=0.5*sqrt(abs(phi[r*imageW+c]));
  76. } else {
  77. phi[r*imageW+c]=-0.5*sqrt(abs(phi[r*imageW+c]));
  78. }
  79. //printf("%6.3f ", phi[r*imageW+c]);
  80. }
  81. //printf("n");
  82. }
  83. free(reinit);
  84. free(intphi);
  85. }
  86. void update_phi(){
  87. float *ptr2phi;
  88. float *dx, *ptr2dx;
  89. if((dx=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_DXn");
  90. ptr2dx=dx;
  91. ptr2phi=phi;
  92. for(int r=0;r<imageH;r++){
  93. *ptr2dx=0;
  94. for(int c=0;c<imageW-2;c++){
  95. ptr2phi++;
  96. ptr2dx++;
  97. *ptr2dx = (*(ptr2phi+1) - *(ptr2phi-1)) /2 ;
  98. }
  99. ptr2dx++;
  100. *ptr2dx=0;
  101. ptr2dx++;
  102. ptr2phi++;
  103. if(r!=(imageH-1))ptr2phi++;
  104. }
  105. float *dxplus, *ptr2dxplus;
  106. if((dxplus=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_DX+n");
  107. for(int i=0;i<N;i++)dxplus[i]=phi[i];
  108. ptr2dxplus=dxplus;
  109. for(int r=0;r<imageH;r++){
  110. for(int c=0;c<imageW-1;c++){
  111. *ptr2dxplus = *(ptr2dxplus+1) - *ptr2dxplus;
  112. ptr2dxplus++;
  113. }
  114. *ptr2dxplus=0;
  115. ptr2dxplus++;
  116. }
  117. float *dxminus, *ptr2dxminus;
  118. if((dxminus=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_DX-n");
  119. for(int i=0;i<N;i++)dxminus[i]=phi[i];
  120. ptr2dxminus=dxminus+N-1;
  121. for(int r=0;r<imageH;r++){
  122. for(int c=0;c<imageW-1;c++){
  123. *ptr2dxminus = *ptr2dxminus - *(ptr2dxminus-1);
  124. ptr2dxminus--;
  125. }
  126. *ptr2dxminus=0;
  127. ptr2dxminus--;
  128. }
  129. float *dxplusy, *ptr2dxplusy;
  130. if((dxplusy=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_dxplusyn");
  131. ptr2dxplusy=dxplusy;
  132. ptr2phi=phi;
  133. for(int c=0;c<imageW;c++){
  134. *ptr2dxplusy = 0;
  135. ptr2dxplusy++;
  136. }
  137. for(int r=0;r<imageH-1;r++){
  138. *ptr2dxplusy=0;
  139. for(int c=0;c<imageW-2;c++){
  140. ptr2phi++;
  141. ptr2dxplusy++;
  142. *ptr2dxplusy = (*(ptr2phi+1) - *(ptr2phi-1)) /2 ;
  143. }
  144. ptr2dxplusy++;
  145. *ptr2dxplusy=0;
  146. ptr2dxplusy++;
  147. ptr2phi++;
  148. if(r!=(imageH-2))ptr2phi++;
  149. }
  150. float *dxminusy, *ptr2dxminusy;
  151. if((dxminusy=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_dxminusyn");
  152. ptr2dxminusy=dxminusy;
  153. ptr2phi=phi+imageW;
  154. for(int r=0;r<imageH-1;r++){
  155. *ptr2dxminusy=0;
  156. for(int c=0;c<imageW-2;c++){
  157. ptr2phi++;
  158. ptr2dxminusy++;
  159. *ptr2dxminusy = (*(ptr2phi+1) - *(ptr2phi-1) );
  160. }
  161. ptr2dxminusy++;
  162. *ptr2dxminusy=0;
  163. ptr2dxminusy++;
  164. ptr2phi++;
  165. if(r!=(imageH-2))ptr2phi++;
  166. }
  167. for(int c=0;c<imageW;c++){
  168. *ptr2dxminusy = 0;
  169. ptr2dxminusy++;
  170. }
  171. float *maxdxplus, *ptr2maxdxplus;
  172. if((maxdxplus=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_MDX+n");
  173. for(int i=0;i<N;i++)maxdxplus[i]=dxplus[i];
  174. ptr2maxdxplus = maxdxplus;
  175. for(int i=0;i<N;i++){
  176. if (*ptr2maxdxplus < 0) {
  177. *ptr2maxdxplus = 0;
  178. } else {
  179. *ptr2maxdxplus *= *ptr2maxdxplus;
  180. }
  181. ptr2maxdxplus++;
  182. }
  183. float *maxminusdxminus, *ptr2maxminusdxminus;
  184. if((maxminusdxminus=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_-MDX-n");
  185. for(int i=0;i<N;i++)maxminusdxminus[i]=-dxminus[i];
  186. ptr2maxminusdxminus = maxminusdxminus;
  187. for(int i=0;i<N;i++){
  188. if (*ptr2maxminusdxminus < 0) {
  189. *ptr2maxminusdxminus = 0;
  190. } else {
  191. *ptr2maxminusdxminus *= *ptr2maxminusdxminus;
  192. }
  193. ptr2maxminusdxminus++;
  194. }
  195. float *mindxplus, *ptr2mindxplus;
  196. if((mindxplus=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_MDX+n");
  197. for(int i=0;i<N;i++)mindxplus[i]=dxplus[i];
  198. ptr2mindxplus = mindxplus;
  199. for(int i=0;i<N;i++){
  200. if (*ptr2mindxplus > 0) {
  201. *ptr2mindxplus = 0;
  202. } else {
  203. *ptr2mindxplus *= *ptr2mindxplus;
  204. }
  205. ptr2mindxplus++;
  206. }
  207. float *minminusdxminus, *ptr2minminusdxminus;
  208. if((minminusdxminus=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_-MDX-n");
  209. for(int i=0;i<N;i++)minminusdxminus[i]=-dxminus[i];
  210. ptr2minminusdxminus = minminusdxminus;
  211. for(int i=0;i<N;i++){
  212. if (*ptr2minminusdxminus > 0) {
  213. *ptr2minminusdxminus = 0;
  214. } else {
  215. *ptr2minminusdxminus *= *ptr2minminusdxminus;
  216. }
  217. ptr2minminusdxminus++;
  218. }
  219. //////// DY ////////
  220. float *dy, *ptr2dy;
  221. if((dy=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_dyn");
  222. ptr2dy=dy;
  223. ptr2phi=phi;
  224. for(int c=0;c<imageW;c++){
  225. *ptr2dy = 0;
  226. ptr2dy++;
  227. ptr2phi++;
  228. }
  229. for(int r=0;r<imageH-2;r++){
  230. for(int c=0;c<imageW;c++){
  231. *ptr2dy = (*(ptr2phi-imageW) - *(ptr2phi+imageW))/2;
  232. ptr2dy++;
  233. ptr2phi++;
  234. }
  235. }
  236. for(int c=0;c<imageW;c++){
  237. *ptr2dy = 0;
  238. ptr2dy++;
  239. ptr2phi++;
  240. }
  241. float *dyplus, *ptr2dyplus;
  242. if((dyplus=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_dy+n");
  243. for(int i=0;i<N;i++)dyplus[i]=phi[i];
  244. ptr2dyplus=dyplus+N-1;
  245. for(int r=0;r<imageH-1;r++){
  246. for(int c=0;c<imageW;c++){
  247. *ptr2dyplus = *(ptr2dyplus-imageW) - *ptr2dyplus;
  248. ptr2dyplus--;
  249. }
  250. }
  251. for(int c=0;c<imageW;c++){
  252. *ptr2dyplus = 0;
  253. ptr2dyplus--;
  254. }
  255. float *dyminus, *ptr2dyminus;
  256. if((dyminus=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_dy+n");
  257. for(int i=0;i<N;i++)dyminus[i]=phi[i];
  258. ptr2dyminus=dyminus;
  259. for(int r=0;r<imageH-1;r++){
  260. for(int c=0;c<imageW;c++){
  261. *ptr2dyminus = *ptr2dyminus - *(ptr2dyminus+imageW);
  262. ptr2dyminus++;
  263. }
  264. }
  265. for(int c=0;c<imageW;c++){
  266. *ptr2dyminus = 0;
  267. ptr2dyminus++;
  268. }
  269. float *dyplusx, *ptr2dyplusx;
  270. if((dyplusx=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_dyplusxn");
  271. ptr2dyplusx=dyplusx;
  272. ptr2phi=phi;
  273. for(int c=0;c<imageW;c++){
  274. *ptr2dyplusx = 0;
  275. ptr2dyplusx++;
  276. ptr2phi++;
  277. }
  278. for(int r=0;r<imageH-2;r++){
  279. for(int c=0;c<imageW-1;c++){
  280. ptr2phi++;
  281. *ptr2dyplusx = (*(ptr2phi-imageW) - *(ptr2phi+imageW))/2;
  282. ptr2dyplusx++;
  283. }
  284. *ptr2dyplusx=0;
  285. ptr2dyplusx++;
  286. ptr2phi++;
  287. }
  288. for(int c=0;c<imageW;c++){
  289. *ptr2dyplusx = 0;
  290. ptr2dyplusx++;
  291. }
  292. float *dyminusx, *ptr2dyminusx;
  293. if((dyminusx=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_dyminusxn");
  294. ptr2dyminusx=dyminusx;
  295. ptr2phi=phi;
  296. for(int c=0;c<imageW;c++){
  297. *ptr2dyminusx = 0;
  298. ptr2dyminusx++;
  299. ptr2phi++;
  300. }
  301. for(int r=0;r<imageH-2;r++){
  302. *ptr2dyminusx=0;
  303. for(int c=0;c<imageW-1;c++){
  304. ptr2dyminusx++;
  305. *ptr2dyminusx = (*(ptr2phi-imageW) - *(ptr2phi+imageW))/2;
  306. ptr2phi++;
  307. }
  308. ptr2dyminusx++;
  309. ptr2phi++;
  310. }
  311. for(int c=0;c<imageW;c++){
  312. *ptr2dyminusx = 0;
  313. ptr2dyminusx++;
  314. }
  315. float *maxdyplus, *ptr2maxdyplus;
  316. if((maxdyplus=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_Mdy+n");
  317. for(int i=0;i<N;i++)maxdyplus[i]=dyplus[i];
  318. ptr2maxdyplus = maxdyplus;
  319. for(int i=0;i<N;i++){
  320. if (*ptr2maxdyplus < 0) {
  321. *ptr2maxdyplus = 0;
  322. } else {
  323. *ptr2maxdyplus *= *ptr2maxdyplus;
  324. }
  325. ptr2maxdyplus++;
  326. }
  327. float *maxminusdyminus, *ptr2maxminusdyminus;
  328. if((maxminusdyminus=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_-Mdy-n");
  329. for(int i=0;i<N;i++)maxminusdyminus[i]=-dyminus[i];
  330. ptr2maxminusdyminus = maxminusdyminus;
  331. for(int i=0;i<N;i++){
  332. if (*ptr2maxminusdyminus < 0) {
  333. *ptr2maxminusdyminus = 0;
  334. } else {
  335. *ptr2maxminusdyminus *= *ptr2maxminusdyminus;
  336. }
  337. ptr2maxminusdyminus++;
  338. }
  339. float *mindyplus, *ptr2mindyplus;
  340. if((mindyplus=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_Mdy+n");
  341. for(int i=0;i<N;i++)mindyplus[i]=dyplus[i];
  342. ptr2mindyplus = mindyplus;
  343. for(int i=0;i<N;i++){
  344. if (*ptr2mindyplus > 0) {
  345. *ptr2mindyplus = 0;
  346. } else {
  347. *ptr2mindyplus *= *ptr2mindyplus;
  348. }
  349. ptr2mindyplus++;
  350. }
  351. float *minminusdyminus, *ptr2minminusdyminus;
  352. if((minminusdyminus=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_-Mdy-n");
  353. for(int i=0;i<N;i++)minminusdyminus[i]=-dyminus[i];
  354. ptr2minminusdyminus = minminusdyminus;
  355. for(int i=0;i<N;i++){
  356. if (*ptr2minminusdyminus > 0) {
  357. *ptr2minminusdyminus = 0;
  358. } else {
  359. *ptr2minminusdyminus *= *ptr2minminusdyminus;
  360. }
  361. ptr2minminusdyminus++;
  362. }
  363. float *gradphimax;
  364. if((gradphimax=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("GRADPHIMAXn");
  365. for(int i=0;i<N;i++){
  366. gradphimax[i]=sqrt((sqrt(maxdxplus[i]+maxminusdxminus[i]))*(sqrt(maxdxplus[i]+maxminusdxminus[i]))+(sqrt(maxdyplus[i]+maxminusdyminus[i]))*(sqrt(maxdyplus[i]+maxminusdyminus[i])));
  367. }
  368. float *gradphimin;
  369. if((gradphimin=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("GRADPHIminn");
  370. for(int i=0;i<N;i++){
  371. gradphimin[i]=sqrt((sqrt(mindxplus[i]+minminusdxminus[i]))*(sqrt(mindxplus[i]+minminusdxminus[i]))+(sqrt(mindyplus[i]+minminusdyminus[i]))*(sqrt(mindyplus[i]+minminusdyminus[i])));
  372. }
  373. float *nplusx;
  374. if((nplusx=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("nplusxn");
  375. for(int i=0;i<N;i++){
  376. nplusx[i]= dxplus[i] / sqrt(FLT_EPSILON + (dxplus[i]*dxplus[i]) + ((dyplusx[i] + dy[i])*(dyplusx[i] + dy[i])*0.25) );
  377. }
  378. float *nplusy;
  379. if((nplusy=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("nplusyn");
  380. for(int i=0;i<N;i++){
  381. nplusy[i]= dyplus[i] / sqrt(FLT_EPSILON + (dyplus[i]*dyplus[i]) + ((dxplusy[i] + dx[i])*(dxplusy[i] + dx[i])*0.25) );
  382. }
  383. float *nminusx;
  384. if((nminusx=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("nminusxn");
  385. for(int i=0;i<N;i++){
  386. nminusx[i]= dxminus[i] / sqrt(FLT_EPSILON + (dxminus[i]*dxminus[i]) + ((dyminusx[i] + dy[i])*(dyminusx[i] + dy[i])*0.25) );
  387. }
  388. float *nminusy;
  389. if((nminusy=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("nminusyn");
  390. for(int i=0;i<N;i++){
  391. nminusy[i]= dyminus[i] / sqrt(FLT_EPSILON + (dyminus[i]*dyminus[i]) + ((dxminusy[i] + dx[i])*(dxminusy[i] + dx[i])*0.25) );
  392. }
  393. float *curvature, *ptr2curvature;
  394. if((curvature=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("curvaturen");
  395. for(int i=0;i<N;i++){
  396. curvature[i]= ((nplusx[i]-nminusx[i])+(nplusy[i]-nminusy[i])/2);
  397. }
  398. float *F, *ptr2F, *ptr2D;
  399. if((F=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("Fn");
  400. ptr2F=F;
  401. ptr2D=D;
  402. ptr2curvature=curvature;
  403. for(int i=0;i<N;i++){
  404. *ptr2F = -(ALPHA * (*ptr2D)) + ( (1-ALPHA) * (*ptr2curvature));
  405. ptr2F++;
  406. ptr2D++;
  407. ptr2curvature++;
  408. }
  409. float *gradphi, *ptr2gradphi, *ptr2gradphimax, *ptr2gradphimin;
  410. if((gradphi=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("GRADPHIn");
  411. ptr2gradphi=gradphi;
  412. ptr2gradphimax=gradphimax;
  413. ptr2gradphimin=gradphimin;
  414. ptr2F=F;
  415. for(int i=0; i<N; i++){
  416. if(*ptr2F>0){
  417. *ptr2gradphi = *ptr2gradphimax;
  418. } else {
  419. *ptr2gradphi = *ptr2gradphimin;
  420. }
  421. ptr2gradphi++;
  422. ptr2F++;
  423. ptr2gradphimax++;
  424. ptr2gradphimin++;
  425. }
  426. ptr2phi=phi;
  427. ptr2gradphi=gradphi;
  428. ptr2F=F;
  429. for(int i=0; i<N; i++){
  430. *ptr2phi = *ptr2phi + DT * (*ptr2F) * (*ptr2gradphi);
  431. ptr2phi++;
  432. ptr2gradphi++;
  433. ptr2F++;
  434. }
  435. //printf("Freeing Memoryn");
  436. free(dx);
  437. free(dxplus);
  438. free(dxminus);
  439. free(dxminusy);
  440. free(maxdxplus);
  441. free(maxminusdxminus);
  442. free(mindxplus);
  443. free(minminusdxminus);
  444. //
  445. free(dy);
  446. free(dyplus);
  447. free(dyminus);
  448. free(dyminusx);
  449. free(maxdyplus);
  450. free(maxminusdyminus);
  451. free(mindyplus);
  452. free(minminusdyminus);
  453. //
  454. free(gradphi);
  455. free(gradphimax);
  456. free(gradphimin);
  457. //
  458. free(nplusx);
  459. free(nplusy);
  460. free(nminusx);
  461. free(nminusy);
  462. free(curvature);
  463. free(F);
  464. }
  465. int main(int argc, char** argv){
  466. const char *image_path = IMAGE;
  467. LoadBMPFile(&h_Src, &imageW, &imageH, image_path);
  468. D = (float *)malloc(imageW*imageH*sizeof(float));
  469. //printf("Input Imagen");
  470. for(int r=0;r<imageH;r++){
  471. for(int c=0;c<imageW;c++){
  472. D[r*imageW+c] = h_Src[r*imageW+c].x;
  473. /*printf("%3.0f ", D[r*imageW+c]);*/
  474. }
  475. //printf("n");
  476. }
  477. N = imageW*imageH;
  478. float *ptr2D;
  479. ptr2D=D;
  480. for(int i=0;i<N;i++){
  481. *ptr2D = EPSILON - abs(*ptr2D - THRESHOLD);
  482. ptr2D++;
  483. }
  484. init_phi();
  485. // Set up CUDA Timer
  486. cutCreateTimer(&Timer);
  487. cutStartTimer(Timer);
  488. for(its=0;its<ITERATIONS;its++){
  489. update_phi();
  490. if(its%50==0)printf("Iteration %3d Total Time: %3.2fn", its, 0.001*cutGetTimerValue(Timer));
  491. }
  492. }