通过OpenCV的camshift算法控制鼠标指针(或鼠标的基本功能)

c# opencv computer-vision emgucv human-computer-interface

2093 观看

1回复

1028 作者的声誉

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

最初的问题是光标无法覆盖整个屏幕。它的移动仅限于框架大小。因此,我应用了一个乘法因子:

在X方向上移动的screenwidth / framewidth。

屏幕高度/框架高度,用于在Y方向上移动

这样,鼠标可以覆盖整个区域。但是鼠标移动不再平滑。我无法指向两个位置紧密的图标。与真实鼠标一样,如何在覆盖整个屏幕的同时使鼠标移动顺畅?

作者: nishant 的来源 发布者: 2011 年 3 月 13 日

回应 (1)


5

847 作者的声誉

决定

要指出一个明显的事实:鼠标实现的非平滑性来自以下事实: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的增加而变为无穷大(较大的移动应对应于较大的移动)。游标),单调递增,并且一阶导数单调递增。编辑:还需要加速度函数在0处的值为0,否则会发生非常奇怪的运动。:)

还希望使f(framewidth)= 屏幕宽度,以便使被跟踪的对象跨帧移动导致光标在屏幕上移动。指数公式非常适合使用,但是根据存在的性能要求,使用二次或更高次多项式可能会变得计算更简单...

作者: Kristóf Marussy 发布者: 13.03.2011 07:00
32x32