7

現在、私はソフトウェア会社でインターンをしています。私の仕事の1つは、マウスジェスチャーの認識を実装することです。上級開発者の1人が私が始めるのを手伝ってくれ、1ドルのUnistrokeRecognizerhttp://depts.washington.edu/aimgroup/proj/dollar/を使用するコード/プロジェクトを提供してくれまし。私は大まかに言って、1ドルのUnistroke Recognizerが何をしているのか、そしてそれがどのように機能するのかを理解していますが、その内部/詳細のすべてを理解しようとすると少し圧倒されます。

私の問題は、マウスを下に動かしてから上に動かすジェスチャを認識しようとしていることです。1ドルのUnistrokeRecognizerは、私が作成したジェスチャが下向きのジェスチャであると判断します。これは、実際に実行する必要があることです。私が本当にやりたいのは、「私は下向きのジェスチャーを認識し、次に上向きのジェスチャーを認識します」と言うことです。

$ 1 Unistroke Recognizerの理解が不足しているために頭が痛くなっているかどうかはわかりませんが、マウスを下から上に動かす2つの異なるジェスチャを認識する方法について誰かが考えていますか?

これが私に役立つかもしれないと思った私の考えですが、専門家であるか、私より少しだけ知っている誰かがあなたの考えを私に知らせてくれることを望んでいます。あなたが知っているどんな助けやリソースも歓迎です。

私のアプリケーションは現在どのように機能しますか:

私の現在のアプリケーションが機能する方法は、ユーザーがマウスの左ボタンを押している間、マウスカーソルがある場所からポイントをキャプチャすることです。次に、ポイントのリストがジェスチャレコグナイザにフィードされ、キャプチャされたポイントに対応する最良の形状/ジェスチャであると思われるものが吐き出されます。

私の考え:

私がやりたかったのは、ポイントをジェスチャレコグナイザーにフィードする前に、どういうわけかすべてのポイントを調べて、それらを別々の線または曲線に分割することです。このようにして、各ライン/カーブを一度に1つずつフィードし、下、上、左、右、対角線、およびカーブの基本的な動きから、最終的な形状/ジェスチャを決定できます。

ポイントのリストに個別の線があるかどうかを判断するのに役立つと思った1つの方法は、ポイントのグループをサンプリングし、それらの勾配を調べることです。サンプリングされたポイントのグループの傾きが他のサンプリングされたポイントのグループとX%異なる場合は、実際に別の線が存在すると想定しても安全です。

私が考えることは私の思考で起こりうる問題です:

  • 行の終わりと別の行の開始はどこで確認できますか?ポイントのグループの傾きをチェックするというアイデアを使用して、別の線が存在すると判断した場合、それは必然的に別の線の傾きを見つけたことを意味しません。たとえば、直角にまっすぐなエッジの「L」を描画し、「L」の角の周りのポイントの勾配をサンプリングすると、勾配は別の線が存在することを合理的に示しますが、これらのポイントは、別の行の先頭に対応していません。

  • 絶えず変化する曲線の傾きにどう対処するか?私が使用しているジェスチャレコグナイザーは、カーブを希望どおりに処理します。ただし、ポイントのグループをサンプリングすると勾配が常に変化するため、個別の線を決定するために使用する方法で、曲線内のこれらのいわゆる個別の線を探し続けることは望ましくありません。勾配がX%を超えて連続して何度も変化したら、サンプリングポイントを停止するだけでよいでしょうか。

  • 別々の行を決定するために正しい「タイプ」の数学を使用していません。数学は私の最強の科目ではありませんが、私はいくつかの研究をしました。ドット積を調べて、それが私をある方向に向けるかどうかを確認しようとしましたが、そうなるかどうかはわかりません。誰かがこのようなことや他の方法を行うためにDotProdcutsを使用したことがありますか?

最終的な考え、意見、そして感謝:

私の問題の一部は、私が自分の質問を完全に行う方法がわからないということです。この問題が(何らかの形で)すでに尋ねられていて、Googleで解決できる解決策が存在する場合でも、私は驚かないでしょう。しかし、私はまだ質問をする方法が正確にわからないため、Googleでの検索結果は解決策を提供しませんでした。混乱していると思われる場合は、どこで、なぜか教えてください。明確にするためにお手伝いします。そうすることで、Googleでの検索がより正確になり、解決策を見つけることができるようになるかもしれません。

投稿を読んでくれてありがとう。私はその長いことを知っていますが、他にどこにそれを尋ねるべきか本当に知りませんでした。Immaはオフィスの周りの他の人と話をしますが、学校全体で使用した私の最高のソリューションはすべてStackOverflowコミュニティからのものであるため、ありがとうございます。

この投稿の編集:

(7/6 4:00 PM)私が考えたもう1つのアイデアは、最小/最大ポイントの前にすべてのポイントを比較することでした。たとえば、マウスを下から上に動かした場合、開始点は現在の最大点になり、マウスを上に戻し始めた点は最小点になります。次に、先に進んで、最小点の後に点があるかどうかを確認し、ある場合は、新しい潜在的な線がある可能性があると言います。これが星のような他の形でどれほどうまくいくかはわかりませんが、それは私が調べようとしている別のことです。誰かが以前にこれに似た何かをしたことがありますか?

4

3 に答える 3

1

問題を絞り込んで、一般的な曲線を直線または滑らかに湾曲した部分的な線に分割できる場合は、これを試すことができます。

セグメントの傾きを比較し、それがしきい値よりも大きいブレークポイントを特定することは、非常に単純化されたケースで機能します。2本の直線の間に直角がある完全に形成されたL字型を想像してみてください。明らかに、しきい値が0〜90度である限り、勾配の差がしきい値を上回っているのはコーナーポイントだけであり、したがって、識別可能なブレークポイントになります。

ただし、垂直線と水平線はわずかに湾曲している可能性があるため、これらの勾配の小さな違いをブレークポイントとして無視するには、しきい値を十分に大きくする必要があります。また、アルゴリズムがブレークとしてどの程度鋭いコーナーをピックアップするかを決定する必要があります。90度以上が必要ですか、それとも30度で十分ですか?これは重要な質問です。

最後に、これを堅牢にするために、2つの隣接するセグメントの勾配を比較することは満足できません。手が震えたり、角が滑らかになったり、直線や鋭い角を見つけるのに理想的な条件が発生することはおそらくないでしょう。休憩のために調査された各ポイントについて、前のN個のセグメントの平均勾配を取得し、それを次のN個のセグメントの平均勾配と比較します。これは、移動平均を使用して効率的に実装できます。適切なサンプル数N(入力の精度、ポイントの総数などに応じて)を選択することにより、アルゴリズムはノイズを回避し、より適切な検出を行うことができます。

基本的に、アルゴリズムは次のようになります。

  • 調査した各ポイントについて(シーケンスの開始Nポイント、終了前の終了 Nポイント)。
    • 前のN個のセグメントの平均勾配を計算します。
    • N個の次のセグメントの平均勾配を計算します。
    • 平均の差がしきい値よりも大きい場合は、現在のポイントをブレークポイントとしてマークします。

これは私の頭からかなり離れています。アプリケーションで試してみる必要があります。

于 2010-07-07T13:30:17.080 に答える
1

上向きや下向きなどの絶対角度で作業する場合は、2つのポイント(必ずしも隣接している必要はありません)間の絶対勾配を取得して、右、左、上、下のいずれであるかを判断できます(十分に区別できる場合)

アートは、角度がランダムにならないようにポイント間の距離を見つけることです(1pxの場合、角度は45°の倍数になります)

非常にうまく機能するマウスジェスチャーを使用したナビゲーション用のFirefoxプラグインがあります。FireGesturesだと思いますが、よくわかりません。私はあなたがそれからいくつかのインスピレーションを得ることができると思います

追加の考え:連続するポイントを接続して形状を描画し、次に最初のポイントに接続すると、面積と最終的な線分の長さの比率もジェスチャの「エッジネス」の指標になります。

于 2010-07-07T15:15:29.057 に答える
1

上/下/左/右に興味がある場合、最初の概算は円の45度のセグメントをチェックすることです。これは、(連続する)ポイント間の水平方向の違いをポイント間の垂直方向の違いと照合することで簡単に実行できます。

垂直方向の差よりも正の水平方向の差が大きいとすると、それは「右」になります。

唯一の問題は、たとえば、UP/DOWNとUP/RIGHT/DOWNを区別することです。しかし、これはポイント間の距離によって行うことができます。たとえば、マウスが20ピクセル未満右に移動したと判断した場合は、その移動を無視できます。

于 2010-07-15T14:01:38.257 に答える