/* public void TestPyrLK() { const int MAX_CORNERS = 500; Capture c = new Capture(); ImageViewer viewer = new ImageViewer(); Image<Gray, Byte> oldImage = null; Image<Gray, Byte> currentImage = null; Application.Idle += new EventHandler(delegate(object sender, EventArgs e) { if (oldImage == null) { oldImage = c.QueryGrayFrame(); } currentImage = c.QueryGrayFrame(); Features2D.GFTTDetector detector = new Features2D.GFTTDetector(MAX_CORNERS, 0.05, 3, 3); //PointF[] features = oldImage.GoodFeaturesToTrack(MAX_CORNERS, 0.05, 3.0, 3, false, 0.04)[0]; PointF[] shiftedFeatures; Byte[] status; float[] trackErrors; CvInvoke.CalcOpticalFlowPyrLK(oldImage, currentImage, features, new Size(9, 9), 3, new MCvTermCriteria(20, 0.05), out shiftedFeatures, out status, out trackErrors); Image<Gray, Byte> displayImage = currentImage.Clone(); for (int i = 0; i < features.Length; i++) displayImage.Draw(new LineSegment2DF(features[i], shiftedFeatures[i]), new Gray(), 2); oldImage = currentImage; viewer.Image = displayImage; }); viewer.ShowDialog(); }*/ public void TestPyrLKGPU() { if (!CudaInvoke.HasCuda) return; const int MAX_CORNERS = 500; Capture c = new Capture(); ImageViewer viewer = new ImageViewer(); GpuMat oldImage = null; GpuMat currentImage = null; using (CudaGoodFeaturesToTrackDetector detector = new CudaGoodFeaturesToTrackDetector(DepthType.Cv8U, 1, MAX_CORNERS, 0.05, 3.0, 3, false, 0.04)) using (CudaDensePyrLKOpticalFlow flow = new CudaDensePyrLKOpticalFlow(new Size(21, 21), 3, 30, false)) { Application.Idle += new EventHandler(delegate(object sender, EventArgs e) { if (oldImage == null) { Mat bgrFrame = c.QueryFrame(); using (GpuMat oldBgrImage = new GpuMat(bgrFrame)) { oldImage = new GpuMat(); CudaInvoke.CvtColor(oldBgrImage, oldImage, ColorConversion.Bgr2Gray); } } using (Mat tmpFrame = c.QueryFrame()) using (GpuMat tmp = new GpuMat(tmpFrame)) { currentImage = new GpuMat(); CudaInvoke.CvtColor(tmp, currentImage, ColorConversion.Bgr2Gray); } using (GpuMat f = new GpuMat()) using (GpuMat vertex = new GpuMat()) using (GpuMat colors = new GpuMat()) using(GpuMat corners = new GpuMat()) { flow.Calc(oldImage, currentImage, f); //CudaInvoke.CreateOpticalFlowNeedleMap(u, v, vertex, colors); detector.Detect(oldImage, corners, null); //GpuMat<float> detector.Detect(oldImage, null); /* //PointF[] features = oldImage.GoodFeaturesToTrack(MAX_CORNERS, 0.05, 3.0, 3, false, 0.04)[0]; PointF[] shiftedFeatures; Byte[] status; float[] trackErrors; OpticalFlow.PyrLK(oldImage, currentImage, features, new Size(9, 9), 3, new MCvTermCriteria(20, 0.05), out shiftedFeatures, out status, out trackErrors); */ Mat displayImage = new Mat(); currentImage.Download(displayImage); /* for (int i = 0; i < features.Length; i++) displayImage.Draw(new LineSegment2DF(features[i], shiftedFeatures[i]), new Gray(), 2); */ oldImage = currentImage; viewer.Image = displayImage; } }); viewer.ShowDialog(); } }
public void TestCudaPyrLKOpticalFlow() { if (!CudaInvoke.HasCuda) return; Image<Gray, Byte> prevImg, currImg; AutoTestVarious.OpticalFlowImage(out prevImg, out currImg); Mat flow = new Mat(); CudaDensePyrLKOpticalFlow opticalflow = new CudaDensePyrLKOpticalFlow(new Size(21, 21), 3, 30, false); using (CudaImage<Gray, Byte> prevGpu = new CudaImage<Gray, byte>(prevImg)) using (CudaImage<Gray, byte> currGpu = new CudaImage<Gray, byte>(currImg)) using (GpuMat flowGpu = new GpuMat()) { opticalflow.Calc(prevGpu, currGpu, flowGpu); flowGpu.Download(flow); } }