예제 #1
0
        public BgSubtractorMOG()
        {
            using (CvCapture capture = new CvCapture(Const.MovieHara)) // specify your movie file
                using (BackgroundSubtractorMOG mog = new BackgroundSubtractorMOG())
                    using (CvWindow windowSrc = new CvWindow("src"))
                        using (CvWindow windowDst = new CvWindow("dst"))
                        {
                            IplImage imgFrame;
                            using (Mat imgFg = new Mat())
                                while ((imgFrame = capture.QueryFrame()) != null)
                                {
                                    mog.Run(new Mat(imgFrame, false), imgFg, 0.01);

                                    windowSrc.Image = imgFrame;
                                    windowDst.Image = imgFg.ToIplImage();
                                    Cv.WaitKey(50);
                                }
                        }
        }
예제 #2
0
        public BgSubtractorMOG()
        {
            using (CvCapture capture = new CvCapture(Const.MovieHara)) // specify your movie file
            using (BackgroundSubtractorMOG mog = new BackgroundSubtractorMOG())            
            using (CvWindow windowSrc = new CvWindow("src"))
            using (CvWindow windowDst = new CvWindow("dst")) 
            {
                IplImage imgFrame;
                using (Mat imgFg = new Mat())
                while ((imgFrame = capture.QueryFrame()) != null)
                {
                    mog.Run(new Mat(imgFrame, false), imgFg, 0.01);
                    
                    windowSrc.Image = imgFrame;
                    windowDst.Image = imgFg.ToIplImage();
                    Cv.WaitKey(50);
                }               

            }
        }
예제 #3
0
 public void Run()
 {
     using (var capture = new VideoCapture(FilePath.Bach))
     using (var mog = new BackgroundSubtractorMOG())
     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);
         }
     }
 }
예제 #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);
            }
        }
예제 #5
0
        public void Run()
        {
            using (var capture = new VideoCapture(FilePath.Bach))
                using (var mog = new BackgroundSubtractorMOG())
                    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;
        }
예제 #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);
                        }
                    }
        }