Intereting Posts

Управление указателем мыши через алгоритм camshift OpenCV (или как мышь в основном функционирует)

Я написал программу на C #, используя EmguCV (shell openCV). Программа отслеживает объект с помощью алгоритма camshift. Прямоугольник нарисован вокруг объекта. Курсор перемещается по центру прямоугольника. Вход берется из веб-камеры.

Первоначально проблема заключалась в том, что курсор не мог охватить весь экран. Его движение ограничивалось размером кадра. И поэтому я применил коэффициент умножения:

ширина экрана / ширина frameworks для движения в направлении X.

screenheight / frameheight для движения в направлении Y

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

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

Если это так, то может быть применено какое-то ускорение указателя, как это делается при использовании реальных, некачественных мышей (конечно, в случае многократных лазерных мышей с тысячей точек на дюйм нет необходимости в такой вещи) , В основном, расстояние, на котором движется курсор на экране, – это не расстояние, которое занимает вход указателя (в данном случае смещение прямоугольника перемещения), но умная функция. Таким образом, используя функцию ускорения f (x), шаги перемещения указателя будут такими:

  1. Вычислить вектор смещения ввода указателя, обозначим его через v .
  2. Вычислим соответствующий вектор единичной длины, обозначим через u .
  3. Перемещением указателя на экране является v ‘ = f (| v |) * u

Я выбрал f (x) в форме, такой как beta * e ^ ( alpha * x – 1), где 0 < alpha и 0 < beta <= 1 - параметры, которые должны быть эмпирически выбраны.

В принципе, любая функция будет делать то, что имеет производную от 1 или меньше в 0 (позволяет использовать полную точность ввода для точных движений курсора), переходит в бесконечность по мере увеличения x (большие движения должны соответствовать большим движениям курсор), monoтонно возрастает и имеет monoтонно увеличивающуюся первую деривацию. Изменить: также необходимо, чтобы функция ускорения имела значение 0 при 0, в противном случае произойдет очень странное движение. 🙂

Также желательно иметь f ( ширина frameworks ) = ширина экрана, так что перемещение отслеживаемого объекта по кадру приводит к перемещению курсора по экрану. Экспоненциальная формула довольно приятна для работы, но использование квадратичного или более высокого степенного полинома может оказаться более простым в вычислительном отношении, в зависимости от требований к производительности …