Утечка памяти эмгу я думаю
Хорошо, я совершенно новичок в C#, так что это будет большим фактором в попытке исправить эту проблему. В настоящее время я использую emgu для обнаружения лиц в списке из 100 фотографий, а затем сохраняю все лица. Более крупный проект будет состоять в том, чтобы использовать веб-камеру и посмотреть, существует ли человек в папке "сохраненные лица".
Когда я бегу по списку, моя память заполняется и иногда дает сбой, так что я застрял на этом месте. Вот мой код ниже, которому я следовал в некоторых учебниках.
Я считаю, что проблема заключается в прямоугольном массиве граней с DetectMultiScale. Я не знаю, как использовать оператор "using" для массива rectangle. Или я смотрю не в то место?
Форматирование в приведенном ниже коде может выглядеть неправильно, поскольку я удалил большую часть своих комментариев, которые использую для личного протоколирования происходящего.
Что я уже пробовал:
while (ListInput.Items.Count > 0) { string s = ListInput.Items[0] as string; // do something with s //load the image _camImage = new Image<Bgr, byte>(s); imgCam2.Image = _camImage; pictureBox1.Image = null; pictureBox1.Image = _camImage.Bitmap; //load the picture box too //prep for facial detection var imgGray = _camImage.Convert<Gray, byte>().Clone(); //create an array of rectangles of faces detected Rectangle[] faces = classifierFace.DetectMultiScale(imgGray, 1.02, 5); Image<Gray, byte> TrainedFace = null; string imgPath = imgLocation + "Faces\\"; Int32 Y = 1; //dont use X it is being used for the progress bar lblStatus.Text = "Detecting Faces....."; foreach (var Face in faces) { //can I get the faces ? TrainedFace = _camImage.Copy(Face).Convert<Gray, byte>(); TrainedFace = TrainedFace.Resize(100, 100, Emgu.CV.CvEnum.Inter.Cubic); //draw the box around the face now _camImage.Draw(Face, new Bgr(0, 0, 255), 8); //display the face imageBoxFace.Image = null; imageBoxFace.Image = TrainedFace; //try and save it //Bitmap Fbmp = new Bitmap(100, 100); //imageBoxFace.DrawToBitmap(Fbmp, new Rectangle(0, 0, 100, 100)); //Fbmp.Save(imgPath + imgNum + "_" + Y + ".jpg", ImageFormat.Jpeg); imageBoxFace.Image.Save(imgPath + imgNum + "_" + Y + ".jpg"); //imageBoxFace. imageBoxFace.Image = null; Y = Y + 1; } //faces = null; //still not fixed //pictureBox1.Image = _camImage.Bitmap; lblStatus.Text = "Finished Detection: " + (Y - 1) + " faces detected."; // I might need to dispose the resources if (TrainedFace != null ) { TrainedFace.Dispose(); } _camImage.Dispose(); imgGray.Dispose(); //how do I dispose of faces/ GC.Collect(); //classifierFace.Dispose(); //this is new it doesNOT work //finished with the facial detection save the image to the appropriate location ImageName = imgLocation + imgPrefix + imgNum + imgSuffix; if (CopyVsMove == true) // we want to copy not delete { File.Copy(s, ImageName); } else { File.Move(s, ImageName); } //if we are going to resize we should do it here //take care of the numbering and reset if I have to //depends on the options imgNum = imgNum + 1; if (lblNumbering.Text == "Ranged Numbering") { if (imgNum > imgTo) { //set the number back to the low number imgNum = imgFrom; } } //save the next rover number Rewrite_Rover_Number(imgNum); //Rinse and repeat until we get to zero }
digitalbits
Хорошо, я сделал небольшое улучшение. Я обнаружил, что удаление части клона на переменном изображении Грея остановило утечку памяти, выходящую из-под контроля. Утечка памяти все еще существует, но теперь она гораздо менее серьезна. Я все еще пытаюсь углубиться в пробельм.