public ComputedOpticalFlow Compute()
        {
            var flowVectorImage = new Image<Bgr, byte>(currentImage.Bitmap);

            var currentGray = currentImage.Convert<Gray, byte>();
            var previousGray = previousImage.Convert<Gray, byte>();

            velocityX = new Image<Gray, float>(previousImage.Size);
            velocityY = new Image<Gray, float>(previousImage.Size);

            CvInvoke.CalcOpticalFlowFarneback(
                prev0: previousGray, next0: currentGray, flowX: velocityX, flowY: velocityY,
                pyrScale: farnebackParameters.PyrScale, levels: farnebackParameters.Levels,
                winSize: farnebackParameters.WinSize, iterations: farnebackParameters.Iterations,
                polyN: farnebackParameters.PolyN, polySigma: farnebackParameters.PolySigma,
                flags: OpticalflowFarnebackFlag.FarnebackGaussian);

            var vectorFieldX = (int)Math.Round((double)currentGray.Width / WindowSize.Width);
            var vectorFieldY = (int)Math.Round((double)currentGray.Height / WindowSize.Height);

            var opticalFlowLineArray = new ComputedOpticalFlow.FlowLineVector[vectorFieldX * vectorFieldY];

            for (int dirX = 0; dirX < vectorFieldX; dirX++)
            {
                for (int dirY = 0; dirY < vectorFieldY; dirY++)
                {
                    LineSegment2DF flowVector = CalculateFlowVector(dirX, dirY);

                    AddToFlowLineArray(opticalFlowLineArray, vectorFieldX, dirX, dirY, flowVector);

                    if (ComputeFlowImage)
                    {
                        AddToFlowVectorImage(flowVectorImage, flowVector);
                    }
                }
            }

            return new ComputedOpticalFlow { FlowVectorImage = flowVectorImage, FlowLineArray = opticalFlowLineArray };
        }
 private void AddToFlowLineArray(ComputedOpticalFlow.FlowLineVector[] opticalFlowLineArray, int vectorFieldX, int width, int height, LineSegment2DF flowVector)
 {
     opticalFlowLineArray[vectorFieldX * height + width] = new ComputedOpticalFlow.FlowLineVector
     {
         Line = flowVector,
         OverThreshold = !VectorNoiseThreshold.HasValue || flowVector.Length > VectorNoiseThreshold.Value
     };
 }