如何实现光流跟踪器?

我正在使用OpenCV包装器–Emgu CV,我正在尝试使用光流实现运动跟踪器,但我无法找到一种方法来组合从OF算法检索的水平和垂直信息:

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

我的问题是不知道如何组合垂直和水平运动的信息,以建立移动物体的跟踪器? 一个新的形象?

顺便说一句,有一种简单的方法来显示当前帧的流信息?

提前致谢。

这是我在youtube头部运动跟踪器video教程中定义的function。 您可以找到video附带的完整源代码

 void ComputeDenseOpticalFlow() { // Compute dense optical flow using Horn and Schunk algo velx = new Image(faceGrayImage.Size); vely = new Image(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 } 

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

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

存在一些已知的光流算法。 其中一个可能对你有好处的是Lucas Kanade ..你可以在这里找到一个matlab源码