#c# #opencv #image-processing #computer-vision
Вопрос:
Я использую OpenCvSharp для захвата и смешивания видео. У меня проблема с утечкой памяти. Хотя я избавился от всего, но я наблюдал постоянное увеличение памяти. У вас есть какие-либо предложения по этой проблеме. Огромное спасибо.
while (videoStreamFlag)
{
if(startFlag)
{
try
{
capture2.Read(image2);
capture.Read(image);
if (image.Empty() || image2.Empty())
{
videoStreamFlag = false;
break;
}
if (bitimg != null)
bitimg.Dispose();
bitimg = new Bitmap(image.Width, image.Height, ((image.Width * 3 3) / 4) * 4, PixelFormat.Format24bppRgb, image.Data);
if (result != null)
result.Dispose();
result = new Bitmap(bitimg.Width, bitimg.Height);
using (var g = Graphics.FromImage(result))
{
g.DrawImageUnscaled(bitimg, 0, 0);
if (bitimg != null)
bitimg.Dispose();
bitimg = new Bitmap(image2.Width, image2.Height, ((image2.Width * 3 3) / 4) * 4, PixelFormat.Format24bppRgb, image2.Data);
bitimg = SetImageOpacity(bitimg, Opacity / 100f);
g.DrawImageUnscaled(bitimg, 0, 0);
if (pictureBox.Image != null)
panel.Invoke(new MethodInvoker(delegate () { pictureBox.Image.Dispose(); }));
Thread.Sleep(1);
pictureBox.Image = resu<
Thread.Sleep(1);
}
}
catch (Exception ex)
{
Console.WriteLine("[ERROR!!!]VideoBlending Error...{0}", ex.Message);
videoStreamFlag = false;
}
}
}
введите описание изображения здесь
Комментарии:
1.
panel.Invoke(new MethodInvoker(delegate () { result.Dispose(); })); result = new Bitmap(bitimg.Width, bitimg.Height);
очевидно, что это не имеет смысла (и является причиной утечки памяти), потому что вы всегда вызываете dispose в текущийresult
… под текущим я имею в виду во время вызоваresult.Dispose()
, а не во времяpanel.Invoke
и нет, это не одно и то же время2. @Selvin я использовал
result.Dispose()
сначала, но я столкнулся с той же проблемой.