Устранение прямоугольников, заключенных в другие прямоугольники в OpenCV - PullRequest
1 голос
/ 02 февраля 2012

Я нахожусь в процессе написания программы на C, использующей OpenCV для обнаружения некоторых прямоугольников, сделанных с помощью ленты, которые являются полыми внутри. Проблема в том, что каждый физический прямоугольник дает два цифровых прямоугольника: один для внутреннего периметра, один для внешнего периметра. Внешний прямоугольник во всех случаях полностью охватывает внутренний прямоугольник.

Мне нужен какой-то способ удаления внутренних прямоугольников, причем достаточно эффективным способом, так как он запускается на видео-канале и не должен значительно снижать частоту кадров (приблизительно 15 кадров в секунду на BeagleBoard xM, что не очень мощный).

Всегда есть четыре физических прямоугольника и где-то от четырех до восьми цифровых прямоугольников в зависимости от чистоты операций обработки. Внешний прямоугольник обнаружен надежно; внутреннего прямоугольника нет. Изображение пороговое, размытое и расширенное, так что изображение является чистым, а обнаружение в целом надежным.

Я чувствую, что эта проблема отделена от OpenCV и на самом деле просто работает с прямоугольниками и, возможно, может быть решена мной через некоторое время, но проект находится на крайнем сроке, поэтому я также задаю этот вопрос Заранее спасибо, ребята.

Ответы [ 3 ]

2 голосов
/ 02 февраля 2012

в opencv есть функция grouprectangle .

Функция может удалять несколько прямоугольников ...

Счастливого кодирования.

1 голос
/ 15 февраля 2012

Решено - быстрое решение состоит в том, чтобы взять расстояние до одного из углов от центральной точки прямоугольника и сравнить это расстояние между прямоугольниками, центры которых очень близки друг к другу.Тот, у которого более короткое расстояние, должен быть внутренним прямоугольником.

По коду вы хотите вычислить центр, а затем найти, скажем, нижнюю правую точку, которая является точкой с обоими мин.мин уРассчитайте расстояние между ними и сохраните его как-нибудь.Для каждого прямоугольника итерируйте остальные и проверьте, расположены ли их центры очень близко (в моем случае константа ~ 30px работает нормально).Сравните расстояния, рассчитанные ранее;прямоугольник с меньшим расстоянием должен быть удален из списка прямоугольников.

1 голос
/ 02 февраля 2012

Поскольку у вас есть не более 8 цифровых прямоугольников, я думаю, что было бы хорошо использовать естественный алгоритм грубой силы, чтобы выяснить, какие прямоугольники находятся внутри других прямоугольников. Можно использовать O (N ^ 2) алгоритмов, когда N мало, а 8 мало.

Вот псевдокод:

for each rectangle i {
  for each rectangle j {
    if i != j and rectangle i is inside rectangle j {
      disregard rectangle i
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...