lu4kedr

edited_1

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