gpt4 book ai didi

c++ - cvLoadImage 函数中的内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-03 22:15:31 26 4
gpt4 key购买 nike

我在 pictureBox 中制作了一个强度计。为了制作这个强度计,我使用了一张图片作为 Dialer(Dialer.bmp) 并使用一条线制作针。我正在使用 openCV 执行此操作。并更改指针指针,我们在表单加载时创建了一个线程。而代码如下

private: System::Void FocusExposure_Load(System::Object^  sender, System::EventArgs^  e) {
if(ExposureThreadStatus)
th->Abort();
th = gcnew Thread(gcnew ThreadStart(this,&FocusExposure::UpdateIntensity));
th->Start();
ExposureThreadStatus = true;
}


void UpdateIntensity()
{
Intensity_Values data;
while(1)
{

data = ReadImage(focusBuffer);
System::Drawing::Bitmap ^bmp=drawImageMeter(data.Max);
this->pictureBox1->Image =this->pictureBox1->Image->FromHbitmap(bmp->GetHbitmap());
delete bmp;
Sleep(1000);
}
}

System::Drawing::Bitmap^ drawImageMeter(float intensity_value)
{
IplImage *Background =cvLoadImage("Dialer.bmp", 1);
int width,height;
if(counter==1)
{
width=Background->width;
height=Background->height;
counter++;
needle_center.x=width/2;
needle_center.y=height/2;
needle_top.x=needle_center.x;
needle_top.y=needle_center.y-140;
}
double const PI = 3.14159265358979323;
int x1 = needle_top.x;
int y1 = needle_top.y;
int x0=needle_center.x;
int y0=needle_center.y;
float angle;
CurrIntensity = intensity_value;
angle = CurrIntensity-PreIntensity;
angle= 0.0703125f * angle;
// degrees, not radians
float radians = angle * (PI / 180.0f); // convert degrees to radians

if (current_max==1)
{
current_max++;
int N1x1 = needle_top.x;
int N1y1 = needle_top.y;
needle1_top.x = ((N1x1-x0) * cos(radians)) - ((N1y1-y0) * sin(radians)) + x0;
needle1_top.y = ((N1x1-x0) * sin(radians)) + ((N1y1-y0) * cos(radians)) + y0;
}
needle_top.x = ((x1-x0) * cos(radians)) - ((y1-y0) * sin(radians)) + x0;
needle_top.y = ((x1-x0) * sin(radians)) + ((y1-y0) * cos(radians)) + y0;

cvLine(Background, needle_center, needle1_top, CV_RGB(0, 0, 255), 1, 4, 0);
cvLine(Background, needle_center, needle_top, CV_RGB(255, 0, 0), 1, 4, 0);
System::Drawing::Bitmap ^bmp = gcnew System::Drawing::Bitmap(Background->width,Background->height,Background->widthStep,System::Drawing::Imaging::PixelFormat::Format24bppRgb,(System::IntPtr)Background->imageData);
PreIntensity = CurrIntensity;
return bmp;

}

此代码运行良好,并根据我的要求提供输出。但唯一的问题是,当我打开表单时,它会导致内存泄漏。我在任务管理器中看到过,也使用过 Intel Vtune 分析器。此探查器在以下行显示不匹配的分配/取消分配

IplImage *Background =cvLoadImage("Dialer.bmp", 1);

我们需要重新加载此图像,因为我们正在图像上画线,当指针指针发生变化时,它需要没有针的拨号器图像。

任何人都可以建议我解决此内存泄漏问题的任何解决方案。

我们将不胜感激。

最佳答案

drawImageMeter() 似乎被调用了不止一次。问题是每次执行 cvLoadImage() 时,它都会在 HEAP 上为像素分配空间。因此,在显示图像后,您应该使用 cvReleaseImage() 释放它,以便释放数据。

一个快速而肮脏(和可怕)的修复是 make the variablestatic :

static IplImage* Background =cvLoadImage("Dialer.bmp", 1);

但是您确实应该更改应用程序的设计,以便背景它只分配一次。为此,您可以将其设置为全局变量并将其加载到 main() 方法中,或者将其设置为 drawImageMeter() 的参数:

System::Drawing::Bitmap^ drawImageMeter(IplImage* Background, float intensity_value)
{
// code
}

关于c++ - cvLoadImage 函数中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12576825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com