Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <cuda_runtime.h>
- #include "..\include\opencv\highgui.h"
- void run_grayscale( uchar4 *color_pic, uchar4 *bw_pic, int sizex, int
- sizey );
- int main( int numarg, char **arg )
- {
- if ( numarg < 2 )
- {
- printf( "Enter picture filename!\n" );
- return 1;
- }
- // nacteni obrazku
- IplImage *bgr_img = cvLoadImage( arg[ 1 ] );
- int sizex = bgr_img->width;
- int sizey = bgr_img->height;
- // alokace poli uchar4 pro body obrazku a jeho naplneni
- uchar4 *bgr_pole = new uchar4[ sizex * sizey ];
- uchar4 *bw_pole = new uchar4[ sizex/2 * sizey/2 ];
- for ( int y = 0; y < sizey; y++ )
- for ( int x = 0; x < sizex; x++ )
- {
- CvScalar s = cvGet2D( bgr_img, y, x );
- uchar4 bgr = { (char) s.val[ 0 ], (char) s.val[ 1 ], (char) s.val[ 2
- ] };
- bgr_pole[ y * sizex + x ] = bgr;
- }
- // volani funkce ze souboru .cu
- run_grayscale( bgr_pole, bw_pole, sizex, sizey );
- IplImage *bw_img = cvCreateImage( cvSize( sizex/2, sizey/2 ),
- IPL_DEPTH_8U, 3 );
- // ziskana data ulozime do noveho obrazku
- for ( int y = 0; y < sizey/2; y++ )
- for ( int x = 0; x < sizex/2; x++ )
- {
- uchar4 bgr = bw_pole[ y * sizex/2 + x ];
- CvScalar s = {bgr.x, bgr.y,bgr.z };
- cvSet2D( bw_img, y, x, s );
- }
- // zobrazeni puvodniho obrazku a vysledku
- cvShowImage( "Color", bgr_img );
- cvShowImage( "GrayScale", bw_img );
- cvWaitKey( 0 );
- }
- #include <cuda_runtime.h>
- #include <stdio.h>
- // Demo kernel pro prevod barevneho bodu na odstin sede.
- __global__ void kernel_resize( uchar4 *original, uchar4* resizedpic, int
- sizex, int sizey )
- {
- // souradnice vlakna, kontrola rozmeru obrazku
- int y = blockDim.y * blockIdx.y + threadIdx.y;
- if ( y >= sizey ) return;
- int x = blockDim.x * blockIdx.x + threadIdx.x;
- if ( x >= sizex ) return;
- uchar4 bgr = original[ y * sizex + x ];
- // ulozeni bodu do obrazku
- if(y>(sizey/2-50) && y<(sizey/2+50) && x>(sizex/2-50) &&
- x<(sizex/2+50))
- {
- bgr.x = bgr.y = bgr.z = 255;
- }
- if(y%2==0 && x%2==0)
- resizedpic[ y/2 * sizex/2 + x/2 ] = bgr;
- }
- void run_grayscale( uchar4 *color_pic, uchar4* bw_pic, int sizex, int
- sizey )
- {
- cudaError_t cerr;
- // alokace pameti ve videokarte
- uchar4 *cudaOriginal;
- uchar4 *cudaResized;
- cerr = cudaMalloc( &cudaOriginal, sizex * sizey * sizeof( uchar4 ) );
- if ( cerr != cudaSuccess )
- printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr
- ) );
- cerr = cudaMalloc( &cudaResized, (sizex/2) * (sizey/2) * sizeof( uchar4
- ) );
- if ( cerr != cudaSuccess )
- printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr
- ) );
- // prenos barevneho obrazku do videokarty
- cerr = cudaMemcpy( cudaOriginal, color_pic, sizex * sizey * sizeof(
- uchar4 ), cudaMemcpyHostToDevice );
- if ( cerr != cudaSuccess )
- printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr
- ) );
- int block = 16;
- dim3 blocks( ( sizex + block - 1 ) / block, ( sizey + block - 1 ) /
- block );
- dim3 threads( block, block );
- // vytvoreni bloku s vlakny, matice vlaken muze byt vetsi, nez samotny
- obrazek!
- kernel_resize<<< blocks, threads >>>(cudaOriginal, cudaResized , sizex,
- sizey );
- if ( ( cerr = cudaGetLastError() ) != cudaSuccess )
- printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr
- ) );
- // prenos dat z videokarty
- cerr = cudaMemcpy( bw_pic, cudaResized, (sizex/2) * (sizey/2) * sizeof(
- uchar4 ), cudaMemcpyDeviceToHost );
- if ( cerr != cudaSuccess )
- printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr
- ) );
- // uvolneni alokovane pameti ve videokarte
- cudaFree( cudaOriginal );
- cudaFree( cudaResized );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement