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 }; }