2013-07-05 4 views
0

Я хочу распознать фигуры, такие как круг, треугольник и прямоугольник, который нарисован на экране. Моя главная цель - это рисовать фигуру на экране, и мне нужен код для распознавания этой формы. Как я должен подходить к этой проблеме?Распознавание формы Android на экране

+0

Добро пожаловать в stackoverflow. Что вы пытались решить вашу проблему?Пожалуйста, прочитайте следующее и улучшите свой вопрос: http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist –

ответ

1

То, что вы пытаетесь достичь может быть довольно сложно, но мне пришлось реализовать что-то подобное некоторое время назад, и вот тот подход, который я использовал:

  • придерживаться черный & белые рисунки
  • имеют небольшую базу данных (черные & белые) рисунки (50 или около того) с фиксированным разрешением, скажем 256x256 (вы можете сохранить их в sqlite как бинарные капли, если хотите). Убедитесь, что вы используете прилично толстые линии для этих рисунков (10 пикселей должны быть в порядке или примерно вдвое больше, чем входной чертеж пользователя). Кроме того, чертежи должны быть нормализованы, что означает, что они должны иметь по крайней мере один из их размеров размером с изображение.
  • извлечь форму, нарисованный пользователем и обработать его:

а), если он имеет соотношение сторон близко к площади, а затем просто обрезать белое пространство вокруг него и увеличить таким образом, что он имеет то же самое как ваши изображения в базе данных

b) В противном случае это, скорее всего, будет иметь одно измерение примерно в два раза больше, чем другое, и в этом случае вы обрезаете пустое пространство, поверните его, чтобы высота была самой большой, увеличьте до 256x128, а затем добавить на обе стороны 64 px пробела.

  • вам нужно будет сравнить ваш рисунок с каждым из изображений вашей базы данных за пикселем и определить количество черных пикселей, которые перекрываются для каждого изображения базы данных. Затем вы сортируете эти цифры, и вы получите лучший результат. Даже если наилучшее совпадение имеет менее 20% перекрывающихся пикселей, результаты обычно хороши.
  • Потому что некоторые формы можно считать одинаковыми, даже если они повернуты (представьте себе различные способы размещения треугольника в изображении: один кончик, указывающий вверх или вниз, или в сторону одной стороны и т. Д.), Вы, вероятно, захотите вращайте свой входной чертеж в 12 - 24 раза (на 15 - 30 градусов на каждом шаге) и сравните каждое вращение с каждым изображением в вашей базе данных. Учитывая, что этот шаг, скорее всего, потребует большой вычислительной мощности, вы можете подумать о сохранении всех поворотов ваших исходных чертежей базы данных в базе данных в виде разных изображений, тем самым делая базу данных более крупной, но экономя при этом усилия по вращению входного изображения , что является дорогостоящим.

Учитывая, что приведенный выше алгоритм является немного ресурсоемкой, вы можете подумать о том, что у вас есть сервер, который может выполнять фактические сравнения, особенно если вы хотите добавить много изображений в свою базу данных. Поскольку я уже реализовал этот алгоритм для демонстрационного приложения, я уже могу сказать вам, что вам придется делать много операций с пикселями. Кроме того, вращение изображений с помощью Android SDK может быть раздражающим, поскольку оно изменяет размеры изображения ...

Если вы чувствуете себя авантюристом, вот несколько статей, описывающих современные алгоритмы решения этой проблемы: «Shape contexts enable efficient retrieval of similar shapes «Грег Мори, Серж Белонге и Джитендра Малик (2001) и« Shape Matching: Similarity Measures and Algorithms »Ремко К. Вельткампа (2001). Однако математика может быть немного тяжелой.

Смежные вопросы