Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- typedef struct{
- float *image;
- float *hough;
- int w;
- int Y0;
- int Y1;
- int Rmax;
- int angles;
- pthread_mutex_t *mutex;
- }Hough_kernel_args;
- /*
- * Ядро для преобразования Хафа по линиям
- */
- void *fill_lin_hough_array(void *data){
- Hough_kernel_args *HD = (Hough_kernel_args*) data;
- float *ima = HD->image, *hough = HD->hough;
- pthread_mutex_t *mutex = HD->mutex;
- int Y0 = HD->Y0, Y1 = HD->Y1, imW = HD->w, Rmax = HD->Rmax, angles = HD->angles;
- int i, j, k, Y, R;
- for(j = Y0; j < Y1; j++){
- for(i = 0.; i < imW; i++, ima++){
- if(*ima > 0.1){
- Y = 0;
- pthread_mutex_lock(mutex);
- for(k = 0; k < angles; k++, Y+=Rmax){
- // R = x*cos(theta) + y*sin(theta)
- R = (int)(0.5 + i*Cos_d[k] + j*Sin_d[k]);
- if(R > 0 && R < Rmax) hough[R + Y] += *ima;
- }
- pthread_mutex_unlock(mutex);
- }
- }
- }
- return NULL;
- }
- /*
- * построение преобразования Хафа для поиска линий
- * вход:
- * ima - данные изображения
- * imW, imH - ширина и высота изображения
- * Rmax - максимальная величина R
- * angles - размер массива углов (шаг по углу равен 180/angles градусов)
- * выход: hough - инициализированный внешней функцией массив,
- * в котором будет размещено преобразование Хафа
- * !!! массив должен быть проинициализирован нулями ДО вызова этой функции
- * Выходной массив уже нормирован на единицу
- */
- int fill_hough_lines(float *ima, int imW, int imH, int Rmax, int angles, float *hough){
- int i, Y0, Y1, dY;
- float *hptr = hough, max;
- Hough_kernel_args HD[THREAD_NUMBER];
- pthread_t threads[THREAD_NUMBER];
- pthread_mutex_t mutex;
- pthread_mutex_init(&mutex, NULL);
- init_sincos(angles);
- dY = (imH + THREAD_NUMBER/2) / THREAD_NUMBER;
- Y0 = 0; Y1 = dY;
- for(i = 0; i < THREAD_NUMBER; i++, Y0+=dY, Y1+=dY){
- if(Y0 >= imW) break;
- if(Y1 > imW) Y1 = imW;
- HD[i].image = ima; HD[i].hough = hough;
- HD[i].Y0 = Y0; HD[i].Y1 = Y1; HD[i].w = imW;
- HD[i].Rmax = Rmax; HD[i].angles = angles;
- HD[i].mutex = &mutex;
- pthread_create(&threads[i], NULL, fill_lin_hough_array, &HD[i]);
- }
- for(i = 0; i < THREAD_NUMBER; i++)
- pthread_join(threads[i], NULL);
- pthread_mutex_destroy(&mutex);
- max = *hough++;
- Y1 = Rmax * angles;
- for(i = 1; i < Y1; i++, hough++)
- if(*hough > max) max = *hough;
- hough = hptr;
- for(i = 0; i < Y1; i++, hough++)
- *hough /= max;
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement