Форум программистов, компьютерный форум, киберфорум
Наши страницы
Алгоритмы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Rem_
24 / 24 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
1

Распознавание шахматных фигур на диаграмме

09.06.2016, 16:35. Просмотров 976. Ответов 10
Метки нет (Все метки)

Здравствуйте. Изобретаю домашний велосипед.
Есть скан книг с шахматными диаграммами. Научился искать края доски, и уточнённые местоположения белых полей (грубо по сетке ширина/8, затем алгоритм уточняющий позицию каждого отдельного поля). Ширина полей (квадратиков) может быть разной из-за масштабирования, но примерно 30...60 пикселей.
Задача: определить, какая фигура стоит в данной клетке?
Дано: двумерный массив с экрана преобразованный в оттенки серого unsigned char, координаты левого верхнего уголка и размеры текущего квадратика. Допустимо заранее подготовить файлы bmp с изображением фигур для шаблонов произвольного размера, например 200*200, чтоб потом можно было уменьшить до размеров текущего поля и сравнить.
Вопрос: Какие алгоритмы можно использовать для уменьшения массива (чтоб из 200*200 получить к примеру 31*31). И какой алгоритм использовать для сравнения сканированной клетки с уменьшенным шаблоном? Или сразу считать хэши размером 4*4?
На скрине светлым закрашены те места, где были найдены белые клетки.
0
Миниатюры
Распознавание шахматных фигур на диаграмме  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2016, 16:35
Ответы с готовыми решениями:

Размещение шахматных фигур на доске
Необходимо разместить 8 основных шахматных фигур (король, ферзь, ладьи, слоны, кони) на шахматной...

Восстановить расстановку шахматных фигур
Помогите реализовать такую задачу, заранее благодарен. Миша и Ваня играли в шахматы. Все ходы были...

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

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

Сделать логику шахматных фигур в отдельном классе
Добрый вечер, у меня по ООП надо сделать логику фигур в отдельном классе, до этого у меня логика...

10
Excalibur921
791 / 482 / 84
Регистрация: 12.10.2013
Сообщений: 3,191
10.06.2016, 12:49 2
Раз все молчат…
Цитата Сообщение от Rem_ Посмотреть сообщение
Есть скан книг с шахматными диаграммами.
Если шум+изгиб страницы? Тогда может искать хороший скан большого разрешения. Либо поиск готовые базы данных партий, тема очень известная и скорей всего будут готовые базы данных + с многих книг.
Цитата Сообщение от Rem_ Посмотреть сообщение
Ширина полей (квадратиков) может быть разной из-за масштабирования, но примерно 30...60 пикселей.
Наверно масштабировать разные интерполяцией к 1 масштабу.
Цитата Сообщение от Rem_ Посмотреть сообщение
определить, какая фигура стоит в данной клетке?
OpenCV гляньте, может есть готовые уловки.

Цитата Сообщение от Rem_ Посмотреть сообщение
двумерный массив с экрана преобразованный в оттенки серого unsigned char,
Я бы свел к черно-белому, оранжевый фон отпроситься, порядок клеток постоянный, важны только края доски.

Велик, тему не изучал:
Найти края доски, cвести масштаб доски к постоянной величине интерполяцией(билинейная или трилинейная). Сделать черно-белый кадр. В каждой клетке анализировать сетку из пикселей, с шагом например 3 пикселя.
В итоге уникальная фигура будет иметь уникальное число засвеченных ячеек сетки.

Или (вычитание картинки из картинки) вычесть из черно-белой картинки анализируемой клетки один из черно-белой картинки эталона. Считать количество черных пикселей. Затем switch case список, в какой интервал попало число такая и фигура.
0
echs
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
10.06.2016, 19:36 3
Rem_
Я тоже за черно-белый рисунок. И за прямое сравнение
эталонных изображений с реальными. К тому же разве
нельзя убрать фон там, где это можно. Ведь фон это тоже
изображение.
0
Rem_
24 / 24 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
11.06.2016, 00:08  [ТС] 4
На OpenCV есть такая страница про matchTemplate - http://docs.opencv.org/2.4/modules/imgproc/doc/object_detection.html
Есть на русском с примерами поиска глаза у кота - http://docs.opencv.org/2.4/modules/imgproc/doc/object_detection.html
Ну и статья на вики с маленьким примером кода - https://en.wikipedia.org/wiki/Template_matching

Смысл всего этого - прогнать попиксельно шаблон фигуры по диаграмме и найти места с максимальной корреляцией. Мой пример от обычного поиска части рисунка будет отличаться тем, что одной фигуры может быть несколько экземпляров, и нужно найти координаты всех фигурок. Кроме того шаблон белой пешки стоящей на чёрном квадратике будет отличаться от белой пешки на белом. Надо как-то придумать не использовать окружение фигуры для расчёта корреляции.
На некоторых сканах бывают наклоны, но они не большие. Сканирую не партии, а только позиции, на выходе будет FEN строчка.
Подскажите, как из массива 200*200 масштабировать в 30*30?
0
echs
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
11.06.2016, 08:18 5
Как из массива 200*200 сделать 30*30?
......
1. Сначала я вам покажу как из массива 210*210 сделать 30*30.
И тогда вам будет легче понять. Так как 210/30=7, то
Мы берем в левом верхнем угле массив размером 7*7.
И вычисляем цвет (средне арифметическое). И эта цифра
пойдет в первую ячейку массива 30*30. Далее очевидно...
2. Если массив "черно-белый", то считается какого "цвета"
больше, тот и пойдет в результат.
3.
Теперь перейдем к задаче, 200*200 надо преобразовать в 30*30
Не ломайте голову. Увеличьте этот массив до размера 210*210
Вам всего то надо вставит 10 строк и 10 столбцов через каждые
20!! И решайте спокойно свою задачу.
0
Rem_
24 / 24 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
13.06.2016, 13:01  [ТС] 6
Готовлю шаблоны пешки. С одной стороны если векторизовать, то получается сглаженно (в приложении), но с другой стороны можно нарисовать окружностями и линиями, тогда получится с ровными углами. Ещё вопрос в том, как ловить белые пешки на черных полях? Для этого надо что-то придумать, чтоб фон не участвовал в расчёте корреляции. Так как рисунки готовлю векторно, то экспорт в растр можно делать любого разрешения. Но думаю от 200 до 600 будет достаточно Чтоб откинуть некоторые линии и преобразовать к мелкому размеру (вместо добавления как предложено в предыдущем посте).
0
Изображения
 
Rem_
24 / 24 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
13.06.2016, 18:33  [ТС] 7
На других книгах иногда выдаёт такие сбои. В момент поиска светлых квадратиков (занятых черными фигурами) алгоритм проверяет квадрат на пиксел выше и вычисляет что он светлее. Ещё смещается на пиксел, и следующий оказывается светлее. Так происходит до тех пор, пока из квадрата не уйдёт чёрная юбка пешки. В итоге "уточненное" поле улезает вверх
0
Изображения
 
Excalibur921
791 / 482 / 84
Регистрация: 12.10.2013
Сообщений: 3,191
14.06.2016, 10:26 8
Зачем рисовать фигуры?
Нужно взять клетку с фигурой и пропустить через фильтр например из 5 на 5 пикселей:
Цитата Сообщение от geh Посмотреть сообщение
то считается какого "цвета"
больше, тот и пойдет в результат.
из рисунка 200 на 200 пикселей будет рисунок 40 на 40 это и будет для распознавания. Остальные фигуры также. Зачем уточнять пределы каждого квадрата фигуры?
Достаточно определить пределы доски, это даст координаты всех квадратов с фигурами и знание какой фон. В зависимости от фона запускать 2 вида фильтров для подготовки к распознанию и соответственно 2 вида распознающих эталонов(черные и белые фигуры). Затем считать наподобие контрольной суммы где на финальное число влияет и значение цвета пикселя и его порядковый номер на картинке.

Создание эталона:
Найти края доски- картинка квадрата с фигурой- Фильтр 5 на 5- контрольная сумма.
Распознание:
Найти края доски- картинка квадрата с фигурой- Фильтр 5 на 5- контрольная сумма- список switch case какая фигура распознана.
0
Rem_
24 / 24 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
15.06.2016, 09:32  [ТС] 9
Каждый квадрат пришлось определять отдельно потому, что некоторые криво сканированы:
Конечно, по углам диаграммы можно найти угол, на какой нужно повернуть диаграмму. Тогда нужно искать алгоритм поворота. Я решил что легче будет работать с каждой клеткой.
0
Изображения
 
Rem_
24 / 24 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
22.09.2016, 10:40  [ТС] 10
Как из сравнения можно выкинуть фон вокруг фигуры? Есть две мысли.
Одна - использовать png с прозрачностью. Тогда, если на уменьшенной картинке пиксель имеет прозрачность ниже порогового значения, то в сравнении не использовать.
Вторая - закрасить фон серым цветом (128) и использовать bmp. Тогда, если после уменьшения яркость пикселя будет 128+-, значит его не принимать при сравнении.
Какие готовые алгоритмы есть для уменьшения изображений до произвольного размера?
0
Shamil1
Модератор
2259 / 1542 / 351
Регистрация: 26.03.2015
Сообщений: 5,533
22.09.2016, 16:23 11
Цитата Сообщение от Rem_ Посмотреть сообщение
Какие готовые алгоритмы есть для уменьшения изображений до произвольного размера?
Пожалуй, любая библиотека для работы с изображениями содержит функции для изменения размера.
0
22.09.2016, 16:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2016, 16:23

Как вывести юникод символы Шахматных фигур
Не получается вывести фигуры шахмат в c++ ♔♕♖♗♘♙♚♛♜♝♞♟ Кто знает как решить проблему?

Распознавание плоских фигур
Нужно распознать фигуру по изображению, думал опереться на opencv (уже подключил к qt), однако на...

Распознавание геометрических фигур
Здравствуйте. Хотелось бы найти программу которая распознает ч.б. геометрические фигуры, круг,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru