【问题标题】:How to implement Optical Flow tracker?如何实现光流跟踪器?
【发布时间】:2011-04-17 17:06:59
【问题描述】:

我正在使用 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);

我的问题是不知道如何结合垂直和水平移动的信息来构建移动物体的跟踪器?新图片?

顺便问一下,有没有一种简单的方法可以在当前帧上显示流信息?

提前致谢。

【问题讨论】:

    标签: c# opencv computer-vision emgucv opticalflow


    【解决方案1】:

    有一些已知的光流算法。其中一个可能对您有好处的是 Lucas Kanade.. 您可以找到 matlab 源 here

    【讨论】:

    • 您好,感谢您的回复,但我的问题不是光流算法的实现,因为它们已经在 EMGU CV 框架中,我的居住地是,我不知道如何处理光流函数的结果。
    【解决方案2】:

    这是我在youtube head movement tracker video tutorial 中定义的函数。您可以在视频中找到完整的源代码

    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
        }
    

    【讨论】:

      【解决方案3】:

      光流可视化。常见的方法是使用颜色编码的 2D 流场。意思是我们将流动显示为图像,其中像素强度对应像素中流动的绝对值,而色调反映流动的方向。 请看 [Baker et al., 2009] 中的图 2。 另一种方法是在第一个图像上绘制一个网格中的流向量(例如,每 10 个像素)。

      结合 x 和 y。目前尚不清楚你在这里的意思。第一个图像的像素 (x,y) 移动到第二个图像的 (x+flowx, y+flowy)。因此,要跟踪一个对象,您需要在第一张图像上固定该对象的位置,并添加流值以获得它在第二张图像上的位置。

      【讨论】:

        猜你喜欢
        • 2021-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-30
        • 2014-07-03
        • 1970-01-01
        • 2012-04-26
        相关资源
        最近更新 更多