Управление указателем мыши с помощью алгоритма кулачкового сдвига OpenCV (или как мышь в основном функционирует) - PullRequest
1 голос
/ 13 марта 2011

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

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

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

высота экрана / высота кадра для движения в направлении Y

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

1 Ответ

5 голосов
/ 13 марта 2011

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...