OpenCV: обнаружение параболы с помощью Hough Transform - PullRequest
2 голосов
/ 14 июля 2011

Я хочу обнаружить параболу (ы) типа: y ^ 2 = 4a * x на изображении [размер: 512 X 512].Я подготовил массив аккумуляторов, в соответствии с [размер: 512 х 512 х 512].Я подготовил МАТРИЦУ, соответствующую этому образу.Я использовал Hough-Transform.Вот как я это сделал:

for x = 1 to 512
  for y= 1 to 512
   if image_matrix(x,y)> 245//almost white value, so probable to be in parabola
   {
     for x1= 1 to 512
       for y1= 1 to 512
       {
           calculate 'a' from (y-y1)^2 = 4*a*(x-x1).
           increment acc(i,j,k) by 1
       }
   }

if acc(i,j,k) has a maximum value.
{
   x1=i, y1=j,a =k
}

Я столкнулся со следующими проблемами:

1) acc [512] [512] [512] занимает большую память.Это требует огромных вычислений. Как я могу уменьшить размер массива и таким образом минимизировать вычисления?2) Не всегда максимальная запись acc (i, j, k) дает намеченный результат.Иногда второе или третье максимальное и даже 10-ое максимальное значение дают ожидаемый результат.Мне нужно ок.значение 'a', 'x1', 'y1' (не точное значение).

Пожалуйста, помогите мне.Что-то не так в моей концепции?

1 Ответ

2 голосов
/ 14 июля 2011

То, что я собираюсь сказать, может лишь частично ответить на ваш вопрос, но это должно сработать.

Если вы хотите найти параболы такого типа

 y^2 = 4a*x

Тогда они параметризуются только одним параметром, который является 'a'. Поэтому я не очень понимаю, почему вы используете аккумулятор 3-х измерений.

Конечно, если вы хотите найти параболу с более общим уравнением, например:

y = ax^2 + bx + c

или в направлении y, заменив x на y, вам потребуется трехмерный аккумулятор, как в вашем примере.

Я думаю, что в вашем случае проблему можно легко решить, сказав, что вам нужен только один аккумулятор (поскольку у вас есть только один параметр для накопления: a)

Вот что я бы предложил:

  for every point (x,y) of your image (x=0 exclusive) {
      calculate (a = y^2 / 4x ) 
      add + 1 in the corresponding 'a' cell of your accumulator 
      (eg: a = index of a simple table)
  }

  for all the cells of your accumulator {
      if (cell[idx] > a certain threshold) there is a certain parabola with a = idx
  }

Надеюсь, это поможет вам, На это тоже интересно посмотреть: Жюльен

...