public Magic(FrameDescription infraredFrameDescription) { mog = BackgroundSubtractorMOG.Create(); blobby = SimpleBlobDetector.Create(new SimpleBlobDetector.Params() { MinThreshold = 150, MaxThreshold = 255, FilterByColor = true, BlobColor = 255, FilterByArea = true, MinArea = 0.05f, MaxArea = 20, FilterByCircularity = true, MinCircularity = 0.5f, FilterByConvexity = true, MinConvexity = 0.5f, FilterByInertia = false //FilterByCircularity = true, //MinCircularity = 0.4f, //FilterByArea = true, //MaxArea = 10000 }); spellAI = new SpellAI(); tracePoints = new List <Point>(); traceCanvas = new Mat(new Size(infraredFrameDescription.Width, infraredFrameDescription.Height), MatType.CV_32F); gameController = new GameController(); }
public void Run() { //capture = new Capture("rtsp://*****:*****@192.168.0.69:554/Streaming/Channels/101"); //using (var capture = new VideoCapture(FilePath.Movie.Bach)) using (var capture = new VideoCapture("rtsp://*****:*****@192.168.0.69:554/Streaming/Channels/101")) using (var mog = BackgroundSubtractorMOG.Create()) using (var windowSrc = new Window("src")) using (var windowDst = new Window("dst")) { var frame = new Mat(); var fg = new Mat(); while (true) { capture.Read(frame); if (frame.Empty()) { break; } mog.Apply(frame, fg, 0.01); windowSrc.Image = frame; windowDst.Image = fg; Cv2.WaitKey(50); } } }
public void BackgroundSubtractor_Example() { VideoCapture capture = new VideoCapture(0); using var MOG2 = BackgroundSubtractorMOG2.Create(); using var MOG = BackgroundSubtractorMOG.Create(); using var GMG = BackgroundSubtractorGMG.Create(); using var KNN = BackgroundSubtractorKNN.Create(); using Mat frame = new Mat(); using Mat MOG2remove = new Mat(); using Mat MOGremove = new Mat(); using Mat GMG2remove = new Mat(); using Mat KNNremove = new Mat(); Window win_MOG2 = new Window("MOG2"); Window win_GMG = new Window("GMG"); Window win_MOG = new Window("MOG"); Window win_KNN = new Window("KNN"); while (Cv2.WaitKey(1) < 0) { capture.Read(frame); MOG2.Apply(frame, MOG2remove); MOG.Apply(frame, MOGremove); GMG.Apply(frame, GMG2remove); KNN.Apply(frame, KNNremove); win_MOG2.ShowImage(MOG2remove); win_GMG.ShowImage(MOGremove); win_MOG.ShowImage(GMG2remove); win_KNN.ShowImage(KNNremove); } }
public override void RunTest() { using var capture = new VideoCapture(MoviePath.Bach); using var mog = BackgroundSubtractorMOG.Create(); using var windowSrc = new Window("src"); using var windowDst = new Window("dst"); using var frame = new Mat(); using var fg = new Mat(); while (true) { capture.Read(frame); if (frame.Empty()) { break; } mog.Apply(frame, fg, 0.01); windowSrc.Image = frame; windowDst.Image = fg; Cv2.WaitKey(50); } }
public void Run() { using (var capture = new VideoCapture(FilePath.Movie.Bach)) using (var mog = BackgroundSubtractorMOG.Create()) using (var windowSrc = new Window("src")) using (var windowDst = new Window("dst")) { var frame = new Mat(); var fg = new Mat(); while (true) { capture.Read(frame); if (frame.Empty()) { break; } mog.Run(frame, fg, 0.01); windowSrc.Image = frame; windowDst.Image = fg; Cv2.WaitKey(50); } } }
public void AnalyzeVideo(string file, bool isDebug) { var dateString = "1900-01-01 12:00:00"; var fileName = Path.GetFileNameWithoutExtension(file); if (fileName.Contains("_")) { dateString = fileName.Split("_")[0].Insert(4, "-").Insert(7, "-").Insert(10, " ").Insert(13, ":").Insert(16, ":"); } var currentFrame = 1; var startDate = DateTime.Parse(dateString); var stopwatch = Stopwatch.StartNew(); var frameCount = 0; var frame = new Mat(); var realTimeSpeed = new RealTimeSpeed(isDebug); var bgSub = BackgroundSubtractorMOG.Create(200, 100); var carRecords = new List <CarTracker>(); var entries = new List <Entry>(); using (var videoCapture = VideoCapture.FromFile(file)) { frameCount = videoCapture.FrameCount; while (videoCapture.IsOpened()) { frame = videoCapture.RetrieveMat(); if (frame.Cols == 0) { break; } var carBlobs = DetectCars(frame, bgSub, carRecords.HasPossibleOverlaps(), isDebug); var blobsWithTrackers = MatchBlobsToTrackers(carBlobs, carRecords); carRecords.ForEach(c => c.IsUpdated = false); foreach (var blob in blobsWithTrackers) { var closestTracker = carRecords.Where(c => c.Id == blob.Value).FirstOrDefault(); if (closestTracker == null) { closestTracker = new CarTracker { Id = NextTrackerId++, Car = new Entry { Direction = blob.Key.X < Config.LeftStart + 75 ? "R" : "L", DateAdded = startDate.AddSeconds(currentFrame / 30) }, Rect = blob.Key, IsUpdated = true }; carRecords.Add(closestTracker); } else { closestTracker.IsUpdated = true; closestTracker.LastUpdated = currentFrame; closestTracker.Rect = blob.Key; if (isDebug) { Cv2.Rectangle(frame, blob.Key, Scalar.Purple, 8); } } closestTracker.ValidateTracker(frame.Height); } carRecords.ForEach(c => c.UpdateEvents(currentFrame, frame, Config)); //remove any trackers that have completed but are invalid OR they haven't been updated in 15 frames var badRecords = carRecords.Where(c => (!c.IsUpdated && c.Car.Speed > 0 && c.IsInvalid) || (!c.IsUpdated && currentFrame - c.LastUpdated > 15)).ToList(); foreach (var badRecord in badRecords) { carRecords.Remove(badRecord); } var completedRecords = carRecords.Where(c => !c.IsUpdated && c.Car.Speed > 0).ToList(); foreach (var completed in completedRecords) { entries.Add(completed.Car); carRecords.Remove(completed); realTimeSpeed.StopFrame = 60; realTimeSpeed.Speed = (int)Math.Floor(completed.Car.Speed); } //display progress output var fps = Math.Round(currentFrame / stopwatch.Elapsed.TotalSeconds, 2); var percentDone = (currentFrame / (double)frameCount) * 100; var timeRemaining = TimeSpan.FromSeconds((frameCount - currentFrame) / fps); if (isDebug) { DrawStartEndLines(frame); DrawTime(startDate, currentFrame, frame); realTimeSpeed.DrawSpeeds(frame); Cv2.ImShow("Frame", frame); Cv2.WaitKey(1); } Console.SetCursorPosition(0, Console.CursorTop); Console.Write($"\r{currentFrame} of {frameCount} - Time: {startDate.AddSeconds(currentFrame / 30).ToString("HH:mm:ss")} - FPS: {fps.ToString("N2")} - {Math.Round(percentDone, 2).ToString("N2")}% - Remaining: {timeRemaining.ToString(@"hh\:mm\:ss")} - Cars: {entries.Count} "); currentFrame++; } } Console.WriteLine(""); Console.WriteLine($"{entries.Count} cars in {stopwatch.Elapsed.ToString(@"hh\:mm\:ss")}"); //save all entries to the DB and their photos to disk if debug is false if (!isDebug) { foreach (var entry in entries) { Console.WriteLine($"{entry.DateAdded.ToString("hh:mm:ss")}: {entry.Direction} - {entry.Speed:N2}"); Database.EntryInsert(entry); if (!entry.PhotoUpdated) { Database.LogInsert(new Log { DateAdded = DateTime.Now, Message = $"Photo for #{entry.Id} has not been updated!", StackTrace = "" }); } //save the picture if it exists if (entry.Picture != null) { using (var fileStream = new FileStream(Path.Combine(Config.PhotoFolder, $"{entry.Id}.jpg"), FileMode.Create)) { fileStream.Write(entry.Picture, 0, entry.Picture.Length); } } } } return; }
public void Run() { // Opens MP4 file (ffmpeg is probably needed) //var capture = new VideoCapture(FilePath.Movie.Bach); var capture = new VideoCapture("rtmp://rtmp.open.ys7.com/openlive/61e96da9f12a4d058f4737d02c42998d"); #region MyRegion //int sleepTime = (int)Math.Round(1000 / capture.Fps); //using (var window = new Window("capture")) //{ // // Frame image buffer // Mat image = new Mat(); // // When the movie playback reaches end, Mat.data becomes NULL. // while (true) // { // capture.Read(image); // same as cvQueryFrame // if (image.Empty()) // break; // window.ShowImage(image); // Cv2.WaitKey(sleepTime); // } //} #endregion Rect roi = new Rect(); Mat kernel1 = Cv2.GetStructuringElement(0, new Size(3, 3), new Point(-1, -1)); Mat kernel2 = Cv2.GetStructuringElement(0, new Size(5, 5), new Point(-1, -1)); using (var mog = BackgroundSubtractorMOG.Create()) using (var windowSrc = new Window("src")) //using (var windowinrange = new Window("inrange")) using (var windowDst = new Window("dst")) { var frame = new Mat(); //var inrange = new Mat(); var fg = new Mat(); while (true) { capture.Read(frame); if (frame.Empty()) { break; } //Cv2.InRange(frame, new Scalar(100, 100, 0), new Scalar(255, 255, 100), inrange); mog.Apply(frame, fg, 0.01); // 开操作 //Cv2.MorphologyEx(fg, fg, OpenCvSharp.MorphTypes.Open, kernel1, new Point(-1, -1), 1); //// 膨胀 //Cv2.Dilate(fg, fg, kernel2,new Point(-1, -1), 4); // 轮廓发现与位置标定 processFrame(ref fg, ref roi); //画矩形 Cv2.Rectangle(frame, roi, new Scalar(0, 255, 0)); Cv2.Rectangle(fg, roi, new Scalar(0, 255, 0)); windowSrc.Image = frame; //windowinrange.Image = inrange; windowDst.Image = fg; Cv2.WaitKey(50); } } }