2010-07-06 1 views
7

В настоящее время я работаю в компании-разработчике программного обеспечения, и одной из моих задач было внедрение распознавания жестов мыши. Один из старших разработчиков помог мне начать работу и предоставил код/​​проекты, в которых используется распознаватель Unistroke Recognizer http://depts.washington.edu/aimgroup/proj/dollar/. Я получаю в широкий способ, что делает распознаватель Unistroke Recognizer и как он работает, но я немного перегружен, пытаясь понять все внутренние детали/более тонкие детали.Как определить все сегменты линии из списка точек, созданных с помощью жестов мыши?

Моя проблема заключается в том, что я пытаюсь распознать жест перемещения мыши вниз, а затем вверх. Распознаватель Unistroke Recognizer $ 1 определяет, что жест, который я создал, был жестом вниз, и это то, что он должен делать. То, что я действительно хотел бы сделать, это сказать: «Я признаю жестом в сборе И ТОГДА вверх жест».

Я не знаю, полностью ли я не понимаю, как распознать Unistroke Recognizer, чтобы я поцарапал себе голову, но есть ли у кого-нибудь какие-либо идеи о том, как распознать два разных жестов при перемещении мыши вниз, а затем вверх?

Вот моя идея, что я думал, что может помочь мне, но будет любить кого-то, кто эксперт или даже знает немного больше, чем я, чтобы сообщить мне, что вы думаете. Любая помощь или ресурсы, о которых вы знаете, были бы очень оценен.

Как Мои приложения В настоящее время работает:

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

Моя идея:

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

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

что я думаю, возможные проблемы в моем мышлении:

  • Где определить конец строки и начало отдельной строкой? Если бы я использовал идею проверки наклона группы точек, а затем решил, что существует отдельная строка, которая не означает, что я определенно нашел наклон отдельной строки. Например, если вы должны были нарисовать прямой левый «L» под прямым углом и пробовать наклон точек вокруг угла «L», вы увидите, что наклон даст отчетливое указание на наличие отдельной линии, но эти точки не соответствуют началу отдельной строки.

  • Как бороться с постоянно меняющимся наклоном изогнутой линии? Изначальный признак, который я использую, обрабатывает кривые уже так, как я этого хочу.Но я не хочу, чтобы мой метод, который я использовал для определения отдельных строк, продолжал искать эти так называемые отдельные строки на кривой, потому что его наклон меняет все время, когда я отбираю группы точек. Могу ли я просто остановить точки отбора проб, как только наклон изменился более чем на X% столько раз подряд?

  • Я не использую правильный «тип» математики для определения отдельных строк. Математика не моя самая сильная тема, но я сделал некоторые исследования. Я попытался посмотреть в Dot Products и посмотреть, будет ли это указывать на меня в определенном направлении, но я не знаю, будет ли это так. Кто-нибудь использовал Dot Prodcuts для выполнения чего-то подобного или какого-то другого метода?

Заключительные мысли, замечания и спасибо:

Часть моей проблемы, я чувствую, что я не знаю, как compeletly задать свой вопрос. Я не удивлюсь, если эта проблема уже задана (так или иначе), и существует решение, которое может быть Googled. Но мои результаты поиска в Google не предоставили никаких решений, так как я точно не знаю, как задать свой вопрос. Если вы чувствуете, что это сбивает с толку, пожалуйста, дайте мне знать, где и почему, и я помогу прояснить это. При этом, возможно, мои поиски в Google станут более точными, и я смогу найти решение.

Я просто хочу еще раз поблагодарить за чтение своего сообщения. Я знаю его долго, но не знал, где еще спросить об этом. Imma разговаривает с некоторыми другими людьми вокруг офиса, но все мои лучшие решения, которые я использовал в школе, пришли из сообщества StackOverflow, поэтому я очень благодарен вам.

правок это сообщение:

(7/6 4:00 PM) Еще одна идея, которую я думал о сравнивал все точки до точки Min/Max. Например, если бы я переместил мышь вниз, то вверх, то отправной точкой была бы текущая точка Макс, а точка, в которой я начинаю перемещать мышь назад, будет моей минутой. Я мог бы пойти дальше и посмотреть, есть ли какие-то точки после минимальной точки, и если так говорят, что может возникнуть новая потенциальная линия. Я не знаю, как хорошо это будет работать на других формах, таких как звезды, но это еще одна вещь, которую я собираюсь изучить. Кто-нибудь сделал что-то подобное этому раньше?

+0

Вы были бы удовлетворены, если бы ваш Recognizer распознал это как единственный жест «DOWN-UP», или вы действительно хотите, чтобы он нарушил жест в последовательности из двух примитивных жестов: {DOWN, UP}? – Beta

+1

Если я правильно понял, у вас уже есть серия строк, определяемая каждой парой точек, но требует упрощения - только «намеченные» строки. Я предлагаю вам взглянуть на алгоритм упрощения линии Дугласа-Пиккера. Он должен дать вам то, что вы ищете. http://www.cs.sunysb.edu/~algorith/implement/DPsimp/implement.shtml –

+0

Я был бы доволен, если бы он распознал его как единственный жест «DOWN-UP».Но все равно было бы важно знать, как сделать что-то, как записано в моем первоначальном посте, в случае, когда это неудовлетворительно. Спасибо Vitor. Я смотрю на это прямо сейчас. : D – Chris

ответ

1

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

Сравнивая наклон сегментов и определяя точки разломов, где он больше, чем некоторый порог будет работать в очень упрощенном случае. Представьте себе идеально сформированную L-образную форму, где у вас есть прямой угол между двумя прямыми линиями. Очевидно, что угловая точка была бы единственной, где разность наклона выше порога, пока порог находится между 0 и 90 градусами и, следовательно, идентифицируемая точка разлома.

Однако вертикальные и горизонтальные линии могут быть слегка изогнуты, поэтому порог должен быть достаточно большим, чтобы эти небольшие различия в наклоне игнорировались как точки разлома. Вам также нужно будет решить, насколько остроугольный алгоритм должен подойти как перерыв. требуется 90 градусов или выше, или даже достаточно 30 градусов? Это важный вопрос.

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

В основном алгоритм будет:

  • Для каждой исследуемой точки (начало N точки в последовательности и заканчивая N точки до конца.)
    • Вычислить средний наклон N предыдущих сегментов.
    • Вычислить средний наклон N следующих сегментов.
    • Если разница средних превышает значение Порог, отметьте текущую точку как точку разрыва.

Это вполне с верхней части моей головы. Вы должны попробовать это в своем приложении.

+0

Мне определенно нравится ваша идея. Я знаю, что на самом деле я смогу распознать строки, которые имеют угол от 10 до 170 градусов. В значительной степени с точки зрения человека, если они могут отличить, что есть какой-то угол (независимо от того, гладкие ли линии), тогда мне нужно уметь отличать отдельные сегменты линии. Насколько я знаю, я просто должен экспериментировать? В настоящее время моя спецификация/дизайн предоставляет список точек не более или менее 64 записей. Также имеет значение, какие точки я использую для наклона? IE Могу ли я использовать 1-й и 5-й точки, чтобы сделать уклон? – Chris

+0

Да, N должен быть выбран методом проб и ошибок. Если он слишком мал, вы поднимете небольшие колебания в виде отдельных линий и пропустите кривые углы, которые должны были быть прерваны. Если он слишком велик, с другой стороны, вы можете сломать плавно изогнутые линии и пропустить локализованные углы, похожие на средние, в фигурные скобки ({). Держите его подстраиваемым, и вы обязательно найдете подходящую настройку. Что касается наклона, я бы использовал только соседние точки. (1-й, 2-й), (2-й, 3-й) и т. Д. Используя N-меру, склоны, отходящие от контрольной точки, естественно будут взвешиваться в результате. –

1

Если вы работаете с абсолютными углами, например, вверх и вниз, вы можете просто взять абсолютный уклон между двумя точками (не обязательно смежными), чтобы определить, является ли оно ПРАВО, ВЛЕВО, ВВЕРХ, ВНИЗ (если этого достаточно для различия)

искусство, чтобы найти расстояние между точками так, чтобы угол не является случайным (с 1px, угол будет кратным 45 °)

Существует плагин Firefox для навигации с помощью жестов мыши, что работает очень хорошо. Я думаю, что это FireGestures, но я не уверен. Я думаю, вы можете получить некоторое вдохновение от этого

Дополнительная мысль: Если вы нарисуете фигуру путем соединения g последовательных точек, а затем вернитесь к первой точке, соотношение между площадью и длиной конечного сегмента также является индикатором для «бодрости» жестов

+0

Мои углы на самом деле не такие, как я могу проверить и распознать жест диагональной линии. Я думаю, что ты спрашиваешь? Я не думаю, что полностью понимаю ваш пост, когда вы также говорите, что искусство состоит в том, чтобы найти расстояние между точками, чтобы угол не был случайным. Ill также загляните в плагин FireFox. Еще раз спасибо! : D – Chris

+0

Я имел в виду, что не имеет значения, какой поворот является жестом. вам просто нужно знать, идет ли линия, а не если общий жест образует сложную форму наполовину, которая может быть верхней или нижней половиной. Мое второе утверждение заключалось в том, что если расстояния слишком малы, пользователь не может точно контролировать, в каком направлении он пойдет. Например. если вы нарисуете прямую линию вниз, вы отпустите несколько пикселей. Если вы обрабатываете каждые две точки как отдельные линии, те, где вы ошибаетесь, будут на 45 градусов. Но если ваши сегменты линии слишком длинны, вы не видите края. Ваша задача выбрать сбалансированные расстояния –

1

Если вас интересует только вверх/вниз/влево/вправо, первое приближение - проверить 45-градусные сегменты круга. Это легко сделать, проверив горизонтальную разницу между (последовательными) точками против вертикальной разницы между точками.

Скажите, что у вас большая положительная горизонтальная разница, чем вертикальная разница, тогда это будет «ПРАВО».

Единственная трудность, которая возникает, например, при разграничении ВВЕРХ/ВНИЗ от UP/RIGHT/DOWN. Но это может быть сделано расстоянием между точками. Если вы определите, что мышь перемещала ПРАВО на менее чем 20 пикселей, скажем, тогда вы можете игнорировать это движение.

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