Advertisement
Guest User

Eddy_Em

a guest
May 30th, 2011
372
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.66 KB | None | 0 0
  1. typedef struct{
  2.     float *image;
  3.     float *hough;
  4.     int w;
  5.     int Y0;
  6.     int Y1;
  7.     int Rmax;
  8.     int angles;
  9.     pthread_mutex_t *mutex;
  10. }Hough_kernel_args;
  11. /*
  12.  * Ядро для преобразования Хафа по линиям
  13.  */
  14. void *fill_lin_hough_array(void *data){
  15.     Hough_kernel_args *HD = (Hough_kernel_args*) data;
  16.     float *ima = HD->image, *hough = HD->hough;
  17.     pthread_mutex_t *mutex = HD->mutex;
  18.     int Y0 = HD->Y0, Y1 = HD->Y1, imW = HD->w, Rmax = HD->Rmax, angles = HD->angles;
  19.     int i, j, k, Y, R;
  20.     for(j = Y0; j < Y1; j++){
  21.         for(i = 0.; i < imW; i++, ima++){
  22.             if(*ima > 0.1){
  23.                 Y = 0;
  24.                 pthread_mutex_lock(mutex);
  25.                 for(k = 0; k < angles; k++, Y+=Rmax){
  26.                     // R = x*cos(theta) + y*sin(theta)
  27.                     R = (int)(0.5 + i*Cos_d[k] + j*Sin_d[k]);
  28.                     if(R > 0 && R < Rmax) hough[R + Y] += *ima;
  29.                 }
  30.                 pthread_mutex_unlock(mutex);
  31.             }
  32.         }
  33.     }
  34.     return NULL;
  35. }
  36. /*
  37.  * построение преобразования Хафа для поиска линий
  38.  * вход:
  39.  *      ima - данные изображения
  40.  *      imW, imH - ширина и высота изображения
  41.  *      Rmax - максимальная величина R
  42.  *      angles - размер массива углов (шаг по углу равен 180/angles градусов)
  43.  * выход: hough - инициализированный внешней функцией массив,
  44.  *      в котором будет размещено преобразование Хафа
  45.  *      !!! массив должен быть проинициализирован нулями ДО вызова этой функции
  46.  * Выходной массив уже нормирован на единицу
  47.  */
  48. int fill_hough_lines(float *ima, int imW, int imH, int Rmax, int angles, float *hough){
  49.     int i, Y0, Y1, dY;
  50.     float *hptr = hough, max;
  51.     Hough_kernel_args HD[THREAD_NUMBER];
  52.     pthread_t threads[THREAD_NUMBER];
  53.     pthread_mutex_t mutex;
  54.     pthread_mutex_init(&mutex, NULL);
  55.     init_sincos(angles);
  56.     dY = (imH + THREAD_NUMBER/2) / THREAD_NUMBER;
  57.     Y0 = 0; Y1 = dY;
  58.     for(i = 0; i < THREAD_NUMBER; i++, Y0+=dY, Y1+=dY){
  59.         if(Y0 >= imW) break;
  60.         if(Y1 > imW) Y1 = imW;
  61.         HD[i].image = ima; HD[i].hough = hough;
  62.         HD[i].Y0 = Y0; HD[i].Y1 = Y1; HD[i].w = imW;
  63.         HD[i].Rmax = Rmax; HD[i].angles = angles;
  64.         HD[i].mutex = &mutex;
  65.         pthread_create(&threads[i], NULL, fill_lin_hough_array, &HD[i]);
  66.     }
  67.     for(i = 0; i < THREAD_NUMBER; i++)
  68.         pthread_join(threads[i], NULL);
  69.     pthread_mutex_destroy(&mutex);
  70.     max = *hough++;
  71.     Y1 = Rmax * angles;
  72.     for(i = 1; i < Y1; i++, hough++)
  73.         if(*hough > max) max = *hough;
  74.     hough = hptr;
  75.     for(i = 0; i < Y1; i++, hough++)
  76.         *hough /= max;
  77.     return 1;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement