1

我使用 EmguCV(openCV 的包装器)在 C# 中编写了一个程序。该程序使用 camshift 算法跟踪对象。围绕对象绘制一个矩形。光标移动到矩形的中心。输入来自网络摄像头。

最初的问题是光标无法覆盖整个屏幕。它的运动仅限于框架尺寸。所以我应用了一个乘法因子:

X 方向移动的屏幕宽度/帧宽度。

在 Y 方向移动的 screenheight/frameheight

有了这个鼠标覆盖整个区域。但是鼠标移动不再流畅了。我无法指出靠近的两个图标。如何在覆盖整个屏幕时使鼠标移动平滑,就像使用真正的鼠标一样?

4

1 回答 1

5

指出一点很明显:鼠标实现的不流畅性来自于 camshift 给出的矩形仅精确到一帧像素的精度,因此可能的最小移动将屏幕大小/帧大小四舍五入到最近的屏幕像素。

如果是这样的话,可以应用某种指针加速,就像使用真实的低质量鼠标时一样(当然,如果是数千dpi的激光鼠标,则不需要这种东西) . 基本上,光标在屏幕上移动的距离不是指针输入所走的距离(在本例中为 camshift 矩形位移),而是它的一个巧妙选择的函数。因此,使用加速度函数 f(x),移动指针的步骤如下:

  1. 计算指针输入位移的向量,用v表示。
  2. 计算相应的单位长度向量,用u表示。
  3. 屏幕指针位移为v' =f(| v |) * u

我会以beta * e^( alpha * x - 1) 之类的形式选择 f(x),其中 0 < alpha和 0 < beta <= 1 是应该根据经验选择的参数。

基本上,任何在 0 处导数为 1 或更少的函数都会执行此操作(允许您使用输入的完全精度来进行精确的光标移动),随着 x 的增加而变为无穷大(大的移动应该对应于cursor) 是单调递增的,并且具有单调递增的一阶导数。编辑:还需要加速函数在0时的值为0,否则会发生非常奇怪的运动。:)

还需要 f( framewidth ) = screenwidth,以便在框架上移动被跟踪对象会导致光标在屏幕上移动。指数公式很容易使用,但使用二次或更高次多项式可能会在计算上变得更简单,具体取决于那里的性能要求......

于 2011-03-13T19:00:11.597 回答