Я хотел бы распознать границы гексагональной плитки на фотографии, как на картинке ниже:
Мне кажется, что стандартный подход в квадратной сетке состоит в том, чтобы сначала обнаружить углы (например, хитрый), а затем извлечь самые длинные линии с помощью преобразования Хафа или чего-то подобного.
Это не выглядит оптимальным решением с шестигранной черепицей, потому что длина внешних линий короче, и их трудно отделить от других линий.
Есть ли алгоритм для решения этой проблемы? Было бы особенно приятно иметь решение в 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);
Лапласиан изображения выглядит так:
Я попытаюсь оптимизировать параметры этого подхода, а затем попытаться интерполировать границы четырех разделов.
Ответы:
1-й подход:
Используйте методы haartraining opencv в соответствии с этим руководством http://note.sonots.com/SciSoftware/haartraining.html - это должно дать наилучшие результаты, но я до сих пор не работал с haartraining ...
2-й подход:
Я бы предложил использовать методы «безмаркерного отслеживания» отдельных фишек доски. Вы также можете реализовать это с помощью OpenCV ..
подготовка
Для этого вам понадобятся несколько фотографий каждого типа плитки. Сфотографируйте все типы плиток (каждый в виде одного рисунка) с однородным фоном из мозаики сверху вниз в середине рисунка.
Затем используйте детектор некоторых функций (для этого в OpenCV есть несколько алгоритмов, но SIFT / SURF - несвободные алгоритмы; я бы предложил использовать «FAST»), чтобы найти отличительные точки на изображениях.
Используйте дескриптор функции для описания функции, найденной на изображении (используйте, например, «КРАТКОЕ ОПИСАНИЕ»).
обнаружение
Теперь вы можете обнаружить плитки на изображении, применив к этому изображению те же алгоритмы детектора / дескриптора признаков. Когда вы приобрели функции / дескрипторы, вы можете применить FlannBasedMatcher, чтобы найти плитки.
Вот пример кода / учебник из OpenCV: http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html#feature-homography
Примечания
Метод Matcher даст вам только одно совпадение и, возможно, будет иметь проблемы, если на доске будет найдено более одного фишки этого типа. Вы можете обойти эту проблему, маскируя только некоторые части входного изображения. Я предлагаю сделать это, используя пиксельные координаты обнаруженных объектов. Если вы - каким-то образом - сначала определите контур и размер плиток, вы можете приблизительно оценить их расположение и размер на картинке. Отфильтруйте обнаруженный список объектов (например, только объекты в радиусе x пикселей от ожидаемой средней точки элемента мозаичного изображения) перед сопоставлением, а затем используйте самое сильное сопоставление. В результате вы получите точное положение плитки на изображении (включая ее ориентацию). Если слишком сложно определить контур карты, вы можете позволить пользователю «указать» на угловые плитки, чтобы отметить контур вручную ...
Альтернативный подход
Вы также можете использовать этот метод, чтобы найти любую из плиток по ее контуру. Нарисуйте образец "схематического" изображения в градациях серого для плитки (шестиугольника) без какого-либо изображения на нем. Обратите внимание, что «темные» и «светлые» области на этом изображении должны быть правильными на схеме, а не только некоторые «линии». Вам, вероятно, нужно будет поэкспериментировать с этим. Вы можете попытаться усреднить несколько фотографий разных плиток, чтобы создать «среднее» изображение плитки. Убедитесь, что углы находятся в одинаковом положении (соответственно переместите / масштабируйте изображения), и по окончании сделайте изображение более четким (должны быть видны четкие углы / края) и при необходимости отрегулируйте контрастность.
источник
Я опишу свой текущий подход, который представляет собой комбинацию использования правил игры, обработки изображений и обнаружения функций.
Соответствующие правила игры
реализация
Сначала я использую преобразование Хафа, чтобы извлечь положение игрового поля. Исходное изображение выглядит аналогично рассматриваемому конечному изображению, но с более толстыми линиями, и я отфильтровал меньшие границы. Я использую только обнаружение очень длинных линий (порядка величины: около 60 процентов ширины / высоты изображения) и очень маленького порога для соответствия строк. Я также просто смотрю на линии на внешних 40 процентах изображения и беру медиану обнаруженных линий сверху, снизу, слева и справа. Результат показан на изображении ниже:
Мне нужно только приблизительное приближение, так что это нормально. С сегодняшнего дня я только исследую изображение внутри линий Хафлина, а также дополнительное пространство из-за неопределенности преобразования Хафа.
Затем я использую обнаружение объектов, как предложил Стефан К. в своем ответе, чтобы обнаружить объекты на изображении, которые не могут быть восприняты игроками, например, замки, тайлы расположения и горы. Для этого я использую алгоритм ORB в opencv-python и BruteForce-Hamming-Matcher (я еще не смог запустить FlannBased matcher). ORB является инвариантом масштаба и вращения. Чтобы обнаружить несколько случаев появления одинаковых объектов (например, замков), я разделяю изображение на части, которые перекрываются. Это прекрасно работает, так как длинное разрешение изображения достаточно велико, и изображение берется непосредственно сверху (все еще нужны некоторые тесты). Это также немного медленно. Определение местоположения плитки (таверна) показано в качестве примера на изображении ниже
В данный момент я пытаюсь найти преобразование homographyTransform, чтобы извлечь точное положение и ориентацию обнаруженных объектов.
Я надеюсь, что смогу восстановить сетку на основе этой информации (положение гор, замок, расположение плиток и в большинстве случаев вода). Эксперименты по течению выглядят многообещающе, хотя необходимо провести большую тонкую настройку и надлежащую подготовку изображений объектов.
источник