CUDA和OpenCV实现的图像GAMMA变换

分手后的思念是犯贱 2022-08-08 05:06 279阅读 0赞

[cpp] view plain copy

  1. #include
  2. #include
  3. #include
  4. #include
  5. #include “cutil_inline.h”
  6. #define GAMMA 0.4
  7. void runTest(int argc, char** argv);
  8. __global__ void testKernel(float* d_idata, float* d_odata, int width, int height, float gamma)
  9. {
  10. unsigned int tid_in_grid_x = blockDim.x*blockIdx.x + threadIdx.x;
  11. unsigned int tid_in_grid_y = blockDim.y*blockIdx.y + threadIdx.y;
  12. unsigned int tid_in_grid = tid_in_grid_y*width + tid_in_grid_x;
  13. d_odata[tid_in_grid] = powf(d_idata[tid_in_grid], gamma);
  14. }
  15. int main(int argc, char** argv)
  16. {
  17. runTest(argc, argv);
  18. CUT_EXIT(argc, argv);
  19. }
  20. void runTest(int argc, char** argv)
  21. {
  22. if( cutCheckCmdLineFlag(argc, (const**char*\*)argv, “device”) ) //设备初始化并设定计时器。
  23. cutilDeviceInit(argc, argv);
  24. else
  25. cudaSetDevice(cutGetMaxGflopsDeviceId() );
  26. unsigned int timer = 0;
  27. cutilCheckError(cutCreateTimer(&timer));
  28. cutilCheckError(cutStartTimer(timer));
  29. IplImage* pImg;
  30. if((pImg = cvLoadImage(“lena_gray.jpg”, CV_LOAD_IMAGE_GRAYSCALE)) != 0 )
  31. {
  32. cvNamedWindow(“Image”, 1);
  33. cvShowImage(“Image”, pImg);
  34. unsigned int num_blocks_x = pImg->width/16;
  35. unsigned int num_blocks_y = pImg->height/16;
  36. unsigned int mem_size = sizeof(float)*pImg->widthStep*pImg->height;
  37. float* h_idata = (float*)malloc(mem_size);
  38. float* h_odata = (float*)malloc(mem_size);
  39. float* d_idata;
  40. CUDA_SAFE_CALL(cudaMalloc((void**)&d_idata, mem_size));
  41. float* d_odata;
  42. CUDA_SAFE_CALL(cudaMalloc((void**)&d_odata, mem_size));
  43. for(int i = 0; i < pImg->widthStep*pImg->height; i++) //从图像中复制数据时要特别注意变量类型,char类型的数据计算精度
  44. h_idata[i] = ((uchar)pImg->imageData[i])/255.0; //太低,但是图像中只能存储char类型,所以要进行转换
  45. CUDA_SAFE_CALL(cudaMemcpy(d_idata, h_idata, mem_size, cudaMemcpyHostToDevice));
  46. dim3 grid(num_blocks_x, num_blocks_y, 1);
  47. dim3 threads(16, 16, 1);
  48. testKernel<<>>(d_idata, d_odata, pImg->width, pImg->height, GAMMA);
  49. CUT_CHECK_ERROR(“Kernel execution failed”);
  50. CUDA_SAFE_CALL(cudaMemcpy(h_odata, d_odata, mem_size, cudaMemcpyDeviceToHost));
  51. IplImage* oImg = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 1);
  52. for(int i = 0; i < pImg->widthStep*pImg->height; i++)
  53. oImg->imageData[i] = (uchar)(int)(h_odata[i]*255);
  54. cvNamedWindow(“Result”, CV_WINDOW_AUTOSIZE);
  55. cvShowImage(“Result”, oImg);
  56. // cvSaveImage(“result.jpg”, oImg);
  57. cutilCheckError( cutStopTimer( timer));
  58. printf( “Processing time: %f (ms)/n”, cutGetTimerValue( timer));
  59. cutilCheckError( cutDeleteTimer( timer));
  60. cvWaitKey(0);
  61. cvDestroyWindow(“Image”);
  62. cvReleaseImage(&pImg);
  63. cvDestroyWindow(“Result”);
  64. cvReleaseImage(&oImg);
  65. free(h_idata);
  66. free(h_odata);
  67. CUDA_SAFE_CALL(cudaFree(d_idata));
  68. CUDA_SAFE_CALL(cudaFree(d_odata));
  69. }
  70. }

发表评论

表情:
评论列表 (有 0 条评论,279人围观)

还没有评论,来说两句吧...

相关阅读