Advertisement
Pata15

CUDA1

Dec 17th, 2014
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.53 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <cuda_runtime.h>
  3. #include "..\include\opencv\highgui.h"
  4.  
  5. void run_grayscale( uchar4 *color_pic, uchar4 *bw_pic, int sizex, int
  6. sizey );
  7.  
  8. int main( int numarg, char **arg )
  9. {
  10. if ( numarg < 2 )
  11. {
  12. printf( "Enter picture filename!\n" );
  13. return 1;
  14. }
  15.  
  16. // nacteni obrazku
  17. IplImage *bgr_img = cvLoadImage( arg[ 1 ] );
  18. int sizex = bgr_img->width;
  19. int sizey = bgr_img->height;
  20.  
  21. // alokace poli uchar4 pro body obrazku a jeho naplneni
  22. uchar4 *bgr_pole = new uchar4[ sizex * sizey ];
  23. uchar4 *bw_pole = new uchar4[ sizex/2 * sizey/2 ];
  24. for ( int y = 0; y < sizey; y++ )
  25. for ( int x = 0; x < sizex; x++ )
  26. {
  27. CvScalar s = cvGet2D( bgr_img, y, x );
  28. uchar4 bgr = { (char) s.val[ 0 ], (char) s.val[ 1 ], (char) s.val[ 2
  29. ] };
  30. bgr_pole[ y * sizex + x ] = bgr;
  31.  
  32. }
  33.  
  34. // volani funkce ze souboru .cu
  35. run_grayscale( bgr_pole, bw_pole, sizex, sizey );
  36.  
  37. IplImage *bw_img = cvCreateImage( cvSize( sizex/2, sizey/2 ),
  38. IPL_DEPTH_8U, 3 );
  39.  
  40. // ziskana data ulozime do noveho obrazku
  41. for ( int y = 0; y < sizey/2; y++ )
  42. for ( int x = 0; x < sizex/2; x++ )
  43. {
  44. uchar4 bgr = bw_pole[ y * sizex/2 + x ];
  45. CvScalar s = {bgr.x, bgr.y,bgr.z };
  46. cvSet2D( bw_img, y, x, s );
  47.  
  48. }
  49.  
  50. // zobrazeni puvodniho obrazku a vysledku
  51. cvShowImage( "Color", bgr_img );
  52. cvShowImage( "GrayScale", bw_img );
  53. cvWaitKey( 0 );
  54. }
  55.  
  56.  
  57.  
  58.  
  59.  
  60. #include <cuda_runtime.h>
  61. #include <stdio.h>
  62.  
  63. // Demo kernel pro prevod barevneho bodu na odstin sede.
  64. __global__ void kernel_resize( uchar4 *original, uchar4* resizedpic, int
  65. sizex, int sizey )
  66. {
  67. // souradnice vlakna, kontrola rozmeru obrazku
  68. int y = blockDim.y * blockIdx.y + threadIdx.y;
  69. if ( y >= sizey ) return;
  70. int x = blockDim.x * blockIdx.x + threadIdx.x;
  71. if ( x >= sizex ) return;
  72.  
  73. uchar4 bgr = original[ y * sizex + x ];
  74.  
  75.  
  76. // ulozeni bodu do obrazku
  77. if(y>(sizey/2-50) && y<(sizey/2+50) && x>(sizex/2-50) &&
  78. x<(sizex/2+50))
  79. {
  80. bgr.x = bgr.y = bgr.z = 255;
  81. }
  82.  
  83.  
  84. if(y%2==0 && x%2==0)
  85. resizedpic[ y/2 * sizex/2 + x/2 ] = bgr;
  86.  
  87. }
  88.  
  89. void run_grayscale( uchar4 *color_pic, uchar4* bw_pic, int sizex, int
  90. sizey )
  91. {
  92. cudaError_t cerr;
  93. // alokace pameti ve videokarte
  94. uchar4 *cudaOriginal;
  95. uchar4 *cudaResized;
  96. cerr = cudaMalloc( &cudaOriginal, sizex * sizey * sizeof( uchar4 ) );
  97. if ( cerr != cudaSuccess )
  98. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr
  99. ) );
  100.  
  101. cerr = cudaMalloc( &cudaResized, (sizex/2) * (sizey/2) * sizeof( uchar4
  102. ) );
  103. if ( cerr != cudaSuccess )
  104. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr
  105. ) );
  106.  
  107. // prenos barevneho obrazku do videokarty
  108. cerr = cudaMemcpy( cudaOriginal, color_pic, sizex * sizey * sizeof(
  109. uchar4 ), cudaMemcpyHostToDevice );
  110. if ( cerr != cudaSuccess )
  111. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr
  112. ) );
  113.  
  114. int block = 16;
  115. dim3 blocks( ( sizex + block - 1 ) / block, ( sizey + block - 1 ) /
  116. block );
  117. dim3 threads( block, block );
  118.  
  119. // vytvoreni bloku s vlakny, matice vlaken muze byt vetsi, nez samotny
  120. obrazek!
  121. kernel_resize<<< blocks, threads >>>(cudaOriginal, cudaResized , sizex,
  122. sizey );
  123.  
  124. if ( ( cerr = cudaGetLastError() ) != cudaSuccess )
  125. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr
  126. ) );
  127.  
  128. // prenos dat z videokarty
  129. cerr = cudaMemcpy( bw_pic, cudaResized, (sizex/2) * (sizey/2) * sizeof(
  130. uchar4 ), cudaMemcpyDeviceToHost );
  131. if ( cerr != cudaSuccess )
  132. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr
  133. ) );
  134.  
  135. // uvolneni alokovane pameti ve videokarte
  136. cudaFree( cudaOriginal );
  137. cudaFree( cudaResized );
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement