2010-01-14 5 views
12

Я пытаюсь использовать OpenCV для «синтаксического анализа» скриншотов из игры iPhone Blocked. Снимки экрана обрезаются выглядеть следующим образом:Поиск расположения прямоугольников в изображении с OpenCV

Blocked screenshot

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

+1

Просто выбросьте прямоугольники, которые являются неправильным цветом. –

ответ

13

Аналогичный вопрос уже обсуждался: How to recognize rectangles in this image?

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

binarized picture http://img691.imageshack.us/img691/975/rectk.png

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

+0

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

0

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

+0

Определение угла Гарриса было бы абсолютно бесполезным, поскольку все углы уже известны, игра в идеальной сетке. –

2

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

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

element = [ 1 1 
      1 1 ] 

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

3

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

5

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

screenshot

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