Распознавание нарисованных фигур
В 2016 Google опубликовал игру-дудл Magic Cat Academy. Она напомнила мне игру Гарри Поттер и Философский камень, где для изучения заклинания его нужно было максимально точно нарисовать. Вдохновившись этим геймплеем, я решил разработать собственный распознаватель жестов.
Среди общедоступных вариантов есть весьма неплохая библиотека $1, но она иногда слишком параноидальна и видит правильный жест там, где его нет.
Изначально я сделал распознавание фигуры через приведение ее к прямым и диагональным линиям. Этот способ хорошо работает с фигурами типа V, ^, Z, W, но для распознавания округлых фигур необходимо поддерживать вариативность правил распознавания. На рисунке ниже изображены правила для распознавания фигуры pigtail (хвост свиньи). Секции с вопросительным знаком могут присутствовать или отсутствовать, в остальных блоках должна присутствовать хотя бы одна из указанных секций.
Для того, чтобы упростить работу с округлыми фигурами, я заменил ламанные линии на кривые Безье. Это немного снизило скорость распознавания, но позволило распознавать более сложные фигуры.
В правиле распознавания можно начальный и конечный углы, соотношения длины кривой к длине контрольных линий, ограничения на дистанцию между начальной и конечной точками, а так же правила для внутренних точек.
Вот как теперь выглядят правила для распознавания pigtail:
Код библиотеки я выложил на github, надеюсь кому-то он пригодится :)
На хабре лет 6-7 назад была статья о распознавании через приведение контура сначала к замкнутому, потом к вектору комплексных чисел. Сумма членов вектора ЕМНИП однозначно характеризовала фигуру вне зависимости от угла поворота, может полезно будет. Я по нейросетям лабу сделал именно на таком алгоритме - отлично и быстро работало
В 2016 Google опубликовал игру-дудл Magic Cat Academy
крутая штука