C ++ исправляет пример OpenCV squares.cpp для объединения близких квадратов - PullRequest
2 голосов
/ 17 сентября 2011

Я играл с образцом OpenCV squares.cpp, чтобы найти угловые координаты квадратов в изображении.

Образец иногда соответствует каждому объекту несколько раз. Теперь я хочу «объединить», вычислить средние угловые координаты для каждого квадрата, который, кажется, принадлежит одному и тому же объекту.

Результирующая структура функции findSquares представляет собой трехмерную векторную структуру типа:

[
    [[10,10],[100,10],[100,100],[10,100]], // First square
    [[100,100],[300,100],[300,100],[100,300]], // Second square
    [[8,11],[110,5],[106,109],[10,97]], // Should be meged with the first square 
    [[112,99],[296,103],[312,98],[92,300]] // Should be merged with the second square
]

(я новичок в C ++, поэтому я пишу векторную структуру в нотации массива JavaScript, просто для визуализации структуры)

Моя идея состоит в том, чтобы:

  • Найти все квадраты, совпадающие друг с другом (все 4 точки в пределах максимального расстояния, остальные 4 точки)
  • Сгруппируйте их и вычислите средние 4 точки квадратов
  • Сохранить новый усредненный квадрат в результирующем векторе

Есть ли хороший алгоритм для этого? Есть ли в OpenCV один встроенный? Есть ли лучший подход к этому?

1 Ответ

1 голос
/ 17 сентября 2011

Альтернатива:

Order by `x` coordinate of first point (the point closes to the origin or something)
For each square:
   Search forwards for a matching point until the `x` coordinate is bigger than the threshold.

Это должно быть около O(nlogn+n) = O(nlogn), но может быть O(n^2), если у вас много квадратов близко друг к другу.

...