【问题标题】:Controlling mouse pointer through camshift algorithm of OpenCV (or how mouse basically functions)通过 OpenCV 的 camshift 算法控制鼠标指针(或鼠标的基本功能)
【发布时间】:2011-07-14 13:43:57
【问题描述】:

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

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

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

Y 方向移动的屏幕高度/帧高度

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

【问题讨论】:

    标签: c# opencv computer-vision emgucv human-computer-interface


    【解决方案1】:

    指出明显的一点: 你的鼠标实现的不平滑来自于 camshift 给出的矩形只精确到一帧像素的精度,所以最小的移动可能将屏幕大小/帧大小四舍五入到最近的屏幕像素。

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

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

    我会以 beta * e^(alpha * x - 1) 的形式选择 f(x),其中 0 alpha em> 和 0 beta

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

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

    【讨论】:

    • 我会计算并回复你。
    • 我也遇到了同样的问题,先生,您能否给我一些链接,其中包含更多关于您解释的材料?我需要为基于网络摄像头的眼动追踪 HCI 项目执行注视估计光标移动。我确实有随注视而变化的瞳孔位置,但我需要将它们映射为健康、平滑的光标移动。很有帮助,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-04-14
    • 2012-06-05
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多