0

C# の openCV ライブラリの Lucas Kanade オプティカル フロー アルゴリズムを使用しています。一連のフレームがあり、それらの 2 つごとにオプティカル フローを調べて、それを pictureBox に表示したいと考えています。

次の関数から velX と velY を取得できました。

Emgu.CV.OpticalFlow.LK(imGrayCurrent, imGrayNext, windSize, velX, velY);

さて、2 つのフレーム間のフローを表示するには、これら 2 つをどのように使用すればよいでしょうか? つまり、ピクセルの変位を取得するにはどうすればよいですか?

TNX

4

1 に答える 1

1

一般的な方法は、HSV から RGB への変換を使用することです。 Middlebury Flow Datasetを参照してください。したがって:

  1. モーション ベクトルを極座標に変換します。

    長さ = sqrt(velx² + vely²)

    angle = acos(vely / length) [無限などの追加チェックを行う必要があります]

  2. 角度を [0,360] (OpenCV の場合、後で使用する関数に応じて [0,1]) に、長さを [0,1] に正規化します。hsv 空間 (最初のチャネル H (色相)、2 番目のチャネル S (彩度)、3 番目のチャネル V (値) を持つ 3 チャネル イメージ) を作成し、次のように設定します: H = 角度、S = 長さ、V = 1。

  3. cv::cvtColor(hsv, rgb, HSV2BGR); を使用して、HSV 色空間を RGB に変換します。

結果の画像はモーション ベクトル フィールド (velx,vely) を示しています。色はモーションの方向を示し、彩度はモーションの長さまたは速度を示します。

于 2013-02-10T21:24:12.197 に答える