Чтобы указать на очевидное: негладкость реализации вашей мыши происходит из-за того факта, что прямоугольник, заданный camshift, является точным только с точностью до одного пикселя кадра, поэтому наименьшее возможное движение будетбыть экранированным / уменьшенным по размеру кадра до ближайшего пикселя экрана.
Если это так, можно применить ускорение указателя, как и в случае использования мыши низкого качества (конечно,в случае лазерных мышей с несколькими тысячами точек на дюйм такая вещь не нужна).По сути, расстояние, на которое курсор перемещается на экране, - это не расстояние, взятое вводом указателя (в данном случае, смещение прямоугольника кулачкового смещения), а его умно выбранная функция.Таким образом, используя функцию ускорения f (x), шаги перемещения указателя будут выглядеть следующим образом:
- Вычислить вектор смещения ввода указателя, пусть это будет обозначено v .
- Рассчитать соответствующий вектор единичной длины, обозначим его u .
- Экранное смещение указателя равно 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 ( ширина кадра ) = ширина экрана , чтобы при перемещении отслеживаемого объекта по кадру курсор перемещался по экрану,С экспоненциальной формулой работать довольно приятно, но использование квадратичного или полинома более высокой степени может оказаться вычислительно проще в зависимости от требований к производительности ...