digitalbits Ответов: 0

Утечка памяти эмгу я думаю


Хорошо, я совершенно новичок в 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

Хорошо, я сделал небольшое улучшение. Я обнаружил, что удаление части клона на переменном изображении Грея остановило утечку памяти, выходящую из-под контроля. Утечка памяти все еще существует, но теперь она гораздо менее серьезна. Я все еще пытаюсь углубиться в пробельм.

0 Ответов