Example #1
0
 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);
            }
        }
Example #4
0
        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);
            }
        }
Example #5
0
        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;
        }
Example #7
0
        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);
                        }
                    }
        }