私はこのようなことをしようとしています: http://www.youtube.com/watch?feature=player_embedded&v=MIYt1yNwoZU
私は正しい道を進んでいます.2時間のコーディングでうまくいきます. しかし、私はいくつかの質問があります:
私はopencv 2.4を使用していますが、いくつかのオプションがあります..ここを参照してください。どれが最高ですか?いくつかの自動機能検出を備えたルーカス・カナデ?それとも、単純なグローバルオリエンテーションで十分でしょうか? またはカルマンフィルター?今のところ、私は密なファーネバックのアルゴリズムを使用しています。これが最初の(=より単純な)オプションだと思いますが、おそらく最良のオプションではありません。
画像のオプティカルフローを計算した後(オプティカルフローを計算するのは大変な作業なので2倍に縮小されています)、ベクトルの平均を取ります。通常の平均、それらすべてを合計し、ベクトルの数から除算します。そのため、フローマットのネストされた for ループを使用します。より良い方法?
Point2f average_motion(0,0); float n=1; for(int y = 0; y < flow.rows; y += step) for(int x = 0; x < flow.cols; x += step) { const Point2f& fxy = flow.at<Point2f>(y, x); if( abs(fxy.x) > threshold || abs(fxy.y) > threshold) { average_motion += fxy; n++; } } average_motion *= 1/n; average_motion *= 1/n; cout << average_motion << endl;
私は四角形を動かしていますが、右/左の動きは少し奇妙に思えますが、代わりに上/下は本当にうまく機能します! 誰かが私に理由を説明できますか?
翻訳は大丈夫ですが、回転に行き詰まっています..平均ベクトルを取得した場合、次数を取得するにはどうすればよいですか? X 軸を持つベクトル間の角度を試してみましたが、うまくいきません。何かヒント?
今、私はopencv drawing apiで何かを描いていますが、2.4からはopenglのサポートもあります..そしていいはずですが、その例が見つかりません..