Как распознать гексагональную плитку в настольной игре?

16

Я хотел бы распознать границы гексагональной плитки на фотографии, как на картинке ниже:

введите описание изображения здесь

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

Это не выглядит оптимальным решением с шестигранной черепицей, потому что длина внешних линий короче, и их трудно отделить от других линий.

Есть ли алгоритм для решения этой проблемы? Было бы особенно приятно иметь решение в opencv, но меня также интересуют общие идеи.

Обновить:

С помощью python и opencv я смог получить такой результат: контуры

Вот мой код:

import cv2
import numpy as np

imgOrig = "test1";
img = cv2.imread(imgOrig+".jpg");  
lap = cv2.Laplacian(img, cv2.IPL_DEPTH_32F, ksize = 3)  
imgray = cv2.cvtColor(lap,cv2.COLOR_BGR2GRAY)  
ret,thresh = cv2.threshold(imgray,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
size = img.shape
m = np.zeros(size, dtype=np.uint8)
for i, cnt in enumerate(contours):
    if cv2.contourArea(cnt) >= 1:
        color = (255,255,255)
        cv2.drawContours(m, cnt, -1, color, -1)
cv2.imwrite(str(imgOrig)+"contours.jpg", m);

Лапласиан изображения выглядит так: лапласиан

Я попытаюсь оптимизировать параметры этого подхода, а затем попытаться интерполировать границы четырех разделов.

snalx
источник
5
Обработка сигналов соответствует Euro-Gaming; мои чувства выродка покалывания!
Ниспио
1
Если вы всегда используете доску одного размера и всегда будете иметь примерно одно и то же изображение платы на изображении, то вы можете решить эту проблему, просто узнав схему доски для определения размеров и регистрации. Расположение плиток и их размер являются постоянными по отношению к краям доски, поэтому, как только вы узнаете, где находятся все ваши края, вы сможете точно определить положение внутренних плиток.
Ниспио
Спасибо за ваше предложение, @nispio. Размер платы всегда одинаков, в то время как вид платы может немного измениться. Цвет фона также отличается на других снимках, что приводит к гораздо более низкому контрасту. Если фон бежевого цвета, например, положение контура определить сложно.
snalx
1
Если вы не получили никаких других ответов, я думаю, что будет хорошей идеей опубликовать свои изменения в качестве ответа на свой вопрос. Я не уверен, как это взаимодействует с наградой все же!
lmjohns3
1
@snalx: Если вы опубликуете свои выводы в качестве ответа, я назначу вам награду. Это необходимо сделать в ближайшие 12 часов.
Янв

Ответы:

6

1-й подход:

Используйте методы haartraining opencv в соответствии с этим руководством http://note.sonots.com/SciSoftware/haartraining.html - это должно дать наилучшие результаты, но я до сих пор не работал с haartraining ...

2-й подход:

Я бы предложил использовать методы «безмаркерного отслеживания» отдельных фишек доски. Вы также можете реализовать это с помощью OpenCV ..

подготовка

  1. Для этого вам понадобятся несколько фотографий каждого типа плитки. Сфотографируйте все типы плиток (каждый в виде одного рисунка) с однородным фоном из мозаики сверху вниз в середине рисунка.

  2. Затем используйте детектор некоторых функций (для этого в OpenCV есть несколько алгоритмов, но SIFT / SURF - несвободные алгоритмы; я бы предложил использовать «FAST»), чтобы найти отличительные точки на изображениях.

  3. Используйте дескриптор функции для описания функции, найденной на изображении (используйте, например, «КРАТКОЕ ОПИСАНИЕ»).

обнаружение

Теперь вы можете обнаружить плитки на изображении, применив к этому изображению те же алгоритмы детектора / дескриптора признаков. Когда вы приобрели функции / дескрипторы, вы можете применить FlannBasedMatcher, чтобы найти плитки.

Вот пример кода / учебник из OpenCV: http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html#feature-homography

Примечания

Метод Matcher даст вам только одно совпадение и, возможно, будет иметь проблемы, если на доске будет найдено более одного фишки этого типа. Вы можете обойти эту проблему, маскируя только некоторые части входного изображения. Я предлагаю сделать это, используя пиксельные координаты обнаруженных объектов. Если вы - каким-то образом - сначала определите контур и размер плиток, вы можете приблизительно оценить их расположение и размер на картинке. Отфильтруйте обнаруженный список объектов (например, только объекты в радиусе x пикселей от ожидаемой средней точки элемента мозаичного изображения) перед сопоставлением, а затем используйте самое сильное сопоставление. В результате вы получите точное положение плитки на изображении (включая ее ориентацию). Если слишком сложно определить контур карты, вы можете позволить пользователю «указать» на угловые плитки, чтобы отметить контур вручную ...

Альтернативный подход

Вы также можете использовать этот метод, чтобы найти любую из плиток по ее контуру. Нарисуйте образец "схематического" изображения в градациях серого для плитки (шестиугольника) без какого-либо изображения на нем. Обратите внимание, что «темные» и «светлые» области на этом изображении должны быть правильными на схеме, а не только некоторые «линии». Вам, вероятно, нужно будет поэкспериментировать с этим. Вы можете попытаться усреднить несколько фотографий разных плиток, чтобы создать «среднее» изображение плитки. Убедитесь, что углы находятся в одинаковом положении (соответственно переместите / масштабируйте изображения), и по окончании сделайте изображение более четким (должны быть видны четкие углы / края) и при необходимости отрегулируйте контрастность.

SDwarfs
источник
Спасибо за ваше предложение @StefanK. Я немного волнуюсь, если первый и второй подход все еще работают, если игровые фигуры (дома) лежат на плитках. Ваш альтернативный подход выглядит многообещающе, я попробую это (возможно, после небольшой предварительной обработки).
snalx
Обнаружение внешних линий представляется возможным в большинстве случаев. Я недавно попробовал это с Hough transfom на изображениях, похожих на конечный результат в моем вопросе. Я обновлю свой вопрос, когда найду стабильное решение.
snalx
Дома и другие игровые предметы на плитках не должны быть проблемой. Это приводит к тому, что некоторые «функции» будут раскрыты, но некоторые из них все равно будут обнаружены. По крайней мере 4 должны быть обнаружены. Вы можете попробовать демки обнаружения функций opencv и посмотреть, сколько функций обнаружено на каждой плитке ...
SDwarfs
3

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

Соответствующие правила игры

реализация

Сначала я использую преобразование Хафа, чтобы извлечь положение игрового поля. Исходное изображение выглядит аналогично рассматриваемому конечному изображению, но с более толстыми линиями, и я отфильтровал меньшие границы. Я использую только обнаружение очень длинных линий (порядка величины: около 60 процентов ширины / высоты изображения) и очень маленького порога для соответствия строк. Я также просто смотрю на линии на внешних 40 процентах изображения и беру медиану обнаруженных линий сверху, снизу, слева и справа. Результат показан на изображении ниже: Хау трансформация

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

Затем я использую обнаружение объектов, как предложил Стефан К. в своем ответе, чтобы обнаружить объекты на изображении, которые не могут быть восприняты игроками, например, замки, тайлы расположения и горы. Для этого я использую алгоритм ORB в opencv-python и BruteForce-Hamming-Matcher (я еще не смог запустить FlannBased matcher). ORB является инвариантом масштаба и вращения. Чтобы обнаружить несколько случаев появления одинаковых объектов (например, замков), я разделяю изображение на части, которые перекрываются. Это прекрасно работает, так как длинное разрешение изображения достаточно велико, и изображение берется непосредственно сверху (все еще нужны некоторые тесты). Это также немного медленно. Определение местоположения плитки (таверна) показано в качестве примера на изображении ниже обнаружение элементов замка

В данный момент я пытаюсь найти преобразование homographyTransform, чтобы извлечь точное положение и ориентацию обнаруженных объектов.

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

snalx
источник
Я сделал что-то похожее с Catan, но вместо гомографии я использую среднее значение цвета для любой плитки. Определите плитку как 6-гранный многоконтурный контур с предварительной обработкой, чтобы помочь изолировать края, затем преобразовать эту область интереса в маску, а затем применить маску с помощью bitwise_and к исходному изображению. Затем вы можете получить средний цвет, которого может быть достаточно для идентификации большинства плиток, а затем вы можете выполнить дополнительное сопоставление с образцом. Я только начал это: youtube.com/watch?v=0ezfyWkio6c
Рекс Хардин