Обнаружение изломов в нарисованных полилиниях - PullRequest
2 голосов
/ 28 апреля 2010

Пользователи могут делать наброски в моем приложении, используя очень простой инструмент (перемещайте мышь, удерживая ЛКМ). Это приводит к ряду событий перемещения мыши, и я записываю местоположение курсора при каждом событии. Результирующая кривая полилинии имеет тенденцию быть довольно плотной, с записанными точками почти через каждый пиксель. Я хотел бы сгладить эту пиксельную полилинию, но я не хочу сглаживать предполагаемые изломы. Итак, как мне выяснить, где изломы?

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

трекер Polyline http://www.freeimagehosting.net/uploads/c83c6b462a.png

Ответы [ 4 ]

1 голос
/ 28 апреля 2010

Ну, одним из способов было бы использовать алгоритм подбора истинной кривой. Создайте кривую Безье (с точными конечными точками, используя Catmull-Rom или что-то подобное), затем оптимизируйте и рекурсивно подразделите (используя расстояние от фактических точек линии в качестве показателя стоимости). Это может быть слишком сложно для вашего варианта использования.

1 голос
/ 28 апреля 2010

То, что вы описываете, может быть связано с методами распознавания жестов, поэтому вы можете искать в них идеи.

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

Довольно простой, но эффективный подход заключается в упрощении образцов непосредственно в полилинию.

Например, пройдите по образцам (например) от образца 1 к образцу 4 и проверьте, лежат ли все 4 образца в пределах разумной погрешности прямой линии между 1 и 4. Если это так, то увеличьте это значение до 1..5 и повторять до тех пор, пока прямая линия от начальной точки к конечной точке больше не обеспечивает резонирующее приближение к кривой, определенной этими образцами. Создайте отрезок линии до предыдущей точки выборки и начните накапливать новый отрезок.

Вы должны быть осторожны с вашими пороговыми значениями, когда сэмплы расположены слишком близко друг к другу, поэтому вы можете настроить чувствительность, когда сэмплы расположены на расстоянии менее 4-5 пикселей друг от друга.

Это даст вам набор прямых линий, которые будут довольно точно следовать исходному пути.

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

Грубая сила, но она может просто достичь того, что вы хотите.

1 голос
/ 28 апреля 2010

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

0 голосов
/ 29 сентября 2010

Запишите порядок прорисовки пикселей. Затем вычислите наклон между пикселями, которые «близки», но не «близки». Я предполагаю, что график наклона между пикселем (i) и пикселем (i + 7) может демонстрировать легко распознаваемые «скачки» вокруг изломов на кривой.

...