Признание рукописных фигур

Я хочу распознать форму почерка и выяснить, какая форма, вероятно, находится в наборе. Просто говоря, если я рисую треугольник, приложение должно распознать его как треугольник. Как я могу это сделать с помощью С# или java, любая помощь будет оценена.

Спасибо заранее.

Вот некоторые из форм, которые мне нужно идентифицировать enter image description here

Ответ 1

Вы можете использовать OpenCV. EmguCV - хорошая оболочка для OpenCV для .net. Следите за демонстрацией ShapeDetection (включенной в OpenCV)

Ответ 2

Если вы хотите "перевернуть свой", я бы предложил следующие шаги:

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

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

(Возможный шаг в этой точке: сгладить контур, потянув каждую вершину ближе к среднему значению ее соседей)

Теперь вы используете алгоритм определения угла, чтобы найти углы (посмотрите здесь: http://visual.ipan.sztaki.hu/corner/node7.html).

Этого должно быть достаточно, чтобы определить фигуры, которые вы указали.

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

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

Ответ 3

Я бы предложил использовать нейронную сеть .

Вы можете научить его, как выглядят фигуры.

Это одна библиотека, например:

Нейронные сети на С#

Ответ 4

Если вы ищете конкретные фигуры внутри большего изображения, то OpenCV - отличная альтернатива. Emgu.CV - это хорошая оболочка .Net для него. Для этого смотрите мою картину реализации SURF. Также см. другие параметры в OpenCV, у него есть что предложить. Обратите внимание, что для этого подхода требуется большая вычислительная мощность.

Если вы можете легко определить форму, которую вы хотите как BLOB (то есть дать алгоритму изображение только этой формы), вы можете выполнить поиск "ANN OCR" ( "Искусственные нейронные сети" и "Оптическое распознавание символов" "). Многие (большинство?) ANN-реализаций поставляются с образцом кода для подачи его фигур (букв) и распознавания ближайшей формы (рукописные буквы). Например OCR нейронной сети. Я считаю, что этот подход поможет решить вашу проблему. (Sidenote: я столкнулся и протестировал множество libs, которые могут это сделать. Neural Networks 101.)

Если вам нужны BLOB-алгоритмы для ANN-OCR, OpenCV может это предоставить.

Оба этих подхода легко реализовать.

Ответ 5

Существует действительно огромное дерево исследований в области распознавания формы.
Если ваши фигуры действительно являются некоторыми предсказуемыми и являются базовой геометрией,
самый простой способ - найти края и применить преобразование hough.

Некоторые управляемые материалы для чтения, с которых вы начнете, [1] Google Scholar для определения формы трансформации Hough http://scholar.google.com/scholar?q=hough+transform+shape+recognition&hl=en&as_sdt=0&as_vis=1&oi=scholart [2] Hough Transform @Wiki http://en.wikipedia.org/wiki/Hough_transform