Advertisement
Guest User

Eddy_Em

a guest
May 30th, 2011
346
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.60 KB | None | 0 0
  1. __global__ void fill_lin_hough_array(float *ima_d,
  2.                         int imW, int imH,
  3.                         float *Sin_d, float *Cos_d,
  4.                         int Rmax, int angles, float treshold,
  5.                         float *hough_d){
  6.     int xi = blockIdx.x * blockDim.x + threadIdx.x;
  7.     int yi = blockIdx.y * blockDim.y + threadIdx.y;
  8.     int i = xi + imW * yi;
  9.     float x = (float)xi;
  10.     float y = (float)yi;
  11.     int Y = 0, k, R;
  12.     if(xi >= imW || yi >= imH) return;
  13.     float ima = ima_d[i];
  14.     //float tresh = *treshold;
  15.     if(ima > treshold){
  16.         for(k = 0; k < angles; k++, Y+=Rmax){
  17.             // R = x*cos(theta) + y*sin(theta)
  18.             R = (int)(0.5f + x * Cos_d[k] + y * Sin_d[k]);
  19.             if(R > 0 && R < Rmax) hough_d[R + Y] += ima;
  20.         }
  21.     }
  22. }
  23. /* 182мс
  24.  * построение преобразования Хафа для поиска линий
  25.  * вход:
  26.  *      ima - данные изображения
  27.  *      imW, imH - ширина и высота изображения
  28.  *      Rmax - максимальная величина R
  29.  *      angles - размер массива углов (шаг по углу равен 180/angles градусов)
  30.  * выход: hough - инициализированный внешней функцией массив,
  31.  *      в котором будет размещено преобразование Хафа
  32.  *      !!! массив должен быть проинициализирован нулями ДО вызова этой функции
  33.  * Выходной массив уже нормирован на единицу
  34.  */
  35. extern "C" int fill_hough_lines(float *ima, int imW, int imH, int Rmax, int angles, float *hough){
  36.     #undef RETMACRO
  37.     #define RETMACRO do{ ret = 0; goto free_all; }while(0)
  38.     int sz, ret = 1;
  39.     int lblksz = LBLKSZ;
  40.     float *ima_d = NULL, *hough_d = NULL;
  41.     float treshold = 0.5f;
  42.     init_sincos(angles);
  43.     sz = imW * imH;
  44.     dim3 blkdim(QBLKSZ, QBLKSZ);
  45.     dim3 griddim((imW+QBLKSZ-1)/QBLKSZ, (imH+QBLKSZ-1)/QBLKSZ);
  46.     dim3 hgriddim((Rmax+QBLKSZ-1)/QBLKSZ, (angles+QBLKSZ-1)/QBLKSZ);
  47.     CUALLOC(ima_d, sz*sizeof(float));
  48.     CUMOV2DEV(ima_d, ima, sz*sizeof(float));
  49.     sz = Rmax * angles;
  50.     CUALLOC(hough_d, sz*sizeof(float));
  51.     fill_zeros<<<hgriddim, blkdim>>>(hough_d, sz, Rmax, angles); // обнуляем
  52.     cudaThreadSynchronize();
  53.     //~ CUMOV2DEV(hough_d, hough, sz*sizeof(float));
  54.     fill_lin_hough_array<<<griddim, blkdim>>>(ima_d, imW, imH, Sin_d, Cos_d,
  55.                                     Rmax, angles, treshold, hough_d);
  56.     cudaThreadSynchronize();
  57.     normalize_vec<<<1, lblksz>>>(hough_d, sz);
  58.     cudaThreadSynchronize();
  59.     CUMOV2HOST(hough, hough_d, sz*sizeof(float));
  60. free_all:
  61.     CUFREE(hough_d);
  62.     CUFREE(ima_d);
  63.     return ret;
  64.     #undef RETMACRO
  65.     #define RETMACRO return
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement