EMGUCV motion tracker вызывает попытку чтения или записи защищенной ошибки памяти - PullRequest
0 голосов
/ 11 апреля 2019

Я создал программу, которая позволяет отслеживать объекты с помощью движка EMGUCV. Он использует окно просмотра изображений для отображения трекера. Когда один трек сделан. Я закрываю средство просмотра изображений, а затем открываю новое средство просмотра изображений для отслеживания следующего объекта. Проблема в том, что я могу сделать это только несколько раз, прежде чем я получу следующее сообщение:

Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

Линия, на которой он падает, такова:

GlobalVariables.myFrame = frameSource.NextFrame().Clone();

frameSource.NextFrame() - следующий кадр из трекера / видеостабилизатора. (Каждый кадр с камеры сначала проходит через стабилизатор изображения).

Я пытался использовать .Clone() на кадре, а также экспериментировать с сборщиком мусора в разных местах.

    public void TrackObject()
    {
        if (!GlobalVariables.targetBox.Width.Equals(0))
        {

            Emgu.CV.UI.ImageViewer viewer1 = new Emgu.CV.UI.ImageViewer();
            Emgu.CV.Tracking.TrackerCSRT myTracker = new Emgu.CV.Tracking.TrackerCSRT();

            Size mySize = new Size();
            mySize.Height = 480;
            mySize.Width = 640;
            int targetCenterX = 320; // x center of image
            int targetCenterY = 240; // y center of image
            int dx;
            int dy;
            Rectangle myRectangle = GlobalVariables.targetBox;
            Rectangle centerSquare = new Rectangle(300, 220, 45, 45);
            Emgu.CV.VideoCapture capture1 = new Emgu.CV.VideoCapture("rtsp://admin:A500d10!@192.168.1.121:554/Streaming/Channels/106/");

            using (Emgu.CV.VideoStab.CaptureFrameSource frameSource = new Emgu.CV.VideoStab.CaptureFrameSource(capture1))

            {
                GlobalVariables.myFrame = frameSource.NextFrame().Clone();
                myTracker.Init(GlobalVariables.myFrame, myRectangle);

                Application.Idle += delegate (object sender, EventArgs e)
                {
                    GlobalVariables.myFrame = frameSource.NextFrame().Clone();
                    myTracker.Update(GlobalVariables.myFrame, out myRectangle);
                    if (GlobalVariables.myFrame != null)
                    {
                        int swidth = myRectangle.Width; // width of tracker rectangle
                        int sheight = myRectangle.Height;  // height of tracker rectangle
                        int shalfwidth = swidth / 2; // x center of tracker rectangle
                        int shalfheight = sheight / 2;  // y center of tracker rectangle
                        int sXcentroid = myRectangle.X + shalfwidth; // X center of tracker rectangle on image
                        int sYcentroid = myRectangle.Y + shalfheight;  // Y center of tracker rectangle on image
                        dx = sXcentroid - targetCenterX;  // x distance of tracker box centroid from centroid of image
                        dy = targetCenterY - sYcentroid;  // y distance of tracker box centroid from centroid of image


                        Point start = new Point(targetCenterX, targetCenterY);
                        Point end = new Point(sXcentroid, sYcentroid);
                        Emgu.CV.Structure.LineSegment2D line = new Emgu.CV.Structure.LineSegment2D(start, end);
                        Emgu.CV.CvInvoke.Line(GlobalVariables.myFrame, start, end, new Emgu.CV.Structure.Bgr(0, 255, 0).MCvScalar, 1, new Emgu.CV.CvEnum.LineType(), 0);
                    }
                    viewer1.ShowIcon = true;
                    viewer1.Width  = 650;
                    viewer1.Height = 490;
                    viewer1.Text = "Tracker";
                    viewer1.Image = GlobalVariables.myFrame;
                    GC.Collect();
                    if (GlobalVariables.TRACKER_STOP == 1)
                    {
                        viewer1.Dispose();
                        capture1.Dispose();
                        GlobalVariables.myFrame.Dispose();
                        //resized.Dispose();
                        GlobalVariables.TRACKER_STOP = 0;
                        GC.Collect(); 
                        return;
                    }

                };
                if (!viewer1.IsDisposed)
                {
                     viewer1.ShowDialog();
                }
            }
        }
    }

Я хочу иметь возможность постоянно открывать и закрывать окно просмотра изображений / отслеживания движения без сбоев.

...