gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:01:53 26 4
gpt4 key购买 nike

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

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

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

Y方向移动的screenheight/frameheight

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

最佳答案

要指出一个明显的问题:您的鼠标实现的非平滑性来自于 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,否则会出现很奇怪的 Action 。 :)

还希望有 f(framewidth) = screenwidth 以便在帧上移动被跟踪的对象会导致光标在屏幕上移动。指数公式非常好用,但使用二次或更高次多项式可能在计算上更简单,具体取决于那里的性能要求...

关于c# - 通过OpenCV的camshift算法控制鼠标指针(或者鼠标的基本功能),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5291496/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com