Я создал программу, которая позволяет отслеживать объекты с помощью движка 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();
}
}
}
}
Я хочу иметь возможность постоянно открывать и закрывать окно просмотра изображений / отслеживания движения без сбоев.