2011-03-13 130 views
1

我已经使用EmguCV(openCV的包装)在C#中编写了一个程序。该程序使用camshift算法跟踪对象。在对象周围画一个矩形。光标在矩形的中心移动。输入来自摄像头。通过OpenCV的Camshift算法控制鼠标指针(或鼠标基本功能)

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

屏幕宽度/ framewidth在X方向上移动。

screenheight /在Y方向

运动通过该鼠标frameheight覆盖整个区域。但鼠标移动不再流畅。我无法指出两个密切相关的图标。我怎样才能使鼠标移动平滑,同时覆盖整个屏幕,就像真正的鼠标一样?

回答

5

要指出明显:鼠标实现的非平滑来自于一个事实,即CAMSHIFT给出的矩形只精确到一个像素的精度,所以尽可能小的运动将屏幕尺寸/四舍五入到最近的屏幕像素。

如果是这种情况,可以应用某种类型的指针加速,就像使用真正的低质量鼠标时一样(当然,如果使用数千dpi激光鼠标,则不需要对于这样的事情)。基本上,光标在屏幕上移动的距离不是指针输入的距离(在这种情况下是camshift矩形位移),而是其巧妙选择的功能。所以,使用加速度函数f(x),移动指针的步骤将是这样的:输入指针的位移

  1. 计算向量,让通过v来表示。
  2. 计算相应的单位长度向量,让它表示为u
  3. 屏幕上的指针的位移是V” = F(| v |)* ü

我选择F(X)在像测试 * E形式^(阿尔法 * X - 1),其中0 < 阿尔法和0 < 测试 < = 1是应凭经验选择的参数。

基本上,任何函数都会在0时导出1或更小的值(允许您为精确的光标移动使用输入的完整准确度),当x增加时转为无穷大(大移动应该对应于光标的大运动)是单调递增的并具有单调递增的第一导数。 编辑:还需要在0时加速度函数的值为0,否则会发生非常奇怪的运动。:)

还期望有F(framewidth)= 屏幕宽度使得跨在光标所在帧结果移动被跟踪的对象被在屏幕上移动。一个指数公式非常令人满意,但使用二次或更高阶的多项式可能会变得更简单,这取决于在那里的性能要求...

+0

我会做数学并且回馈给您。 – nishant 2011-03-14 05:38:05

+0

我有同样的问题,先生您能否介绍一些关于您解释的材料的链接?我需要为基于网络摄像头的眼动追踪HCI项目执行目光估计光标移动。 我的瞳孔位置因凝视而异,但我需要将它们映射为健康平滑的光标移动。 这会很有帮助,谢谢。 – 2012-04-29 05:15:30