Как исправить утечку памяти Emgu VideoCapture / ImageViewer? - PullRequest
0 голосов
/ 16 января 2019

Я использую Emgu CV для обнаружения объекта с помощью каскада HAAR, затем отправляю ограничивающую рамку каскада HAAR на трекер движения CSRT. Затем я вычисляю центр тяжести трекера CSRT и имею крепление телескопа панорамирования / наклона, которое будет перемещать камеру до тех пор, пока центроид трекера и изображение не совпадут. В приведенном ниже коде я использую видеофайл .avi, но в конечном итоге я буду использовать его с живой видеокамерой.

Я использую ImageViewer для одновременного отображения каскада HAAR и трекера движения CSRT. Проблема в том, что программа отслеживания движений CSRT использует всю мою оперативную память. Если я закомментирую зрителя. ShowDialog (); Линия, то нет утечки памяти, но я также не вижу трекер.

Кстати, это на Windows 7, работает под управлением Visual Studio 2017, .NET 4.7.3, Emgu 3.4.3.3016.

Каскадная функция HAAR также вызывала утечку памяти, но я смог ее исправить, используя .Dispose () в файле mat в конце функции. Это не помогло с функцией отслеживания движения CSRT.

public void Tracker()
    {
        if (!this.detectedBBox.Width.Equals(0))
        {
            Emgu.CV.UI.ImageViewer viewer = new Emgu.CV.UI.ImageViewer();
            Emgu.CV.Tracking.TrackerCSRT myTracker = new Emgu.CV.Tracking.TrackerCSRT();

            using (Emgu.CV.VideoCapture capture1 = new Emgu.CV.VideoCapture("c:\\Users\\Windows7\\33a.avi"))
            using (Emgu.CV.VideoStab.CaptureFrameSource frameSource = new Emgu.CV.VideoStab.CaptureFrameSource(capture1))
            {
                Rectangle myRectangle = this.detectedBBox;
                Emgu.CV.Mat myFrame = frameSource.NextFrame().Clone();
                myTracker.Init(myFrame, myRectangle);
                Application.Idle += delegate (object c, EventArgs f)
                {
                    myFrame = frameSource.NextFrame().Clone();
                    myTracker.Update(myFrame, out myRectangle);
                    if (myFrame != null)
                    {

                        int fXcenter = myFrame.Width / 2;
                        int fYcenter = myFrame.Height / 2;
                        int dx;
                        int dy;
                        int swidth = myRectangle.Width;
                        int sheight = myRectangle.Height;
                        int shalfwidth = swidth / 2;
                        int shalfheight = sheight / 2;
                        int sXcentroid = myRectangle.X + shalfwidth;
                        int sYcentroid = myRectangle.Y + shalfheight;
                        if (sXcentroid >= fXcenter) { dx = sXcentroid - fXcenter; } else { dx = fXcenter - sXcentroid; }
                        if (sYcentroid >= fYcenter) { dy = sYcentroid - fYcenter; } else { dy = fXcenter - sYcentroid; }
                        string caption = "Center point: (" + sXcentroid + "," + sYcentroid + ")";
                        string caption2 = "Dist from center: (" + dx + "," + dy + ")";

                        Emgu.CV.CvInvoke.Rectangle(myFrame, myRectangle, new Emgu.CV.Structure.Bgr(Color.Red).MCvScalar, 2);
                        Emgu.CV.CvInvoke.PutText(myFrame, caption, new System.Drawing.Point(10, 20), Emgu.CV.CvEnum.FontFace.HersheyComplex, .5, new Emgu.CV.Structure.Bgr(0, 255, 0).MCvScalar);
                        Emgu.CV.CvInvoke.PutText(myFrame, caption2, new System.Drawing.Point(10, 35), Emgu.CV.CvEnum.FontFace.HersheyComplex, .5, new Emgu.CV.Structure.Bgr(0, 255, 0).MCvScalar);
                        Point start = new Point(fXcenter, fYcenter);
                        Point end = new Point(sXcentroid, sYcentroid);

                        Emgu.CV.Structure.LineSegment2D line = new Emgu.CV.Structure.LineSegment2D(start, end);
                        Emgu.CV.CvInvoke.Line(myFrame, start, end, new Emgu.CV.Structure.Bgr(0, 255, 0).MCvScalar, 2, new Emgu.CV.CvEnum.LineType(), 0);
                        string caption3 = "Line length: " + line.Length.ToString();
                        Emgu.CV.CvInvoke.PutText(myFrame, caption3, new System.Drawing.Point(10, 50), Emgu.CV.CvEnum.FontFace.HersheyComplex, .5, new Emgu.CV.Structure.Bgr(0, 255, 0).MCvScalar);

                    }
                    viewer.Image = myFrame;
                };
                viewer.Text = "Tracker";
                viewer.ShowDialog();
            }
        }
    }

Все в коде работает, кроме утечки памяти.

...