Распознавание фигур Android на экране
Я хочу распознать фигуры, такие как круг, треугольник и прямоугольник, которые нарисованы на экране. Моя главная цель - нарисовать фигуру на экране, и мне нужен код для распознавания этой фигуры. Как мне подойти к этой проблеме?
2 ответа
То, что вы пытаетесь достичь, может быть довольно сложным, но я случайно реализовал нечто подобное, и вот подход, который я использовал:
- придерживаться черно-белых рисунков
- иметь небольшую базу данных (черно-белых) рисунков (50 или около того) с фиксированным разрешением, скажем, 256x256 (вы можете сохранить их в sqlite в виде двоичных объектов, если хотите). Убедитесь, что вы используете прилично толстые линии для этих рисунков (10 пикселей должно быть в порядке, или что-то примерно в два раза толще, чем входной чертеж пользователя). Кроме того, рисунки должны быть нормализованы, что означает, что они должны иметь по крайней мере один из своих размеров, равный самому изображению.
- извлеките нарисованную пользователем форму и обработайте ее:
а) если у него соотношение сторон близко к квадрату, то просто обрежьте пустое пространство вокруг него и увеличьте его так, чтобы оно имело тот же размер, что и изображения вашей базы данных
б) В противном случае он, скорее всего, будет иметь одно измерение примерно в два раза больше другого, и в этом случае вы обрезаете пустое пространство, поворачиваете его, чтобы получить высоту, равную его наибольшему размеру, увеличиваете его до 256x128, а затем добавляете с обеих сторон. 64 пикселя пустого пространства.
- вам придется сравнивать рисунок с каждым изображением вашей базы данных попиксельно и определять количество черных пикселей, которые перекрываются для каждого изображения базы данных. Затем вы сортируете эти числа, и вы получите лучшее совпадение. Даже если наилучшее совпадение имеет перекрывающиеся пиксели менее чем на 20%, результаты обычно хорошие.
- Поскольку некоторые фигуры можно считать одинаковыми, даже если они повернуты (представьте различные способы размещения треугольника на изображении: один наконечник, направленный вверх, или вниз, или в сторону одной стороны и т. Д.), Вы, вероятно, захотите повернуть ввод рисовать примерно 12 - 24 раза (на 15 - 30 градусов на каждом шаге) и сравнивать каждое вращение с каждым изображением в вашей базе данных. Учитывая, что этот шаг, скорее всего, потребует большой вычислительной мощности, вы можете рассмотреть вопрос о сохранении всех поворотов ваших исходных чертежей базы данных в базе данных в виде различных изображений, что позволит увеличить базу данных, но сэкономит вам усилия на повороте входного изображения., что дорого.
Принимая во внимание, что приведенный выше алгоритм является чем-то вроде погони за ресурсами, вы можете рассмотреть вопрос о наличии где-нибудь сервера, который может выполнять фактические сравнения, особенно если вы хотите добавить много изображений в вашу базу данных. Поскольку я уже реализовал этот алгоритм для демонстрационного приложения, я уже могу сказать вам, что вам придется выполнять много операций с пикселями. Кроме того, вращение изображений с помощью Android SDK может раздражать, поскольку оно меняет размеры изображения...
Если вы любите приключения, вот пара статей, описывающих современные алгоритмы решения этой проблемы: "Грег Мори, Серж Белонги и Джитендра Малик (2001) и" Формирование соответствия: Меры и алгоритмы подобия "Ремко К. Вельткампа (2001). Математика может быть немного тяжелой, хотя.
Вы должны посмотреть в GestureOverlayView. Хороший учебник: http://www.vogella.com/articles/AndroidGestures/article.html