Поиск местоположения прямоугольников на изображении с помощью OpenCV - PullRequest
13 голосов
/ 15 января 2010

Я пытаюсь использовать OpenCV для "разбора" скриншотов из игры для iPhone Заблокировано . Скриншоты обрезаны, чтобы выглядеть так:

Blocked screenshot

Полагаю, сейчас я просто пытаюсь найти координаты каждой из 4 точек, составляющих каждый прямоугольник. Я видел пример файла squares.c, который поставляется с OpenCV, но когда я запускаю этот алгоритм на этом рисунке, он содержит 72 прямоугольника, включая прямоугольные области пробела, которые я, очевидно, не хочу считать одним из прямоугольники. Как лучше подойти к этому? Я пытался провести какое-то исследование Google, но для всех результатов поиска очень мало релевантной полезной информации.

Ответы [ 5 ]

14 голосов
/ 15 января 2010

Подобная проблема уже обсуждалась: Как распознать прямоугольники на этом изображении?

Что касается ваших данных, прямоугольники, которые вы пытаетесь найти, являются единственными черными объектами.Таким образом, вы можете попытаться выполнить пороговую бинаризацию: черные пиксели - это те, у которых ВСЕ три значения RGB меньше 40 (я нашел это эмпирически).Эта простая операция делает вашу картинку похожей на это:

binarized picture

После этого вы можете применить преобразование Хафа, чтобы найти строки (обсуждаемые в теме, на которую я ссылался)Или вы можете сделать это проще.Вычислить интегральные проекции черных пикселей на оси X и Y.(Проекция на X является вектором x_i - числа черных пикселей, для которого первая координата равна x_i).Таким образом, вы получаете возможные значения x и y как пики проекций.Затем просмотрите все возможные сегменты, ограниченные найденными x и y (если между (x_i, y_j) и (x_i, y_k) много черных пикселей, вероятно, есть линия).Наконец, составьте отрезки в прямоугольники!

6 голосов
/ 16 января 2010

Я закончил, просто опираясь на свой оригинальный метод и поступая так, как предложил Роберт в своем комментарии к моему вопросу. После того, как я получу свой список прямоугольников, я пробегаюсь и вычисляю средний цвет по каждому прямоугольнику. Я проверяю, находятся ли красный, зеленый и синий компоненты среднего цвета в пределах 10% от серого и синего цветов прямоугольника, и если они есть, я сохраняю прямоугольник, если нет, я отбрасываю его. Этот процесс дает мне что-то вроде этого:

screenshot

Отсюда легко получить необходимую информацию (ориентацию, начальную точку и длину каждого прямоугольника, рассматривая игровое окно как сетку 6x6).

3 голосов
/ 15 января 2010

Блоки выглядят как растровые изображения - почему бы вам не использовать простое сопоставление шаблонов с различными шаблонами для каждого размера блока / цвета / ориентации?

2 голосов
/ 15 января 2010

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

Использование структурного элемента, который выглядит следующим образом:

 element = [ 1 1
             1 1 ]

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

0 голосов
/ 15 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...