5

私は OpenCV ラッパー - Emgu CV を使用しており、オプティカル フローを使用してモーション トラッカーを実装しようとしていますが、OF アルゴリズムから取得した水平情報と垂直情報を組み合わせる方法がわかりません。

flowx = new Image<Gray, float>(size);
flowy = new Image<Gray, float>(size);

OpticalFlow.LK(currImg, prevImg, new Size(15, 15), flowx, flowy);

私の問題は、移動するオブジェクトのトラッカーを構築するために、垂直方向と水平方向の動きの情報を組み合わせる方法がわからないことですか? 新しいイメージ?

ところで、現在のフレームにフロー情報を表示する簡単な方法はありますか?

前もって感謝します。

4

3 に答える 3

9

これは、 YouTube の頭の動きのトラッカーのビデオ チュートリアルで定義した関数です。ビデオに添付されている完全なソースコードを見つけることができます

void ComputeDenseOpticalFlow()
    {
        // Compute dense optical flow using Horn and Schunk algo
        velx = new Image<Gray, float>(faceGrayImage.Size);
        vely = new Image<Gray, float>(faceNextGrayImage.Size);

        OpticalFlow.HS(faceGrayImage, faceNextGrayImage, true, velx, vely, 0.1d, new MCvTermCriteria(100));            

        #region Dense Optical Flow Drawing
        Size winSize = new Size(10, 10);
        vectorFieldX = (int)Math.Round((double)faceGrayImage.Width / winSize.Width);
        vectorFieldY = (int)Math.Round((double)faceGrayImage.Height / winSize.Height);
        sumVectorFieldX = 0f;
        sumVectorFieldY = 0f;
        vectorField = new PointF[vectorFieldX][];
        for (int i = 0; i < vectorFieldX; i++)
        {
            vectorField[i] = new PointF[vectorFieldY];
            for (int j = 0; j < vectorFieldY; j++)
            {
                Gray velx_gray = velx[j * winSize.Width, i * winSize.Width];
                float velx_float = (float)velx_gray.Intensity;
                Gray vely_gray = vely[j * winSize.Height, i * winSize.Height];
                float vely_float = (float)vely_gray.Intensity;
                sumVectorFieldX += velx_float;
                sumVectorFieldY += vely_float;
                vectorField[i][j] = new PointF(velx_float, vely_float);

                Cross2DF cr = new Cross2DF(
                    new PointF((i*winSize.Width) +trackingArea.X,
                               (j*winSize.Height)+trackingArea.Y),
                               1, 1);
                opticalFlowFrame.Draw(cr, new Bgr(Color.Red), 1);

                LineSegment2D ci = new LineSegment2D(
                    new Point((i*winSize.Width)+trackingArea.X,
                              (j * winSize.Height)+trackingArea.Y), 
                    new Point((int)((i * winSize.Width)  + trackingArea.X + velx_float),
                              (int)((j * winSize.Height) + trackingArea.Y + vely_float)));
                opticalFlowFrame.Draw(ci, new Bgr(Color.Yellow), 1);

            }
        }
        #endregion
    }
于 2010-09-27T19:18:42.533 に答える
4

オプティカルフローの可視化。一般的なアプローチは、色分けされた2Dフローフィールドを使用することです。これは、フローを画像として表示することを意味します。ここで、ピクセル強度はピクセル内のフローの絶対値に対応し、色相はフローの方向を反映します。[ Baker et al。、2009 ]の図2を見てください。もう1つの方法は、最初の画像上にグリッド内の流れのベクトルを描画することです(たとえば、10ピクセルごと)。

xとyを組み合わせる。ここで何を意味するのかは明確ではありません。最初の画像のピクセル(x、y)は、2番目の画像の(x + flowx、y + flowy)に移動します。したがって、オブジェクトを追跡するには、最初の画像上のオブジェクトの位置を固定し、フロー値を追加して2番目の画像上の位置を取得します。

于 2010-09-28T07:08:31.613 に答える
0

既知のオプティカル フロー アルゴリズムがいくつかあります。あなたにとって良いかもしれないそれらの1つはLucas Kanadeです..ここでmatlabソースを見つけることができます

于 2010-09-27T11:12:32.633 に答える