C# 如何实现光流跟踪器?

C# 如何实现光流跟踪器?,c#,opencv,computer-vision,emgucv,opticalflow,C#,Opencv,Computer Vision,Emgucv,Opticalflow,我正在使用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); flowx=新图像(大小); flowy=新图

我正在使用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);
flowx=新图像(大小);
flowy=新图像(大小);
OpticalFlow.LK(当前、先前、新尺寸(15、15)、flowx、flowy);
我的问题是不知道如何结合垂直和水平运动的信息来建立运动物体的跟踪器?新形象

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


提前感谢。

有一些已知的光流算法。其中一个可能对你有好处的是卢卡斯·卡纳德。。您可以找到一个matlab源代码

这是我在我的应用程序中定义的函数。您可以找到视频附带的完整源代码

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
    }
void ComputeDenseOpticalFlow()
{
//用Horn和Schunk算法计算稠密光流
velx=新图像(faceGrayImage.Size);
vely=新图像(faceNextGrayImage.Size);
HS(faceGrayImage、faceNextGrayImage、true、velx、Fly、0.1d、新MCvTermCriteria(100));
#区域密集光流绘制
大小winSize=新大小(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=新点F[vectorFieldX][];
对于(int i=0;i
光流可视化。常用的方法是使用彩色编码的二维流场。这意味着我们将流动显示为图像,其中像素强度对应于像素中流动的绝对值,而色调反映流动的方向。 请看[]中的图2。 另一种方法是在第一幅图像上绘制网格中的流矢量(例如,每10个像素)


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

您好,谢谢您的回答,但我的问题不是光流算法的实现,因为它们已经在EMGU CV框架中,我的问题在于,我不知道如何处理光流函数的结果。