1

EmguCV(openCVのラッパー)を使用してC#でプログラムを作成しました。プログラムは、カムシフトアルゴリズムを使用してオブジェクトを追跡します。オブジェクトの周りに長方形が描画されます。カーソルが長方形の中心に移動します。入力はウェブカメラから取得されます。

当初の問題は、カーソルが画面全体をカバーできないことでした。その動きはフレームサイズに制限されていました。そして、私は乗算係数を適用しました:

X方向に移動するための画面幅/フレーム幅。

Y方向に移動するためのscreenheight/frameheight

これにより、マウスは全領域をカバーします。しかし、マウスの動きはもはやスムーズではありません。近くにある2つのアイコンを指すことができません。実際のマウスの場合と同じように、画面全体をカバーしながらマウスの動きをスムーズにするにはどうすればよいですか?

4

1 に答える 1

5

明らかなことを指摘すると、マウスの実装が滑らかでないのは、camshiftによって与えられる長方形が1フレームピクセルの精度にしか正確でないため、可能な限り最小の動きは、最も近い画面に丸められた画面サイズ/フレームサイズになります。ピクセル。

その場合、実際の低品質のマウスを使用する場合と同じように、ある種のポインターアクセラレーションを適用できます(もちろん、数千dpiのレーザーマウスの場合、そのようなことは必要ありません)。 。基本的に、カーソルが画面上で移動する距離は、ポインター入力(この場合はカムシフト長方形の変位)がとる距離ではなく、巧妙に選択された関数です。したがって、加速関数f(x)を使用すると、ポインターを移動する手順は次のようになります。

  1. ポインタ入力変位のベクトルを計算します。これをvで表します。
  2. 対応する単位長ベクトルを計算します。これをuで表します。
  3. 画面上のポインタの変位はv' =f(| v |)* uです。

私はベータ*e^(アルファ* x --1)のような形式でf(x)を選択しました。ここで、0<アルファおよび0<ベータ<=1は経験的に選択する必要のあるパラメーターです。

基本的に、0で1以下の導関数を持つ関数(正確なカーソルの動きに入力の完全な精度を使用できるようにする)は、xが増加するにつれて無限大になります(大きな動きは、の大きな動きに対応する必要があります)カーソル)、単調に増加し、単調に増加する一次導関数を持ちます。編集:加速関数の値が0で0である必要もあります。そうしないと、非常に奇妙な動きが発生します。:)

また、追跡対象オブジェクトをフレーム全体に移動するとカーソルが画面上を移動するように、f(framewidth)= screenwidthにすることが望ましいです。指数式は非常に使いやすいですが、2次以上の多項式を使用すると、パフォーマンス要件によっては計算が簡単になる場合があります...

于 2011-03-13T19:00:11.597 に答える