Як розпізнати шестикутну плитку в ігровій дошці?


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);

Образ лапласіана виглядає так: лаплаціан

Я спробую оптимізувати параметри цього підходу, а потім спробую інтерполювати межі чотирьох розділів.


5
Обробка сигналів відповідає євро-іграм; мої виховані відчуття поколюються!
nispio

1
Якщо ви завжди використовуєте дошку одного розміру і завжди буде мати приблизно однаковий вигляд дошки на зображенні, то ви, можливо, зможете вирішити проблему просто як розпізнавання контуру дошки для визначення розміру та реєстрації. Розміщення та розмір плиток є постійним щодо країв дошки, тому, коли ви дізнаєтесь, де всі ваші краї, ви зможете точно визначити положення внутрішніх плиток.
nispio

Дякую за пропозицію, @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. Використовуйте дескриптор характеристик, щоб описати функцію, знайдену на зображенні (наприклад, "BRIEF").

Виявлення

Тепер ви можете виявити плитки на зображенні, застосувавши до цього зображення ті самі алгоритми детектора / дескриптора. Коли ви придбали функції / дескриптори, ви можете застосувати FlannBasedMatcher для пошуку плиток.

Ось приклад коду / підручник від OpenCV: http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html#feature-homography

Примітки

Метод Matcher дасть вам лише одну відповідність і, можливо, виникнуть проблеми, якщо на дошці знайдеться більше однієї плитки такого типу. Ви можете вирішити цю проблему, маскуючи лише деякі частини вхідного зображення. Я пропоную це зробити за допомогою піксельних координат виявлених функцій. Якщо ви - якимось чином - спочатку визначите контур та розмір плитки, ви можете приблизно оцінити положення та розмір плитки на малюнку. Фільтруйте свій виявлений список функцій (наприклад, лише функції в радіусі x-пікселя від очікуваної середини плитки) перед збігом, а потім використовуйте найсильнішу відповідність. В результаті вам буде вказано точне розташування плитки на зображенні (включаючи її орієнтацію). Якщо виявити контур карти занадто складно, ви можете дозволити користувачеві "вказати" на кутові плитки, щоб позначити контур вручну ...

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

Ви також можете використовувати цей метод, щоб знайти будь-яку з плиток за її контуром. Намалюйте зразок «схематичного» зображення в градаціях сірого плитки (шестикутник) без зображення на ній. Зауважте, що "темні" та "світлі" області на цьому зображенні повинні бути правильними у схематичних, а не лише у деяких "лініях". Вам, мабуть, доведеться експериментувати з цим. Ви можете спробувати порівняти кілька фотографій різних плиток, щоб створити "середнє" зображення плитки. Переконайтесь, що кути знаходяться в одному положенні (відповідно перемістіть / масштабуйте зображення) і загостріть зображення після завершення (чіткі кути / краї повинні бути видні) і трохи відрегулюйте контраст.


Дякуємо за вашу пропозицію @StefanK. Мене трохи хвилює, якщо перший і другий підхід все-таки спрацьовують, якщо ігрові фігури (будинки) лежать на плитці. Ваш альтернативний підхід виглядає багатообіцяючим, я спробую це (можливо, після невеликої попередньої обробки).
snalx

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

Будинки та інші ігрові фігури на плитці не повинні бути проблемою. Це спричиняє прикриття деяких "особливостей", але деякі з них все одно будуть виявлені. Щонайменше 4 потрібно виявити. Ви можете спробувати демо-функції виявлення функцій opencv і подивитися, скільки функцій виявлено на кожній плитці ...
SDwarfs

3

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

Відповідні правила гри

Реалізація

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

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

Тоді я використовую функцію виявлення функцій, запропоновану Стефаном К. у своїй відповіді, для виявлення особливостей зображення, які не можуть прийняти гравці, тобто замки, розташування плиток та гори. Я використовую алгоритм ORB у opencv-python для цього і BruteForce-Hamming-Matcher (я ще не зміг запустити FlannBase matcher). ORB - інваріант масштабу та обертання. З метою виявлення декількох випадків однакових особливостей (наприклад, замків) я розділив зображення на частини, які перекриваються. Це прекрасно спрацьовує, якщо довга роздільна здатність зображення є достатньо великою, а зображення зроблено безпосередньо зверху (все ще потрібні деякі тести). Це також різновид повільного. Виявлення розташування плитки (таверни) показано як приклад на зображенні нижче виявлення особливості замку

На даний момент я намагаюся знайти гомографічну трансформацію для отримання точного положення та орієнтації виявлених ознак.

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


Я зробив щось подібне з Катаном, але замість гомографії я використовую середнє значення кольору для будь-якої даної плитки. Визначте плитку як 6-лицьовий поліконтур з попередньою обробкою, щоб допомогти ізолювати краї, потім перетворити ROI в маску, потім нанесіть маску побіжно_і над вихідним зображенням. Потім ви можете отримати середній колір, якого може бути достатньо для виявлення більшості плиток, а потім можна зробити додаткове узгодження шаблону. Я щойно почав це: youtube.com/watch?v=0ezfyWkio6c
Рекс Хардін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.