Advertisement
lu4kedr

edited_1

Dec 7th, 2016
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.22 KB | None | 0 0
  1. // ***********************************************************************
  2. //
  3. // Demo program for education in subject
  4. // Computer Architectures and Paralel Systems.
  5. // Petr Olivka, dep. of Computer Science, FEI, VSB-TU Ostrava
  6. // email:petr.olivka@vsb.cz
  7. //
  8. // Example of CUDA Technology Usage.
  9. // Image creation and its modification using CUDA.
  10. // Image manipulation is performed by OpenCV library.
  11. //
  12. // ***********************************************************************
  13.  
  14. #include <stdio.h>
  15. #include <cuda_runtime.h>
  16. #include "opencv2/opencv.hpp"
  17. #include "pic_type.h"
  18.  
  19. using namespace cv;
  20.  
  21. // Prototype of function in .cu file
  22. void run_startAnimace(CUDA_Pic velky, CUDA_Pic &CUDAvelky,
  23. CUDA_Pic maly, CUDA_Pic &CUDAmaly,
  24. CUDA_Pic vysledek, CUDA_Pic &CUDAvysledek
  25. );
  26.  
  27. void run_prubehAnimace(CUDA_Pic velky, CUDA_Pic &CUDAvelky,
  28. CUDA_Pic maly, CUDA_Pic &CUDAmaly,
  29. CUDA_Pic vysledek, CUDA_Pic &CUDAvysledek,
  30. uint2 block_size, int2 pozice);
  31.  
  32. void run_konecAnimace(CUDA_Pic CUDAvelky,
  33. CUDA_Pic CUDAmaly,
  34. CUDA_Pic CUDAvysledek
  35. );
  36.  
  37. // Image size
  38. #define SIZEX 432 // Width of image
  39. #define SIZEY 322 // Heigth of image
  40. // Block size for threads
  41. #define BLOCKX 40 // block width
  42. #define BLOCKY 25 // block height
  43.  
  44. int main()
  45. {
  46. // Array is created to store all points from image with size SIZEX * SIZEY.
  47. // Image is stored line by line.
  48. // Creation of empty image
  49. Mat cv_img( SIZEY, SIZEX, CV_8UC3 );
  50. Mat cv_img2( SIZEY, SIZEX, CV_8UC3 );
  51.  
  52. CUDA_Pic velky;
  53. velky.Size.x = SIZEX;
  54. velky.Size.y = SIZEY;
  55. velky.PData = new uchar4[ velky.Size.x * velky.Size.y ];
  56.  
  57. CUDA_Pic CUDAvelky;
  58. CUDAvelky.Size.x = SIZEX;
  59. CUDAvelky.Size.y = SIZEY;
  60. CUDAvelky.PData = new uchar4[ CUDAvelky.Size.x * CUDAvelky.Size.y ];
  61.  
  62. CUDA_Pic maly;
  63. maly.Size.x = SIZEX/2;
  64. maly.Size.y = SIZEY/2;
  65. maly.PData = new uchar4[ maly.Size.x * maly.Size.y ];
  66.  
  67. CUDA_Pic CUDAmaly;
  68. CUDAmaly.Size.x = SIZEX/2;
  69. CUDAmaly.Size.y = SIZEY/2;
  70. CUDAmaly.PData = new uchar4[ CUDAmaly.Size.x * CUDAmaly.Size.y ];
  71.  
  72. CUDA_Pic vysledek;
  73. vysledek.Size.x = SIZEX;
  74. vysledek.Size.y = SIZEY;
  75. vysledek.PData = new uchar4[ vysledek.Size.x * vysledek.Size.y ];
  76.  
  77. CUDA_Pic CUDAvysledek;
  78. CUDAvysledek.Size.x = SIZEX;
  79. CUDAvysledek.Size.y = SIZEY;
  80. CUDAvysledek.PData = new uchar4[ CUDAvysledek.Size.x * CUDAvysledek.Size.y ];
  81.  
  82. // Image filling by color gradient blue-green-red
  83. for ( int y = 0; y < velky.Size.y; y++ )
  84. for ( int x = 0; x < velky.Size.x; x++ )
  85. {
  86. uchar4 bgr = { 0, 0, 0 }; // black
  87. if ( x < velky.Size.x / 2 )
  88. {
  89. bgr.y = 255 * x / ( velky.Size.x / 2 );
  90. bgr.x = 255 - bgr.y;
  91. }
  92. else
  93. {
  94. bgr.y = 255 * (velky.Size.x - x ) / ( velky.Size.x / 2 );
  95. bgr.z = 255 - bgr.y;
  96. }
  97. // store points to array for transfer to GPU device
  98. velky.PData[ y * velky.Size.x + x ] = bgr;
  99. }
  100.  
  101. // Image filling by color gradient blue-green-red
  102. for ( int y = 0; y < maly.Size.y; y++ )
  103. for ( int x = 0; x < maly.Size.x; x++ )
  104. {
  105. uchar4 bgr = { 0, 0, 0 }; // black
  106. if ( x < maly.Size.x / 2 )
  107. {
  108. bgr.y = 255 * x / ( maly.Size.x / 2 );
  109. bgr.x = 255 - bgr.y;
  110. }
  111. else
  112. {
  113. bgr.y = 255 * (maly.Size.x - x ) / ( maly.Size.x / 2 );
  114. bgr.z = 255 - bgr.y;
  115. }
  116. // store points to array for transfer to GPU device
  117. maly.PData[ y * maly.Size.x + x ] = bgr;
  118. }
  119.  
  120.  
  121. int2 pozice;
  122. pozice.x = 20;
  123. pozice.y = 20;
  124.  
  125. // Function calling from .cu file
  126. uint2 block_size = { BLOCKX, BLOCKY };
  127. run_startAnimace(velky, CUDAvelky, maly, CUDAmaly, vysledek, CUDAvysledek);
  128.  
  129. for(pozice.x; pozice.x <= 200; pozice.x++) {
  130. run_prubehAnimace(velky, CUDAvelky, maly, CUDAmaly, vysledek, CUDAvysledek, block_size, pozice);
  131.  
  132. // Store modified data to image
  133. for ( int y = 0; y < vysledek.Size.y; y++ )
  134. for ( int x = 0; x < vysledek.Size.x; x++ )
  135. {
  136. uchar4 bgr = vysledek.PData[ y * vysledek.Size.x + x ];
  137. Vec3b v3bgr( bgr.x, bgr.y, bgr.z );
  138. cv_img2.at<Vec3b>( y, x ) = v3bgr;
  139. }
  140. // Show modified image
  141. imshow( "B-G-R Gradient & Color flip", cv_img2 );
  142. waitKey( 1 );
  143. }
  144.  
  145. run_konecAnimace(CUDAvelky, CUDAmaly, CUDAvysledek);
  146.  
  147. waitKey( 0 );
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement