封装opencv的函数,形成自己的dll文件,调试(debug+release)正确,运行(ctrl+f5)内存溢出
问题描述:
封装opencv的函数,形成自己的dll文件,GOImage.dll.并且以函数的形式开放接口。在该函数中,主要是对读取的一系列图片数据进行特征识别、对准、融合操作。最终此dll以非托管的形式被 csharp程序调用,输入待拼接的图片地址,并在指定的位置生成结果图片。
在vs环境下进行调试(F5),无论debug还是 release模式,都可以正常运行,没有问题。然而单独运行程序的过程中(ctrl +F5),则会发生内存不断增大的现象。为了方便说明问题,我重新生成一个简单的函数,该函数的唯一作用就是读取图片到vector组中。
DllExport int imageprocesstest( char *cur_dir,char *imagepath_res, int isstraighten)
{
char DllBuff[50];
vector<Mat> inputmat;
Mat src;
for (int i = 1;i<=12;i++) //执行D全?部?文?件t的?遍历
{
if (i<10)
{
sprintf(DllBuff, "%s\\image00000%d.jpg" ,cur_dir,i);
}
else
{
sprintf(DllBuff, "%s\\image0000%d.jpg" ,cur_dir,i);
}
src= cv::imread(DllBuff,CV_LOAD_IMAGE_COLOR);
if (!src.data)
{
inputmat.clear();
return 1;
}
inputmat.push_back(src); //将?读取?的?结果?压1入?inutmat
}
// vector<Mat> (inputmat).swap(inputmat);
return 0;
}
及时对于此函数,也会存在上面一样的情况,同时在vs中以F5调试的时候,不会出现内存溢出(每隔一段时间vs会自动清除内存),而以ctrl+F5的模式则会出现溢出的情况
为了解决这个问题,我做了很多摸索。比较靠谱的是两条线路,一条是从csharp调用这个方面来考虑,为什么在F5的模式下能够成功调用,至少说明有一种模式能够解决这个问题(我认为有可能是和appdomin相关的,具体的需要继续去查一查F5和ctrl +F5的区别)我探索过的方法包括动态绑定、销毁;dymanticmethod;生成clr类;已经实现idisable接口等;另一条思路是从dll文件那个部分考虑的,即如何以在dll中就将对象销毁掉,其中比较有突破性的是vector的swap方法。
但是以上的方法都不能很好地解决现有问题。到目前为止,唯一看到的正确执行的就是vs的F5。
或者哪位知道f5的时候发生了什么,ctrl+f5的时候有什么不同,也请告诉我。感谢。
再或者,如果采用DynamicMethod+Delegate的方法是否可以解决,有无高手指教,ganx